Netty组件介绍

举报
西魏陶渊明 发表于 2022/09/25 02:00:30 2022/09/25
【摘要】 在学习Netty之前,建议首先学习一个NIO,对关键的NIO组件有一个清醒认识 Buffer Selector 总览 Bootstrap or ServerBootstrapEventLoopEventLoopGroupChannelPipelineFuture or ChannelFutureChannelIniti...

在学习Netty之前,建议首先学习一个NIO,对关键的NIO组件有一个清醒认识

Buffer

Selector

总览

  • Bootstrap or ServerBootstrap
  • EventLoop
  • EventLoopGroup
  • ChannelPipeline
  • Future or ChannelFuture
  • ChannelInitializer
  • ChannelHandler

ServerBootstrap

一个Netty应用通常由一个Bootstrap开始,它主要作用是配置整个Netty程序,串联起各个组件。

EventLoop

一个EventLoop可以为多个Channel服务。 EventLoopGroup会包含多个EventLoop

ChannelPipeline,ChannelHandler

从PipeLine这个单词中可以看出来,是一个管道,处理连接。我们的业务代码handler一般都是放在这个管道中的

那么疑问来了,这个管道中的处理顺序是什么样呢?


  
  1. ChannelPipeline cp = channel.pipeline();
  2. cp.addLast("encoder", new HttpResponseEncoder());//1.负责输出
  3. cp.addLast("decoder", new HttpRequestDecoder());//2.负责把客户端的数据解码
  4. cp.addLast("handler", new HttpDispatchServerHandler());//3.自定义的业务处理器

按照我们执行顺序肯定不是根据添加顺序来处理的,应该是:2,把客户端的数据解码->3.对解码数据处理->1.加密返回给客户端。

那么 Netty 是怎么处理的呢?

4279695-e5d457c57e93ba23

ChannelHandler有两个子类ChannelInboundHandler和ChannelOutboundHandler,这两个类对应了两个数据流向,如果数据是从外部流入我们的应用程序,我们就看做是inbound,相反便是outbound

4279695-2adc122361ee68fa

ChannelInitializer

顾名思义,这个就是channel初始化的容器,在这个里面设置处理器


  
  1. ServerBootstrap bootstrap = new ServerBootstrap();
  2. bossGroup = new NioEventLoopGroup();//负责绑定channel到selector
  3. workerGroup = new NioEventLoopGroup();//负责从selector中读取事件
  4. bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
  5. .localAddress(6969).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
  6. .childOption(ChannelOption.SO_KEEPALIVE, true).childHandler(new ChannelInitializer<Channel>() {
  7. @Override
  8. protected void initChannel(Channel channel) throws Exception {
  9. ChannelPipeline cp = channel.pipeline();
  10. cp.addLast("idleStateHandler", new IdleStateHandler(5, 5, 5, TimeUnit.SECONDS));
  11. cp.addLast("decoder", new HttpRequestDecoder());
  12. cp.addLast("encoder", new HttpResponseEncoder());
  13. cp.addLast("aggregator", new HttpObjectAggregator(1048576));
  14. cp.addLast("deflater", new HttpContentCompressor());
  15. cp.addLast("handler", new HttpDispatchServerHandler());
  16. cp.addLast("out", new AcceptorIdleStateTrigger());
  17. }
  18. }).option(ChannelOption.SO_BACKLOG, 128);
  19. try {
  20. channel = bootstrap.bind().awaitUninterruptibly().channel();
  21. showBanner(6969);
  22. } catch (Exception ie) {
  23. throw new RuntimeException(ie);
  24. }

Future or ChannelFuture

Netty中的连接都可以是异步的,但是也可以设置为非异步

异步:

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/102425321

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。