栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

netty 整合

Java 更新时间:发布时间: 百科书网 趣学号
是什么 (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 {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        
        // 自定义的消息处理handler
        pipeline.addLast(new MsgHandler());
    }
}

// 放到容器中
@Component
public class MsgHandler extends SimpleChannelInboundHandler{
    
    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(...);
    }
}
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/956938.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号