springboot中怎么引入netty

什么是netty

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字样 就是引入成功

注意:springboot集成netty Bean注入不了

解决方法看我另一篇文章 点击

netty需要单独的端口 ,是单独的服务

要是我的文章有问题,请您指正。

要是对您有帮助,点个赞吧,共同学习进步!