# netty-spring-boot-starter **Repository Path**: ArchieSean-YH/netty-spting-boot-starter ## Basic Information - **Project Name**: netty-spring-boot-starter - **Description**: netty对于springboot的起步依赖,已封装了netty的相关细节,保留自定义配置以及扩展。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-08-06 - **Last Updated**: 2025-05-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # netty-spring-boot-starter > > >封装了netty的相关细节,保留自定义配置、以及扩展点。支持点对点、广播方式的消息推送。 ## 1. 分支 ```txt master: 正式版本 dev:开发版本 demo: 使用demo ``` ## 2. 概念 ### 2.1 NettyProperties【重要】 * springboot整合时的配置信息。**以spring.netty作为前缀** ```java /* * netty服务的端口,【必须】 */ private Integer port; /** * netty通信url,以/开头,例如:/chat 【必须】 */ private String url; /** * 点对点消息 */ private boolean point2point; /** * 消息长度上限 【可选,默认64*1024】 */ private Integer msgLength; /** * 等待队列大小,【可选,默认128】 */ private Integer waitSize; ``` ### 2.2 IMessageSender【重要】 * IMessageSender【重要】: 发送消息类,提供广播(fanoutMessage方法)以及点对点发送(p2pMessage(String key,String message)),该bean已自动装配,直接注入使用即可。 ```java public interface IMessageSender { /** * 广播消息 * @param message 消息内容 */ void fanoutMessage(String message); /** * @param message 消息内容 * @param key :此处的key,是建立连接时,key所对应的值 * 点对点消息 */ void p2pMessage(String key,String message); } ``` 上述接口有默认实现,自动装配方式,不需要自定义实现。直接注入即可使用。 ### 2.3 IBusinessMessageHandler【重要】 * IBusinessMessageHandler【重要,需要自行实现】:该类用于接收客户端发送给netty服务端的消息,提供方法:handler(Channel channel,String message),第一个参数:表示当前channel信道,第二个参数:表示客户端发送的消息。**此方法非常重要,所有的消息处理都在这个方法中处理,该接口没有默认实现,请根据业务自行实现其中业务逻辑** ```java @FunctionalInterface public interface IBusinessMessageHandler { /** * 服务端收到的消息,处理逻辑 * 业务消息处理方法,请自行实现 * @param channel 当前信道 * @param message 当前消息内容 */ void handler(Channel channel,String message); } ``` 上述接口,需要自行实现,根据业务的不同,将消息内容转换为自己业务的数据结构,再调用2.2中的消息发送,选择合适的即可。【下边会举例】 ### 2.4 IServerConfig【可选:扩展】 * ServerConfig【可选:提供的netty的扩展点,以及自定义配置】: ```java public interface IServerConfig { /*** * 引导类的配置,可自定义实现 * @param bootstrap 引导类 */ void config(ServerBootstrap bootstrap); /** * 流水线配置 * @param pipeline 流水线 */ void configurePipeline(ChannelPipeline pipeline); /* 启动后的扩展,自定义实现 */ void extendPower(ChannelFuture future); } ``` 上述接口,有默认实现:**AbstractAbstractNettyConfigurer:该类是抽象类,封装了netty相关的配置,其中config(bootstrap)方法默认配置了:ChannelOption.SO_BACKLOG(链接时等待队列大小,有属性配置时将使用属性配置,否则默认128)、ChannelOption.SO_KEEPALIVE默认设置为true,链接维持活性。** 上述接口,有默认的bean:**DefaultAbstractNettyConfigurer** ```txt public class DefaultAbstractNettyConfigurer extends AbstractAbstractNettyConfigurer { /** * 能力扩展 * @param future 扩展入参 */ @Override public void extendPower(ChannelFuture future) { //扩展点,可以增加定时、监听等,自行实现。 //1.思路1:可使用定时监听去除失效链接,清除对应的连接缓存,NettyHolder中的缓存数据 //2.思路2: 可使用监听,监听netty服务启动。 } } ``` 此处的设计,主要用于netty的自定义配置,但需注意以下问题: ```txt 1. config(bootstrap):该方法用于配置netty相关属性,重写时,需要将AbstractAbstractNettyConfigurer中config()方法内容保留,或者直接继承该抽象类也可,可选择保留上边描述的两个属性。相对重要一些。 2.configurePipeline(pipeline): 用于流水线配置,其中配置例如:编解码器、请求url、消息长度上限等。使用时可自定义实现消息处理类,也可保留原有配置使用。 3.extendPower(future): 保留future对象,用于添加netty启动时的扩展内容,例如:监听、定时任务等。 ``` 此处两种方式:(1)继承抽象类,保留原有配置,向容器中放入类型为:**IServerConfig**的bean即可覆盖原有配置。【推荐】 ​ (2)实现 **IServerConfig**接口,更加自由,可实现自定义的消息处理类。【不建议,不如直接写一个netty服务】 ## 3.使用 ### 3.0 前提 * 拉取`master`分支代码,安装到本地maven仓库或者发布到私有化的maven私仓。 * 坐标: ```xml com.github netty-spring-boot-starter 1.0.0 ``` * 配置 ```yaml spring: netty: #netty服务端口 port: 10086 #netty服务uri,必须以/开头 url: /chat #为true时 连接netty时需要传递参数key point2point: true #消息长度上限,此处设置为128kb msg-length: 131072 #等待队列大小,用于连接时的连接排队 wait-size: 256 ``` ### 3.1 简单demo * 创建业务消息处理bean:(该方法可以接收到客户端发送过来的消息,以及当前的信道channel) ```java @Configuration public class NettyConfig { //IMessageSender:封装了消息发送方法,广播以及点对点【前提:需要开启点对点标记point2point】 @Resource private IMessageSender iMessageSender; @Bean public IBusinessMessageHandler iBusinessMessageHandler(){ //channel: 当前的信道 //message: 客户端发送的消息内容 return (channel,message) ->{ //举例、此处直接打印并广播 System.out.println("收到客户端消息:"+message); //调用广播方法 iMessageSender.fanoutMessage("接收到客户端消息:"+message); }; } } ``` * 启动,使用postman测试如下: ![image-20240828231907067](https://rep.archiesean.top/img/202408282319405.png) ### 3.2 自定义配置 * 自定义属性配置: ```java public class CustomNettyServerConfig extends AbstractAbstractNettyConfigurer { /* 自定义相关配置 */ @Override public void config(ServerBootstrap bootstrap) { //调用父类【可选,也可直接覆盖默认配置】,保留两个默认配置:ChannelOption.SO_BACKLOG、ChannelOption.SO_KEEPALIVE super.config(bootstrap); //添加自定义配置 //用来给ServerChannel添加配置 bootstrap.option(ChannelOption.SO_TIMEOUT, 5000); //配置 TCP 连接的超时时间 bootstrap.option(ChannelOption.TCP_NODELAY, true); //启用 TCP 的 Nagle 算法 bootstrap.option(ChannelOption.SO_RCVBUF, 1024 * 1024); //配置连接的接收缓冲区大小 1MB //用来给接收到的通道添加配置【用于服务端】 bootstrap.childOption(ChannelOption.SO_RCVBUF, 2048); //设置子通道的读取缓冲区大小 bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 64 * 1024); //配置子通道的写入缓冲区大小.超过此值将触发流控 } /** * 扩展方法 * @param channelFuture future */ @Override public void extendPower(ChannelFuture channelFuture) { //扩展方法,举例:此处打印一句话,再netty启动成功之后: channelFuture.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture channelFuture) throws Exception { if (channelFuture.isSuccess()) { System.out.println("---netty服务启动成功---"); } else { System.out.println("---netty服务启动失败---"); } } }); } } ``` ```java @Bean public IServerConfig serverConfig(){ return new CustomNettyServerConfig(); } ``` * 启动效果: ![image-20240828235515416](https://rep.archiesean.top/img/202408282355664.png) * postman测试结果: ![image-20240828235549815](https://rep.archiesean.top/img/202408282355175.png) ### 3.3 点对点消息 * 关于点对点消息,根据业务定义统一的消息结构,其中可包含接收方属性,值每次必须是连接netty时传递的key参数的值即可。然后调用上边2.2的方法,将key传递进去即可。 ## 4. 负载均衡 * 可使用nginx反向代理nett服务器,因为每次连接之后会保持长连接,断链之后会重新连接到一个新的节点。 * 至于服务端netty链接共享,可以通过缓存、监听或者MQ消息通知的方式进行。