赞
踩
netty是一个基于
NIO实现, 异步、事件驱动
的编程模型。
很多用到了netty的框架,比如dubbo
,es
节点间通信,gRPC
,RocketMQ
···
他解决了原生NIO长轮询CPU占用100%的问题
增强了NIO中的ByteBuffer
工能,变成了ByteBuf
springboot
中引入netty
我们使用用的最多的的netty4.x
```pom
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.94.Final</version>
</dependency>
```
NettyConfig
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());
}
}
NettyProperties
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 。。。。
}
NettyServerBoot
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();
}
}
NettyServerHandler
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());
}
}
application.yaml
# netty 配置
netty:
# boss线程数量
boss: 4
# worker线程数量
worker: 2
# 连接超时时间
timeout: 6000
# 服务器主端口
port: 18023
# 服务器备用端口
portSalve: 18026
# 服务器地址
host: 127.0.0.1
出现netty字样 就是引入成功
解决方法看我另一篇文章 点击
netty需要单独的端口 ,是单独的服务
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。