什么是netty
netty是一个基于
NIO实现, 异步、事件驱动 的编程模型。
很多用到了netty的框架,比如dubbo ,es 节点间通信,gRPC ,RocketMQ ···
他解决了
增强了NIO中的
如何在springboot 中引入netty
引入依赖
我们使用用的最多的的netty4.x ```pom <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.94.Final</version> </dependency> ```
配置代码
package com.dxzw.czsf.module.sf.netty.config; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelOption; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Author abel_liq * netty启动类 */ @Configuration @EnableConfigurationProperties public class NettyConfig { final NettyProperties nettyProperties; public NettyConfig(NettyProperties nettyProperties) { this.nettyProperties = nettyProperties; } /** * boss线程池-进行客户端连接 * * @return */ @Bean public NioEventLoopGroup boosGroup() { return new NioEventLoopGroup(nettyProperties.getBoss()); } /** * worker线程池-进行业务处理 * * @return */ @Bean public NioEventLoopGroup workerGroup() { return new NioEventLoopGroup(nettyProperties.getWorker()); } /** * 服务端启动器,监听客户端连接 * * @return */ @Bean public ServerBootstrap serverBootstrap() { return new ServerBootstrap() // 指定使用的线程组 .group(boosGroup(), workerGroup()) // 指定使用的通道 .channel(NioServerSocketChannel.class) // 指定连接超时时间 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, nettyProperties.getTimeout()) // 指定worker处理器 .childHandler(new NettyServerHandler()); } }
package com.dxzw.czsf.module.sf.netty.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; /** * @author: abel_liq * netty的配置信息 */ @Configuration @ConfigurationProperties(prefix = "netty") @Data public class NettyProperties { /** * boss线程数量 */ private Integer boss; /** * worker线程数量 */ private Integer worker; /** * 连接超时时间 */ private Integer timeout = 30000; /** * 服务器主端口 */ private Integer port = 18023; /** * 服务器备用端口 */ private Integer portSalve = 18026; /** * 服务器地址 默认为本地 */ private String host = "127.0.0.1"; // setter、getter 。。。。 }
package com.dxzw.czsf.module.sf.netty.config; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.nio.NioEventLoopGroup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resource; @Component @Configuration public class NettyServerBoot { private static final Logger log = LoggerFactory.getLogger(NettyServerBoot.class); @Resource NioEventLoopGroup boosGroup; @Resource NioEventLoopGroup workerGroup; final ServerBootstrap serverBootstrap; final NettyProperties nettyProperties; public NettyServerBoot(ServerBootstrap serverBootstrap, NettyProperties nettyProperties) { this.serverBootstrap = serverBootstrap; this.nettyProperties = nettyProperties; } /** * 启动netty * * @throws InterruptedException */ @PostConstruct public void start() throws InterruptedException { // 绑定端口启动 serverBootstrap.bind(nettyProperties.getPort()).sync(); // 备用端口 serverBootstrap.bind(nettyProperties.getPortSalve()).sync(); log.info("启动Netty: {},{}", nettyProperties.getPort(), nettyProperties.getPortSalve()); } /** * 关闭netty */ @PreDestroy public void close() { log.info("关闭Netty"); boosGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }
package com.dxzw.czsf.module.sf.netty.config; import com.dxzw.czsf.module.sf.netty.handler.InBound.*; import com.dxzw.czsf.module.sf.netty.handler.OutBound.CPPEncoderHandler; import com.dxzw.czsf.module.sf.netty.handler.OutBound.HeartBeatingEncoderHandler; import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.SocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import lombok.extern.slf4j.Slf4j; @Slf4j public class NettyServerHandler extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { // todo: 根据业务编写自己的pipeline socketChannel.pipeline() // 添加日志处理器 .addLast(new LoggingHandler(LogLevel.INFO)) // 使用自定义处理粘包/拆包, 判断是否有完整的帧 @@ ## .addLast(new CustomFrameDecoder()) // 解码 .addLast(new CPPDecoderHandler()) // 编码心跳包 .addLast(new HeartBeatingEncoderHandler()) // 编码结构体实例转码为字节流 .addLast(new CPPEncoderHandler()) // 对数据进行处理 .addLast(new CPPHandler()) // 对数据进行响应 .addLast(new CPPResolveHandler()) // 心跳包处理器 .addLast(new HeartBeatingBusHandler()); } }
# netty 配置 netty: # boss线程数量 boss: 4 # worker线程数量 worker: 2 # 连接超时时间 timeout: 6000 # 服务器主端口 port: 18023 # 服务器备用端口 portSalve: 18026 # 服务器地址 host: 127.0.0.1
查看效果
出现netty字样 就是引入成功
注意:springboot集成netty Bean注入不了
解决方法看我另一篇文章
netty需要单独的端口 ,是单独的服务