亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

NettyServer與SpringBoot集成

U2FsdGVkX1x / 1335人閱讀

摘要:的非工程的會根據(jù)類路徑是否有來判斷是否是項目,也可以自己強制指定。添加依賴如果是多模塊的項目,由于子模塊已經(jīng)有了,所以只能把的放到子模塊的的文件上。

SpringBoot的非web工程

SpringBoot的AutoConfiguration會根據(jù)類路徑是否有servlet來判斷是否是web項目,也可以自己強制指定。

@SpringBootApplication
public class RpcServerApplication {

    public static void main(String[] args){
        SpringApplication app = new SpringApplication(RpcServerApplication.class);
        app.setWebEnvironment(false);
        app.run(args);
    }
}
添加依賴

如果是多模塊的項目,由于子模塊已經(jīng)有parent了,所以只能把spring boot的parent放到子模塊的parent的pom文件上。


    org.springframework.boot
    spring-boot-starter-parent
    1.3.3.RELEASE
     
  

    UTF-8
  

Spring IOC

        
        
            org.springframework.boot
            spring-boot-starter-actuator
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
在bean初始化之后啟動
@Component
//實現(xiàn)ApplicationContextAware以獲得ApplicationContext中的所有bean
public class NettyServer implements ApplicationContextAware {

    private static final Logger logger = LoggerFactory.getLogger(NettyServer.class);

    private Channel channel;
    private EventLoopGroup bossGroup;
    private EventLoopGroup workerGroup;

    private Map exportServiceMap = new HashMap();

    @Value("${rpcServer.host:127.0.0.1}")
    String host;

    @Value("${rpcServer.ioThreadNum:5}")
    int ioThreadNum;
    //內(nèi)核為此套接口排隊的最大連接個數(shù),對于給定的監(jiān)聽套接口,內(nèi)核要維護兩個隊列,未鏈接隊列和已連接隊列大小總和最大值

    @Value("${rpcServer.backlog:1024}")
    int backlog;

    @Value("${rpcServer.port:9090}")
    int port;

    /**
     * 啟動
     * @throws InterruptedException
     */
    @PostConstruct
    public void start() throws InterruptedException {
        logger.info("begin to start rpc server");
        bossGroup = new NioEventLoopGroup();
        workerGroup = new NioEventLoopGroup(ioThreadNum);

        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG, backlog)
                //注意是childOption
                .childOption(ChannelOption.SO_KEEPALIVE, true)
                .childOption(ChannelOption.TCP_NODELAY, true)
                .childHandler(new ChannelInitializer() {
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
                        socketChannel.pipeline()
                                //真實數(shù)據(jù)最大字節(jié)數(shù)為Integer.MAX_VALUE,解碼時自動去掉前面四個字節(jié)
                                //io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: readerIndex(900) + length(176) exceeds writerIndex(1024): UnpooledUnsafeDirectByteBuf(ridx: 900, widx: 1024, cap: 1024)
                                .addLast("decoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4))
                                .addLast("encoder", new LengthFieldPrepender(4, false))
                                .addLast(new RpcDecoder(RpcRequest.class))
                                .addLast(new RpcEncoder(RpcResponse.class))
                                .addLast(new ServerRpcHandler(exportServiceMap));
                    }
                });

        channel = serverBootstrap.bind(host,port).sync().channel();

        logger.info("NettyRPC server listening on port " + port + " and ready for connections...");
    }

    @PreDestroy
    public void stop() {
        logger.info("destroy server resources");
        if (null == channel) {
            logger.error("server channel is null");
        }
        bossGroup.shutdownGracefully();
        workerGroup.shutdownGracefully();
        channel.closeFuture().syncUninterruptibly();
        bossGroup = null;
        workerGroup = null;
        channel = null;
    }

    /**
     * 利用此方法獲取spring ioc接管的所有bean
     * @param ctx
     * @throws BeansException
     */
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        Map serviceMap = ctx.getBeansWithAnnotation(ServiceExporter.class); // 獲取所有帶有 ServiceExporter 注解的 Spring Bean
        logger.info("獲取到所有的RPC服務:{}", serviceMap);
        if (serviceMap != null && serviceMap.size() > 0) {
            for (Object serviceBean : serviceMap.values()) {
                String interfaceName = serviceBean.getClass().getAnnotation(ServiceExporter.class)
                        .targetInterface()
                        .getName();
                logger.info("register service mapping:{}",interfaceName);
                exportServiceMap.put(interfaceName, serviceBean);
            }
        }
    }
}
工程netty-rpc

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/65765.html

相關(guān)文章

  • Dubbo 源碼分析11 網(wǎng)絡(luò)通信篇NettyServer、HeaderExchangeServer

    摘要:線程組負責連接事件線程組負責事件代碼調(diào)用父類的構(gòu)造方法,主要初始化和代碼根據(jù)中的與端口,創(chuàng)建。當服務端向?qū)懭腠憫Y(jié)果時,首先編碼器會按照協(xié)議編碼成二進制流,供客戶端解碼。 NettyServer 1、private Map< String, Channel> channels:< ip:port, channel> 所...

    不知名網(wǎng)友 評論0 收藏0
  • 原理剖析(第 010 篇)Netty之服務端啟動工作原理分析(上)

    摘要:端引導類線程管理組線程管理組將設(shè)置到服務端引導類中指定通道類型為,一種異步模式,阻塞模式為設(shè)置讓服務器監(jiān)聽某個端口已等待客戶端連接。 原理剖析(第 010 篇)Netty之服務端啟動工作原理分析(上) - 一、大致介紹 1、Netty這個詞,對于熟悉并發(fā)的童鞋一點都不陌生,它是一個異步事件驅(qū)動型的網(wǎng)絡(luò)通信框架; 2、使用Netty不需要我們關(guān)注過多NIO的API操作,簡簡單單的使用即可...

    coordinate35 評論0 收藏0
  • SpringBootAngular2的集成

    摘要:背景以為啟動的框架,以為前端頁面的框架,最后需要將的代碼運行在內(nèi)置中。最終生成的包中也會包含這些內(nèi)容。本地啟動項目測試如果繼續(xù)使用的啟動方式函數(shù)運行,由于中并沒有的代碼,則不會正確看到頁面。解決辦法就是使用另一個插件,專門用于的命令。 背景 以springboot為tomcat啟動的框架,以angular2為前端頁面的框架,最后需要將angular2的代碼運行在springboot內(nèi)置...

    騫諱護 評論0 收藏0
  • 使用Protostuff序列化

    摘要:序調(diào)用,有多種序列化的方式,通用如,使用的方面的,比如默認的序列化,比如還有跨語言的,比如。所以也一直在尋找運行效率與開發(fā)效率兼得的序列化方式。偶爾在網(wǎng)上看到,覺得找到了一直在找的這種序列化方式。 序 rpc調(diào)用,有多種序列化的方式,通用如json,mongodb使用的bson;java方面的,比如Java默認的序列化,比如hessian;還有跨語言的,比如thrift、protoco...

    ephererid 評論0 收藏0
  • SpringBoot 1024行代碼 - 集成Logback

    前言 SpringBoot是一個全家桶,可以方便的集成各種開發(fā)工具。日志框架是一個在線應用必需的,本文介紹了當前主流日志框架Logback與SpringBoot的集成方法 準備工作 完成SpringBoot 1024行代碼 - Getting Started(一個簡單的web應用) 具體步驟 1. 添加Logback的配置文件logback-springboot.xml 其中文件名需要為logba...

    dailybird 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<