netty 整合

是什么 (https://netty.io/)

Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server.

'Quick and easy' doesn't mean that a resulting application will suffer from a maintainability or a performance issue. Netty has been designed carefully with the experiences earned from the implementation of a lot of protocols such as FTP, SMTP, HTTP, and various binary and text-based legacy protocols. As a result, Netty has succeeded to find a way to achieve ease of development, performance, stability, and flexibility without a compromise.

简单的来说就是一个快速提供网络编程的服务框架,提供对多种数据协议的支持;
netty为很多框架的底层网络连接,比如Gateway、dubbo、xxl-job(分布式任务)、zookeeper...... 由此可见其性能、稳定性;

本文基于 4.1.72.Final (目前最新版 4.1.77.Final)

使用netty以前需要对以下知识有个简单的了解;netty同样提供了不同阻塞模型的编程,这里介绍的时候只对概念进行介绍,netty中具体使用在后文介绍;

阻塞模型

BIO(同步阻塞)

传统阻塞模型,为每一个连接提供一个线程,当连接空闲时线程也不会断开,造成不必要的线程浪费;可以参考Java中的Socket-TCPServer;一个client就要单独占用一个线程,可能当前client意外宕机或者很长时间都不发送数据,线程不会消失,资源一直被占用;
连接数固定且不多的时候适用;比如构建一个停车场客户端,链接上的设备固定只有几个相机;

NIO(同步非阻塞)

相对较短的连接,且连接数不固定的时候适合使用该种方式,比如聊天室…;
通过使用一个selector来维护多个连接,多路复用器轮询到连接有IO请求时就进行处理;

不同的多路服用的的IO方式 https://www.csdn.net/tags/NtDaMgwsOTIyNzItYmxvZwO0O0OO0O0O.html

AIO(异步非阻塞)

Asynchronous I/O,异步io模型,异步非阻塞,无论是客户端的连接请求还是读写请求都会异步执行, 由操作系统完成后回调通知服务端程序启动线程去处理, 一般适用于连接数较多且连接时间较长的应用。
简单来说就是在连接建立时都会去注册一个回调函数,具体的逻辑由这个回调函数操作。
AIO方式适用于连接数目多且连接比较长(重操作)的架构。

netty中的核心组件

参考这个不赘述了…https://developer.aliyun.com/article/907807

使用中的解决方案

TCP中的粘包/拆包解决
  1. 将消息分为帧头、消息体;消息体中前四位为字符长度,简单重写buffer的编解码即可实现;
  2. 消息定长,一条消息的长度固定,根据长度区分不同的数据包;
  3. 按指定分隔符分割看,比如换行等等…
    以下提供简单的基于第一种方式实现的demo:
websocket-Server搭建

TcpServer

netty-websocket 整合Gateway

WebsocketServer

websocket-redisson 集群

redisson

托管到Spring-IOC容器中
  1. 建立助手类时向通道中添加助手类 使用的new的方式 新建对象,而不是托管到 Spring 的 IOC 容器中 ;
    a. 将助手类注册到IOC容器中;
    b. 通过助手类.其他注入类.method()调用;
// 这里调用的时候直接使用的new的方式调用的,不会托管到Spring 的IOC 容器中
public class WSServerInitialize extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        
        // 自定义的消息处理handler
        pipeline.addLast(new MsgHandler());
    }
}

// 放到容器中
@Component
public class MsgHandler extends SimpleChannelInboundHandler<TextWebSocketFrame>{
    
    private static MsgHandler msgHandler;
    
    // 未调用前提供初始化方法,提前放到容器中
    @PostConstruct
    public void init() {
        
        // 为自定义助手类初始化赋值
        msgHandler = this;
    }
    
    @Autowired
    private RedissonClient redissonClient;
    
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) {
        
        // 使用方式
        RBucket bucket = msgHandler.redissonClient.getBucket(...);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值