加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 系统 > 正文

Netty的详解与简单使用

发布时间:2022-06-21 14:34:53 所属栏目:系统 来源:互联网
导读:一、Netty的优势 尽管我们前面学习NIO的时候,我已经尽可能的简化代码,但是我们依旧会发现,JDK NIO的开发依旧是极为复杂,在业务开发中我们还要考虑到业务的处理流程、业务的复用、请求的并发量、请求过程中的编解码问题、网络传输中的半包粘包问题等等,
  一、Netty的优势
  尽管我们前面学习NIO的时候,我已经尽可能的简化代码,但是我们依旧会发现,JDK NIO的开发依旧是极为复杂,在业务开发中我们还要考虑到业务的处理流程、业务的复用、请求的并发量、请求过程中的编解码问题、网络传输中的半包粘包问题等等,会进一步增加NIO开发的难度!
 
  Netty是基于上述难题提供了一个统一的解决方案,Netty提供了一个对于Socket编程的统一模板,即使是一个没有网络编程基础的开发人员,也能够很轻松的开发出一个高并发、低延时的程序!
   二、Netty的架构设计
 
 
  这是来自官网的一张架构图,我们可以大致的了解Netty的模块!
 
  Core核心层,是Netty的最主要的实现,后续的所有扩展都建立在Core之上,他提供了事件的可扩展模型、网络通讯编程的通用API、数据零拷贝和数据载体的封装和复用!
  Transport Service服务传输层,Netty提供了底层网络通讯的能力,它抽象了底层网络TCP、UDP等协议的网络通信,使得用户不在为一个网络通信开发的底层技术所头疼,似的注意力能够更加专注于业务!也正是因为这一层的封装,使得NIO/BIO之间能够无缝切换!
  Protocol Support协议层,Netty几乎实现类市面上的大部分主流协议、包括HTTP、SSL、Protobuf、压缩、大文件传输、WebSocket、文本、二进制等主流协议, 而且Netty支持自定义扩展协议。Netty丰富的协议使得用户的开发成本大大降低,使用内置的协议可以很轻松的开发一个类似于Tomcat的Http服务器!
  三、Netty的基本使用和介绍
  经过上面的介绍,我们大概了解了Netty的基本架构,下面我们会看一下Netty的基本使用,然后我会逐行解析,希望能够通过这一节课帮助大家入门Netty编程,也为后面的源码学习更好的铺垫一下!
 
  1. 开发一个服务端
 
  我们使用Netty开发一个简单的服务端代码:
 
  服务端接收到客户端的消息,打印出来,然后主动中断连接!
 
  启动服务端源代码:
 
  复制
  /**
   * 服务端打印处理的handler
   *
   * @author huangfu
   * @date 2021年4月19日12:42:34
   */
  public class EchoServerHandler extends ChannelInboundHandlerAdapter {
      @Override
      public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
          ByteBuf byteBuf = (ByteBuf) msg;
          try {
              //转换为字符串
              String message = byteBuf.toString(StandardCharsets.UTF_8);
              System.out.println(message);
          }finally {
              ReferenceCountUtil.release(byteBuf);
              ctx.channel().close();
          }
   2. 服务端源代码介绍
 
  复制
  EventLoopGroup boss = new NioEventLoopGroup(1);
  EventLoopGroup worker = new NioEventLoopGroup();
  1.
  2.
  定义两个事件循环组,还记得我们第五章将的我们对NIO的优化版本吗?现在暂时你可以把它理解为两个selector组:
 
  boss内部只包含一个selector选择器,用于接收新连接!
  worker内部默认是CPU*2个selector选择器,用于处理我们的业务逻辑!
  boss接收到新连接后,将新连接产生的SocketChannel交给worker线程组处理!用一个现在比较流行的比喻:boss相当于老板,worker相当于工人,boss不处理工作,只负责在外面跑业务拉活谈合同。接到新活之后,就把这个活交给worker来干,自己再去接下一个活!
 
  这两行代码建议参考上一章的NIO的优化版本学习!
 
  复制
  ServerBootstrap serverBootstrap = new ServerBootstrap();
  1.
  ServerBootstrap是Netty为我们提供的一个快速启动配置类,为什么Netty相较于NIO开发比较简单,就是因为Netty为我们提供了一个网络编程的代码的模板,那么想要使用这些模板,就必须要告诉模板一些必要的参数,供模板读取,而ServerBootstrap正式这个作用,通过初始化的时候,我们设置各种参数,我们将之保存到ServerBootstrap中,后续Netty服务启动的时候,会读取我们初始化的时候配置的各种参数,完成自己的初始化!
 
  复制
  serverBootstrap.group(boss, worker)
  1.
  将我们前面初始化的两个事件循环组绑定起来,保存到serverBootstrap中,供后续读取!
 
  复制
  .channel(NioServerSocketChannel.class)
  1.
  我们这里开发的是一个服务端程序,所以我们使用的是NioServerSocketChannel,在Netty中分为两种SocketChannel,一种是NioServerSocketChannel一种是NioSocketChannel,两者都继承与JDK的ServerSocketChannel和SocketChannel,是Netty官方对于通讯管道的扩展:
 
 
 
  NioServerSocketChannel: 服务端通道
  NioSocketChannel: 客户端通道
  有关于两个通道,我们后面会详细分析,这里你们先记着,NioServerSocketChannel代表着服务端通道!NioSocketChannel代表着客户端通道,不要搞混了!
 
  复制
  .localAddress(8989)
  1.
  设置一个端口号,服务端对外暴露的端口号!
 
  复制
  .childHandler(new ChannelInitializer<SocketChannel>() {
      @Override
      protected void initChannel(SocketChannel socketChannel) throws Exception {
          socketChannel.pipeline().addLast(new EchoServerHandler());
      }
  });
 
 
  复制
  ChannelFuture channelFuture = serverBootstrap.bind().sync();
  1.
  上面的初始化完成了,开始进行服务器启动和端口绑定,根据上面设置的端口号绑定,细心的同学可能会发现我还调用了一个sync方法,Netty是基于异步事件来开发的,这里我们进行bind调用之后,因为是异步执行,所以我们并不知道什么时候完成,所以这里调用了一个阻塞的方法(sync),一直阻塞等待绑定完成后才继续往下走!
 
 
  复制
  boss.shutdownGracefully();
  worker.shutdownGracefully();
  1.
  2.
  优雅停机,该段程序会将通道标记为不可用状态,等待程序处理完毕后,释放Netty所创建的所有资源!
 
  复制
  public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {....}
  1.
  当服务端察觉到客户端发来数据时,回调该逻辑!

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读