微信公众号:winter分享汇
如有问题或建议,请公众号留言
从微博motan看rpc基于netty4远程通讯设计1-服务端
本系列文章-连载中
从微博motan看rpc基于netty4远程通讯设计1-服务端
从微博motan看rpc基于netty4远程通讯设计2-客户端
从微博motan看rpc基于netty4远程通讯设计3-业务线程模型设计
从微博motan看rpc基于netty4远程通讯设计4-同步异步返回结果处理
从微博motan看rpc基于netty4远程通讯设计5-协议编解码与序列化
服务端设计细节
服务端类图
图注:server类图
Channel接口抽象了客户端与服务端的核心方法:
open() 客户端的建立连接或者服务端的启动服务
close() 关闭客户端连接或服务器
isClosed() 节点是否关闭(来源ChannelState枚举)
isAvailable 节点是否可用(来源ChannelState枚举)
Endpoint接口 没有提供方法,实现此接口说明是终端(服务端或客户端)
Server接口 声明是服务端,提供以下方法:
isBound() netty server channel 是否可用
AbstractServer 主要初始化URL(服务端初始化所需参数),根据SPI机制选择对应的协议编解码实现
NettyServer 是服务端的具体实现,open() 启动服务主要做了以下事情:
创建StandardThreadExecutor线程池,初始化线程个数为核心线程池大小
创建NettyServerChannelManage管理客户端连接,继承ChannelInboundHandlerAdapter类,重写channelRegistered(ChannelHandlerContext ctx)方法,当客户端连接,判断是否超过最大连接数,超过则关闭,没有则放入map缓存起来(key为remote address + local address )
客户端连接关闭则从缓存中移除
创建NettyDecoder解码器
创建NettyEncoder编码器
创建NettyChannelHandler,继承ChannelDuplexHandler
重写channelRead(final ChannelHandlerContext ctx, final Object msg)方法,
接收到消息后,生成任务丢给业务线程池StandardThreadExecutor处理,
任务把消息反序列化后,判断是否是request请求对象即判断是否是客户端的请求消息还是服务器的响应消息,因为客户端跟服务器用的都是NettyChannelHandler类
调用messageHandler.handle(channel, request)完成本地业务方法调用,把返回值回写响应客户端
启动服务,完成socket端口绑定,设置状态为可用状态
下一篇:从微博motan看rpc基于netty4远程通讯设计2-客户端
下面的是我的公众号二维码图片,欢迎关注我。
图注:winter分享汇
领取专属 10元无门槛券
私享最新 技术干货