摘要:的非工程的會(huì)根據(jù)類路徑是否有來(lái)判斷是否是項(xiàng)目,也可以自己強(qiáng)制指定。添加依賴如果是多模塊的項(xiàng)目,由于子模塊已經(jīng)有了,所以只能把的放到子模塊的的文件上。
SpringBoot的非web工程
SpringBoot的AutoConfiguration會(huì)根據(jù)類路徑是否有servlet來(lái)判斷是否是web項(xiàng)目,也可以自己強(qiáng)制指定。
@SpringBootApplication public class RpcServerApplication { public static void main(String[] args){ SpringApplication app = new SpringApplication(RpcServerApplication.class); app.setWebEnvironment(false); app.run(args); } }添加依賴
如果是多模塊的項(xiàng)目,由于子模塊已經(jīng)有parent了,所以只能把spring boot的parent放到子模塊的parent的pom文件上。
org.springframework.boot spring-boot-starter-parent 1.3.3.RELEASE UTF-8
Spring IOC
在bean初始化之后啟動(dòng)org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-starter-test test
@Component //實(shí)現(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 MapexportServiceMap = new HashMap (); @Value("${rpcServer.host:127.0.0.1}") String host; @Value("${rpcServer.ioThreadNum:5}") int ioThreadNum; //內(nèi)核為此套接口排隊(duì)的最大連接個(gè)數(shù),對(duì)于給定的監(jiān)聽套接口,內(nèi)核要維護(hù)兩個(gè)隊(duì)列,未鏈接隊(duì)列和已連接隊(duì)列大小總和最大值 @Value("${rpcServer.backlog:1024}") int backlog; @Value("${rpcServer.port:9090}") int port; /** * 啟動(dòng) * @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í)數(shù)據(jù)最大字節(jié)數(shù)為Integer.MAX_VALUE,解碼時(shí)自動(dòng)去掉前面四個(gè)字節(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服務(wù):{}", 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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65765.html
摘要:線程組負(fù)責(zé)連接事件線程組負(fù)責(zé)事件代碼調(diào)用父類的構(gòu)造方法,主要初始化和代碼根據(jù)中的與端口,創(chuàng)建。當(dāng)服務(wù)端向?qū)懭腠憫?yīng)結(jié)果時(shí),首先編碼器會(huì)按照協(xié)議編碼成二進(jìn)制流,供客戶端解碼。 NettyServer 1、private Map< String, Channel> channels:< ip:port, channel> 所...
摘要:端引導(dǎo)類線程管理組線程管理組將設(shè)置到服務(wù)端引導(dǎo)類中指定通道類型為,一種異步模式,阻塞模式為設(shè)置讓服務(wù)器監(jiān)聽某個(gè)端口已等待客戶端連接。 原理剖析(第 010 篇)Netty之服務(wù)端啟動(dòng)工作原理分析(上) - 一、大致介紹 1、Netty這個(gè)詞,對(duì)于熟悉并發(fā)的童鞋一點(diǎn)都不陌生,它是一個(gè)異步事件驅(qū)動(dòng)型的網(wǎng)絡(luò)通信框架; 2、使用Netty不需要我們關(guān)注過(guò)多NIO的API操作,簡(jiǎn)簡(jiǎn)單單的使用即可...
摘要:背景以為啟動(dòng)的框架,以為前端頁(yè)面的框架,最后需要將的代碼運(yùn)行在內(nèi)置中。最終生成的包中也會(huì)包含這些內(nèi)容。本地啟動(dòng)項(xiàng)目測(cè)試如果繼續(xù)使用的啟動(dòng)方式函數(shù)運(yùn)行,由于中并沒有的代碼,則不會(huì)正確看到頁(yè)面。解決辦法就是使用另一個(gè)插件,專門用于的命令。 背景 以springboot為tomcat啟動(dòng)的框架,以angular2為前端頁(yè)面的框架,最后需要將angular2的代碼運(yùn)行在springboot內(nèi)置...
摘要:序調(diào)用,有多種序列化的方式,通用如,使用的方面的,比如默認(rèn)的序列化,比如還有跨語(yǔ)言的,比如。所以也一直在尋找運(yùn)行效率與開發(fā)效率兼得的序列化方式。偶爾在網(wǎng)上看到,覺得找到了一直在找的這種序列化方式。 序 rpc調(diào)用,有多種序列化的方式,通用如json,mongodb使用的bson;java方面的,比如Java默認(rèn)的序列化,比如hessian;還有跨語(yǔ)言的,比如thrift、protoco...
前言 SpringBoot是一個(gè)全家桶,可以方便的集成各種開發(fā)工具。日志框架是一個(gè)在線應(yīng)用必需的,本文介紹了當(dāng)前主流日志框架Logback與SpringBoot的集成方法 準(zhǔn)備工作 完成SpringBoot 1024行代碼 - Getting Started(一個(gè)簡(jiǎn)單的web應(yīng)用) 具體步驟 1. 添加Logback的配置文件logback-springboot.xml 其中文件名需要為logba...
閱讀 3329·2021-11-12 10:36
閱讀 2488·2021-11-02 14:43
閱讀 2162·2019-08-30 14:23
閱讀 3475·2019-08-30 13:08
閱讀 933·2019-08-28 18:09
閱讀 3149·2019-08-26 12:22
閱讀 3159·2019-08-23 18:24
閱讀 2028·2019-08-23 18:17