首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从微博motan看rpc基于netty4远程通讯设计1-服务端

微信公众号: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分享汇

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180518G1SSR500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com