netty服务端设计,适用于app、游戏等场景

components.png

一、系统目标

使用netty搭建tcp服务器,支持长连接,短连接模式。

使用protobuf作为主要的数据编码手段

将数据传输隐藏在框架内,使得业务开发人员可直接关注业务实现,无需关注通信,甚至无需关心多线程问题。

可扩展的架构,方便接入其他中间件。

将编码任务简单化。

二、系统分层

Class Diagram.png

2.1 通信层

绝大部分的功能,netty已经支持了。

2.1.1 通信协议

服务器在收到数据之后,需要进行如下的过滤判断:
a、数据是否合法
b、数据版本是否支持
c、如何解析客户端数据,客户端数据类型是什么
d、客户端期望服务端提供什么服务

数据包具体协议设计如下:

长度(4字节)| 时间戳(4字节) | 版本 (2字节) | 服务id (2字节)| 数据(不定长)| 校验码(2字节)

2.1.2 Mapping

由上述协议传输的数据中的服务id,具体对应到哪个类的哪个方法执行
上传数据如何解析由方法参数决定
下发数据如何解析由方法返回值决定
如返回值为void,且方法中带异步回调参数,则一般为异步执行
如返回值不为void,则为同步执行。

服务id计算,(65536上限,一般应用足够了):
所有Controller的method列表,使用字典顺序排序的序号,并持久化序号和method的对应关系,新版本新的Controller的排序基数使用上个版本排序最大值。

2.1.3 通信用POJO

在网络层为protobuf生成,.proto文件,可以根据method方法参数生成。
具体规则为:
int Calc.add(int a,int b);
则生成

syntax = "proto3";
package com.project.net.pojo;
message CalcAdd{
  int32 a = 1;
  int32 b=2;
}

void Articals.add(Artical a);

syntax = "proto3";
package com.project.net.pojo;
message ArticalsAdd{
  //Artical字段
}

不支持Map或List<Map>作为参数

返回值规则:
返回值为简单型,则可使用通用的.proto文件

message IntResult{
  int32 result =1 ;
}
message StringResult{
  string result = 1;
}

客户端解析规则:
在程序内内置服务id和.proto的对应关系,并可在线更新或整体更新。

2.2 线程管理

可配置使用额外的线程管理,或是直接使用netty自己的工作线程。

额外的线程管理,设计如下:

2.2.1 逻辑线程

有必要将逻辑线程和工作线程分开
a、逻辑线程为单线程,整个服务器单元只有一个逻辑线程
b、原则上,逻辑线程只处理逻辑,不做重度任务处理
c、如涉及长时间任务,将任务投递到工作线程上。
优点:无线程安全问题,可放心大胆使用hashmap、hashset等数据结构。

2.2.2 任务线程

a、处理重任务,如数据库操作等
b、非线程安全,原则上不存放线程共享数据
c、框架应提供齐全的工具类以规避线程安全问题,保证在开发人员水平参差不齐的情况下仍然不影响业务逻辑的开发。
d、将缩小异常范围,以减少对整个系统的损害。
e、提供线程退出机制。

2.2.3 任务队列

上述任务线程的共享的队列。

2.2.4 异步回调机制

在工作线程中做完任务之后,可以将结果投递逻辑线程
也可以直接与客户端通信,并主动关闭连接。

2.3. Controller层

设计思路可以参考spring mvc。或直接整合spring、jfinal等框架(待研究)。

2.3.1 java class

Controller可设计单例模式

2.3.2 method

可支持aop技术

2.3.3 参数解析、结果解析

参见2.1.3 节

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,392评论 11 349
  • 做业务的时候压力很大,尤其是要过年的时候,特别着急赚钱。为了刺激自己有激情,我们通常惯用的方法是逛街。 看各种东西...
    李晴天阅读 323评论 2 1
  • 我今天在家宅了一天,看了一部电影,《少年派的奇幻漂流》。这是刷第二遍了。在电视上看没有3D效果,不过我觉得这...
    smilingcharming阅读 354评论 1 2
  • 背景 我经常使用sublime去处理很多文件, 利用强大的正则表达式, 将一些日志以及excel文本进行格式化为特...
    一根弦的风筝阅读 96,878评论 5 18