netty

1. netty是什么?

1. netty是一个基于nio的客户端-服务器框架,使用它可以快速开发网络应用程序。
2. 支持多种协议,如:FTP,SMTP,HTTP等。
3. 很多开源框架都采用netty 比如:dubbo,rocketmq,es,grpc。

2. netty应用场景

1.作用rpc框架都网络通信工具;
2.实现http服务器;
3.实现即时通信系统。

3. netty核心组件

1.channel:netty对网路操作对抽象类
	基本i/o操作,bind(),connect(),read(),write()
	常用子类:nioServerSocketChannel和nioSocketChannel。
	
2.eventLoop:事件循环,用于处理连接到生命周期中所发生的事情。
	主要作用就是负责监听网络事件并调用事件处理器进行相关i/o操作。
	channel作为netty网络操作抽象类;eventloop负责处理注册到其上面的channel的i/o操作。
	
3.ChannelFuture:作为异步操作的返回值,可以添加监听器监听返回值。
	channelFuture的channel()方法可以获取关联的channel。
	
4.ChannelHandler和ChannelPipeline
	chanelHandler是消息的具体处理器;
	channelPipeline 装载channelHandler提供入站和出站的api。

5.EventLoopGroup
	包含多个eventLoop,常用bossGroup处理客户端连接请求,当客户端处理完请求后,将这个连接交给wokerGroup来处理,然后wokerGroup负责处理IO相关操作。

6.Boosstrap和serverBootStrap
	Bootstrap 是客户端引导类
 EventLoopGroup group = new NioEventLoopGroup();
        try {
            //创建客户端启动引导/辅助类:Bootstrap
            Bootstrap b = new Bootstrap();
            //指定线程模型
            b.group(group).
                    ......
            // 尝试建立连接
            ChannelFuture f = b.connect(host, port).sync();
            f.channel().closeFuture().sync();
        } finally {
            // 优雅关闭相关线程组资源
            group.shutdownGracefully();
        }
ServerBootstrap服务端引导类
  // 1.bossGroup 用于接收连接,workerGroup 用于具体的处理
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            //2.创建服务端启动引导/辅助类:ServerBootstrap
            ServerBootstrap b = new ServerBootstrap();
            //3.给引导类配置两大线程组,确定了线程模型
            b.group(bossGroup, workerGroup).
                   ......
            // 6.绑定端口
            ChannelFuture f = b.bind(port).sync();
            // 等待连接关闭
            f.channel().closeFuture().sync();
        } finally {
            //7.优雅关闭相关线程组资源
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
7.netty线程模型
	基于reactor模型的事件驱动,采用多路复用将事件分发给相应的handler处理,非常适合海量io的场景。
	单线程模型
	多线程模型
	主从都线程模型

8.为什么出现粘包和拆包,怎么解决?
 主要原因:操作系统在发送TCP数据的时候,底层有一个缓冲区,当发送的数据量太小,TCP就会将多个请求合并成一个请求进行发送,这就造成了粘包;如果发送的数据量太大,TCP就会将其拆分为多次发送,这就是拆包。
 
 解决办法:
 1).使用netty自带的解码器
 	LineBasedFrameDecoder
 	DelimiterBasedFrameDecoder 自定义分割符解码器
 	FixedLengthFrameDecoder 固定长度解码器
 	LengthFieldBasedFrameDecoder
 2) .自定义序列化解码器
 	Serializable
 	Protobuf
 	Hessian2
 	json

9.零拷贝

在这里插入图片描述

   	即所谓的 Zero-copy, 就是在操作数据时, 不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域. 因为少了一次内存的拷贝, 因此 CPU 的效率就得到的提升.

参考:netty面试总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值