# springboot-netty **Repository Path**: wyloong/springboot-neety ## Basic Information - **Project Name**: springboot-netty - **Description**: springboot集成netty最佳实战 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 14 - **Forks**: 4 - **Created**: 2021-07-13 - **Last Updated**: 2025-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # springboot集成netty最佳实战 [![JDK-Version](https://img.shields.io/badge/JDK-1.8+-blue)]()[![Maven-Version](https://img.shields.io/badge/Maven-3.6+-blue)]()[![SpringBoot-Version](https://img.shields.io/badge/SpringBoot-2.4.5-blue)]()
高可靠性架构设计 ![](./images/高可靠性架构.PNG) ### 系统特点 - 编解码使用google的Protobuf - 使用springboot集成netty - 自定义数据格式 - 自定义注解实现通用性业务处理 - 空闲连接自动回收 - 封装通用传输对象 ### 系统目录介绍 - netty-common - 通用方法封装 - 自定义结构体&传输对象的封装 - 自定义注解&反射实现类 - 反射Map缓存添加了自定义注解的类和方法 - netty-client - 客户端 - netty-server - 服务器端 ### 业务流程图 ![](./images/业务流程图.PNG) ### 传输对象Message定义 ```js // 数据类型,请求还是相应 enum MessageType { REQUEST = 0; RESPONSE = 1; } // 处理结果,成功、失败、系统错误 enum ResultType { SUCCESS = 0; FAILURE = 1; SYS_ERROR = 2; } // 消息体 message Message { int64 crcCode = 1; //自定义编码 MessageType messageType = 2; //数据类型 ResultType resultType = 3; //处理结果 string module = 4; // 针对哪个业务类型 user、group等对象类 string cmd = 5; // 对应要执行哪个方法 add、delete、update bytes body = 6; // 具体数据内容 } ``` ### 整体流程简单讲解 定义通用的传输对象,根据module+cmd就可以确定是执行哪个类的哪个方法 项目初始化时扫描自定义注解,拿到对应的类注解和方法注解,module和cmd拼接起来当做Map的key,缓存反射对象,收到请求,根据传输对象,调用反射方法执行业务逻辑 重要的一点是服务端接收到数据,使用线程池异步处理 ### 关于Buffer释放的问题 客户端的response必须对 MessageModule.Message 资源释放,服务端却不用 SimpleChannelInboundHandler是ChannelInboundHandlerAdapter的子类 两个的区别: ChannelInboundHandlerAdapter 不会对资源进行回收 SimpleChannelInboundHandler 会对资源进行回收 由于使用线程池,SimpleChannelInboundHandler 会对资源释放,所以只能使用ChannelInboundHandlerAdapter 但是ChannelInboundHandlerAdapter 不会对资源进行释放,服务端调用的是writeAndFlush,会自动给释放,而客户端接收响应后无需返回消息给服务器,所以必须手动释放 若同步,不使用线程池时,客户端使用SimpleChannelInboundHandler即可 > springboot中,netty不能交由spring管理,因为netty启动是同步阻塞的 > > spring不需要知道有nety,通过注解+aop扫描出需要的,缓存到map中即可 ## Distruptor提高Netty性能 1. 在使用Netty进行接收处理数据的时候,尽量都不要在工作线程上编码自己业务逻辑 2. 我们需要使用异步机制,比如使用线程池异步处理 3. 如果使用线程池就意味着使用阻塞队列 4. 这里可以替换为Disruptor提高性能 ### 架构图 ![](./images/Disruptor-Netty性能提升架构图.png) ### 具体实现 见disruptor分支,目前仅替换了server端的线程池,client端的同理更换即可。