阅读本文大概需要 28 分钟。
![3cd145d7-1bad-4740-ab97-5615b04e03c5 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![a1c7ca52-390c-497a-964e-143e980963f7 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![40907776-cbc0-4888-9c94-6f4e28fbdec2 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![bb0a0099-2e12-4191-be8a-1d4c031552be 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![f9b580f9-bd49-4dd0-b9e7-742e63f6276f 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![a1f0cd86-ac4d-45a7-b79f-20c8dba93fed 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![a1cfac00-7f70-4183-a57e-becbb95ac9e1 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![fd5757c1-63dd-4c8b-a28d-24c9c4b88fe9 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![be24597e-daed-4c17-bad8-7c78bd29bc63 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![98e12d4a-8932-4bd6-a2d0-420484b271e4 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![e7c0174d-2858-40e7-a103-462879edc247 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![78f8dee2-8f31-4a91-b1e1-99b1bd3d4950 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![1b082d53-92e8-4fea-8fa3-420d80d3a5c0 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![e7876f6b-6221-4a28-9e57-2582a8d8e07e 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![fb267adc-dec0-4f36-9d35-055d0d960f0e 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![fe66f758-317f-456a-8ba0-1d83fcdc188d 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![62e323ee-003a-4aa2-a995-28649b91a5c8 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![75ddab25-f90a-45c7-bf11-d456fc6f1489 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![3c1d4c35-e7cd-4897-925e-760c2eed0521 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![32c59e26-a4ef-4c46-b192-8985c8fa5142 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![938a5b17-bc55-45cb-be25-87a3b550e824 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">public</span> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">class</span> NettyServer {</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">/**</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * 服务端带参构造</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * @param serverAddress</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * @param serviceRegistry</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * @param serverBeans</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> */</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">public</span> NettyServer(<span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">String</span> serverAddress, ServerRegistry serviceRegistry, Map<<span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">String</span>, <span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">Object</span>> serverBeans) {</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">this</span>.serverAddress = serverAddress;</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">this</span>.serviceRegistry = serviceRegistry;</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">this</span>.serverBeans = serverBeans;</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> }</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">/**</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * 日志记录</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> */</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">private</span> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">static</span> final Logger logger = LoggerFactory.getLogger(NettyServer.class);</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">/**</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * 服务端绑定地址</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> */</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">private</span> <span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">String</span> serverAddress;</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">/**</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * 服务注册</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> */</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">private</span> ServerRegistry serviceRegistry;</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">/**</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * 服务端加载的bean列表</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> */</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">private</span> Map<<span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">String</span>, <span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">Object</span>> serverBeans;</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">/**</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * 主事件池</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> */</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">private</span> EventLoopGroup bossGroup = <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> NioEventLoopGroup();</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">/**</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * 副事件池</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> */</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">private</span> EventLoopGroup workerGroup = <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> NioEventLoopGroup();</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">/**</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * 服务端通道</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> */</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">private</span> Channel serverChannel;</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">/**</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * 绑定本机监听</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> *</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * @throws Exception</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> */</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">public</span> <span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">void</span> bind() throws Exception {</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//启动器</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> ServerBootstrap serverBootstrap = <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> ServerBootstrap();</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//为Acceptor设置事件池,为客户端接收设置事件池</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> serverBootstrap.group(bossGroup, workerGroup)</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//工厂模式,创建NioServerSocketChannel类对象</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> .channel(NioServerSocketChannel.class)</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//等待队列大小</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> .option(ChannelOption.SO_BACKLOG, <span class="code-snippet__number" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">100</span>)</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//地址复用</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> .option(ChannelOption.SO_REUSEADDR, <span class="code-snippet__literal" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">true</span>)</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//开启Nagle算法,</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//网络好的时候:对响应要求比较高的业务,不建议开启,比如玩游戏,键盘数据,鼠标响应等,需要实时呈现;</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">// 对响应比较低的业务,建议开启,可以有效减少小数据包传输。</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//网络差的时候:不建议开启,否则会导致整体效果更差。</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> .option(ChannelOption.TCP_NODELAY, <span class="code-snippet__literal" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">true</span>)</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//日志记录组件的level</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> .handler(<span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> LoggingHandler(LogLevel.INFO))</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//各种业务处理handler</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> .childHandler(<span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> ChannelInitializer<SocketChannel>() {</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__meta" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">@Override</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">protected</span> <span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">void</span> initChannel(SocketChannel channel) throws Exception {</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//空闲检测handler,用于检测通道空闲状态</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> channel.pipeline().addLast(<span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">"idleStateHandler"</span>, <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> IdleStateHandler(<span class="code-snippet__number" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">45</span>, <span class="code-snippet__number" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">45</span>, <span class="code-snippet__number" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">120</span>));</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//编码器</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> channel.pipeline().addLast(<span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">"nettyMessageDecoder"</span>, <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> NettyMessageDecoder(<span class="code-snippet__number" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">1024</span>, <span class="code-snippet__number" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">4</span>, <span class="code-snippet__number" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">4</span>));</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//解码器</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> channel.pipeline().addLast(<span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">"nettyMessageEncoder"</span>, <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> NettyMessageEncoder());</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//心跳包业务处理,一般需要配置idleStateHandler一起使用</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> channel.pipeline().addLast(<span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">"heartBeatHandler"</span>, <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> HeartBeatResponseHandler());</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//服务端先进行鉴权,然后处理业务</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> channel.pipeline().addLast(<span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">"loginAuthResponseHandler"</span>, <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> LoginAuthResponseHandler());</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//业务处理handler</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> channel.pipeline().addLast(<span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">"nettyHandler"</span>, <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">new</span> ServerHandler(serverBeans));</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> }</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> });</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//获取ip和端口</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">String</span>[] array = serverAddress.split(<span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">":"</span>);</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">String</span> host = array[<span class="code-snippet__number" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">0</span>];</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> int port = Integer.parseInt(array[<span class="code-snippet__number" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">1</span>]);</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//绑定端口,同步等待成功</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> ChannelFuture future = serverBootstrap.bind(host, port).sync();</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//注册连接事件监听器</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> future.addListener(cfl -> {</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">if</span> (cfl.isSuccess()) {</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> logger.info(<span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">"服务端["</span> + host + <span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">":"</span> + port + <span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">"]已上线..."</span>);</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> serverChannel = future.channel();</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> }</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> });</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//注册关闭事件监听器</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> future.channel().closeFuture().addListener(cfl -> {</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//关闭服务端</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> close();</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> logger.info(<span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">"服务端["</span> + host + <span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">":"</span> + port + <span class="code-snippet__string" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">"]已下线..."</span>);</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> });</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//注册服务地址</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">if</span> (serviceRegistry != <span class="code-snippet__literal" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">null</span>) {</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> serviceRegistry.register(serverBeans.keySet(), host, port);</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> }</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> }</span>
<span class="code-snippet_outer">
</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">/**</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> * 关闭server</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"><span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> */</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">public</span> <span class="code-snippet__built_in" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">void</span> close() {</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//关闭套接字</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">if</span>(serverChannel!=<span class="code-snippet__literal" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">null</span>){</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> serverChannel.close();</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> }</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//关闭主线程组</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">if</span> (bossGroup != <span class="code-snippet__literal" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">null</span>) {</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> bossGroup.shutdownGracefully();</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> }</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__comment" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">//关闭副线程组</span></span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> <span class="code-snippet__keyword" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">if</span> (workerGroup != <span class="code-snippet__literal" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">null</span>) {</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> workerGroup.shutdownGracefully();</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> }</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> }</span>
<span class="code-snippet_outer" style="max-width: 1000%; box-sizing: border-box !important; overflow-wrap: break-word !important;">}</span>
<span class="code-snippet_outer">
</span>
![5ca2ea97-bcac-45bb-8c22-49ca6599a2c3 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
<span class="code-snippet_outer"><span class="code-snippet__keyword">public</span> <span class="code-snippet__keyword">class</span> <span class="code-snippet__title">NettyClient</span> { <span class="code-snippet__comment">/** * 日志记录 */</span> <span class="code-snippet__keyword">private</span> <span class="code-snippet__keyword">static</span> final Logger logger = LoggerFactory.getLogger(NettyClient.class); <span class="code-snippet__comment">/** * 客户端请求Future列表 */</span> <span class="code-snippet__keyword">private</span> Map<String, TinyWhaleFuture> clientFutures = <span class="code-snippet__keyword">new</span> ConcurrentHashMap<>(); <span class="code-snippet__comment">/** * 客户端业务处理handler */</span> <span class="code-snippet__keyword">private</span> ClientHandler clientHandler = <span class="code-snippet__keyword">new</span> ClientHandler(clientFutures); <span class="code-snippet__comment">/** * 事件池 */</span> <span class="code-snippet__keyword">private</span> EventLoopGroup <span class="code-snippet__keyword">group</span> = <span class="code-snippet__keyword">new</span> NioEventLoopGroup(); <span class="code-snippet__comment">/** * 启动器 */</span> <span class="code-snippet__keyword">private</span> Bootstrap bootstrap = <span class="code-snippet__keyword">new</span> Bootstrap(); <span class="code-snippet__comment">/** * 客户端通道 */</span> <span class="code-snippet__keyword">private</span> Channel clientChannel; <span class="code-snippet__comment">/** * 客户端连接 * @param host * @param port * @throws InterruptedException */</span> <span class="code-snippet__function"><span class="code-snippet__keyword">public</span> <span class="code-snippet__title">NettyClient</span>(<span class="code-snippet__params">String host, <span class="code-snippet__keyword">int</span> port</span>) throws InterruptedException</span> { bootstrap.<span class="code-snippet__keyword">group</span>(<span class="code-snippet__keyword">group</span>) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, <span class="code-snippet__literal">true</span>) .handler(<span class="code-snippet__keyword">new</span> ChannelInitializer<SocketChannel>() { @<span class="code-snippet__function">Override <span class="code-snippet__keyword">protected</span> <span class="code-snippet__keyword">void</span> <span class="code-snippet__title">initChannel</span>(<span class="code-snippet__params">SocketChannel channel</span>) throws Exception</span> { <span class="code-snippet__comment">//通道空闲检测 channel.pipeline().addLast("idleStateHandler", new IdleStateHandler(45, 45, 120)); //解码器 channel.pipeline().addLast("nettyMessageDecoder", new NettyMessageDecoder(1024 * 1024, 4, 4)); //编码器 channel.pipeline().addLast("nettyMessageEncoder", new NettyMessageEncoder()); //心跳处理 channel.pipeline().addLast("heartBeatHandler", new HeartBeatRequestHandler()); //业务处理 channel.pipeline().addLast("clientHandler", clientHandler); //鉴权处理 channel.pipeline().addLast("loginAuthHandler", new LoginAuthRequestHandler()); } }); //发起同步连接操作 ChannelFuture channelFuture = bootstrap.connect(host, port); //注册连接事件 channelFuture.addListener((ChannelFutureListener)future -> { //如果连接成功 if (future.isSuccess()) { logger.info("客户端[" + channelFuture.channel().localAddress().toString() + "]已连接..."); clientChannel = channelFuture.channel(); } //如果连接失败,尝试重新连接 else{ logger.info("客户端[" + channelFuture.channel().localAddress().toString() + "]连接失败,重新连接中..."); future.channel().close(); bootstrap.connect(host, port); } }); //注册关闭事件 channelFuture.channel().closeFuture().addListener(cfl -> { close(); logger.info("客户端[" + channelFuture.channel().localAddress().toString() + "]已断开..."); }); } /** * 客户端关闭 */ private void close() { //关闭客户端套接字 if(clientChannel!=null){ clientChannel.close(); } //关闭客户端线程组 if (group != null) { group.shutdownGracefully(); } } /** * 客户端发送消息,将获取的Future句柄保存到clientFutures列表 * @return * @throws InterruptedException * @throws ExecutionException */ public TinyWhaleFuture send(NettyMessage<NettyRequest> request) { TinyWhaleFuture rpcFuture = new TinyWhaleFuture(request); rpcFuture.addCallback(new TinyWhaleAsyncCallback() { @Override public void success(Object result) { } @Override public void fail(Exception e) { logger.error("发送失败", e); } }); clientFutures.put(request.getBody().getRequestId(), rpcFuture); clientHandler.sendMessage(request); return rpcFuture; }}</span></span>
![e0387579-7276-4d74-bd83-31c1d974ede2 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![4b2d29fd-55fa-4159-873c-0a9ea9cd553a 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![677e5ed7-63f4-4e75-a7bd-763304e1dcd4 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![9d017228-d265-4b58-b735-9618856758a5 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![2974eedd-4e1c-46c0-96a7-1735a4ad1916 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![50149181-14be-4cce-9fdc-1393e0cd70b3 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![33f8e329-fe57-4223-8fb9-8e61865ce163 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![1bbffe83-acca-4c28-962b-20c9ea286b3a 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![8074c8cc-fb0c-44ca-9941-95ba65d32c19 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![44220ee6-9d3b-44af-b06f-546ea2771065 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![43f13e2c-9f5e-4bd5-89a9-8998f9f92923 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![6db1acf2-c315-48a9-b11a-599193ee965b 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![92cd52ab-0d2d-44ec-960a-0cbd383eb652 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![f3915660-1dbe-4346-9fb8-e2592e58be9c 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![9fc58dcf-bcd2-4458-96b3-080c7ad5a66a 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![c04f7664-506d-470b-b2cd-56d1d934ae6a 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![a3e6bb50-4421-43c6-be3b-413cec9424f8 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![3acc13f4-28cc-4de4-965d-336074b6a6f5 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![00ff2b8e-0261-4cc4-896e-ab7ea42ee7a1 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![068cefb2-70c4-44ac-8176-17e7d7b48963 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![57981f83-d3a9-429b-a956-75c7ab4a8861 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![2f6f67b2-4a52-4d78-b235-c9381fe23cdf 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![b2eca78b-c48b-4a06-b5f3-a5b7b3b81da7 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![ee8a82c9-902e-4d54-9b8f-2ee0727ceabf 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![d7498e9b-8f60-4d72-b52b-7596b126c8f6 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![57366a4e-c94a-41b7-a8dc-9224f7c71654 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![0f003fc7-3e98-4488-8037-6bf5dc50c02a 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![a5b71565-ff20-4f5f-bafb-d4271f48a0c0 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
![71bc7cea-5640-411b-a8a9-a75ac57ce63f 微言Netty:手写分布式服务框架](http://www.cxyroad.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
推荐阅读:
微信扫描二维码,关注我的公众号
朕已阅
文章收集整理于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除,如若转载,请注明出处:http://www.cxyroad.com/1485.html