基于 DotNetty 实现一个接口自动发布工具 - 通信实现
基于 DotNetty 实现通信
DotNetty : 是微软的 Azure 团队,使用 C#实现的 Netty 的版本发布。是.NET 平台的优秀网络库。
项目介绍
OpenDeploy.Communication
类库项目,是通信相关基础设施层
Codec
模块实现编码解码
Convention
模块定义约定,比如抽象的业务 Handler, 消息载体NettyMessage
, 消息上下文 'NettyContext' 等
自定义消息格式
消息类为 NettyMessage
,封装了消息头 NettyHeader
和消息体 Body
NettyMessage
封装了消息头
NettyHeader
和消息体Body
NettyMessage 点击查看代码
NettyHeader
消息头,包含请求唯一标识,是否同步消息,终结点等, 在传输数据时会序列化为 JSON
NettyHeader 点击查看代码
请求消息唯一标识
RequestId
, 用来唯一标识消息, 主要用于 发送同步请求, 因为默认的消息是异步的,只管发出去,不需要等待响应
是否同步消息
Sync
, 可以不需要,主要为了可视化,便于调试
终结点
EndPoint
, (借鉴 MVC,约定为 Control/Action 模式), 服务端直接解析出对应的处理器
编码器
DefaultEncoder 点击查看代码
解码器
DefaultDecoder 点击查看代码
NettyServer 实现
NettyServer 点击查看代码
服务端管道最后我们添加了
ServerMessageEntry
,作为消息处理的入口
ServerMessageEntry 点击查看代码
按照约定, 把继承
AbstractNettyHandler
的类视为业务处理器
ServerMessageEntry
拿到消息后,首先把消息封装为NettyContext
, 类似与 MVC 中的 HttpContext, 封装了请求和响应对象, 内部解析请求的EndPoint
, 拆分为HandlerName
,ActionName
DefaultNettyHandlerSelector
提供注册处理器的方法RegisterHandlerTypes
, 和选择处理器的方法SelectHandler
SelectHandler
, 默认规则是查找已注册的处理器中以HandlerName
开头的类型
AbstractNettyHandler
的ProcessAsync
方法,通过ActionName
, 反射拿到MethodInfo
, 调用终结点
NettyClient 实现
NettyClient 点击查看代码
NettyClient
封装了 Netty 客户端逻辑,提供发送异步请求(默认)和发布同步请求方法
DotNetty
默认不提供同步请求,但是有些情况我们需要同步等待服务器的响应,所有需要自行实现,实现也很简单,把消息 ID 缓存起来,收到服务器响应后激活就行了,具体实现在消息同步器ClientMessageSynchronizer
, 就不贴了
总结
至此,我们实现了基于 DotNetty
搭建通信模块, 实现了客户端和服务器的编解码,处理器选择,客户端实现了同步消息等,大家可以在 ConsoleHost
结尾的控制台项目中,测试下同步和异步的消息,实现的简单的 Echo
模式
代码仓库
项目暂且就叫
OpenDeploy
吧
欢迎大家拍砖,Star
下一步
计划下一步,基于WPF
的客户端, 实现接口项目的配置与发现
文章转载自:Broadm
评论