zoukankan      html  css  js  c++  java
  • Netty那点事

     

    一、Netty是什么

      Netty,无论新手还是老手,都知道它是一个“网络通讯框架”。

      所谓框架,基本上都是一个作用:基于底层API,提供更便捷的编程模型。

      那么”通讯框架”到底做了什么事情呢?回答这个问题并不太容易,我们不妨反过来看看,不使用netty,直接基于NIO编写网络程序,你需要做什么(ServerTCP连接为例,这里我们使用Reactor模型)

      (1)监听端口,建立Socket连接

      (2)建立线程,处理内容:

        ①读取Socket内容,并对协议进行解析

        ②进行逻辑处理

        ③回写响应内容

        ④如果是多次交互的应用(SMTPFTP),则需要保持连接多进行几次交互

      (3)关闭连接

      建立线程是一个比较耗时的操作,同时维护线程本身也有一些开销,所以我们会需要多线程机制,幸好JDK已经有很方便的多线程框架了,这里我们不需要花很多心思。

      此外,因为TCP连接的特性,我们还要使用连接池来进行管理:

      (1)建立TCP连接是比较耗时的操作,对于频繁的通讯,保持连接效果更好

      (2)对于并发请求,可能需要建立多个连接

      (3)维护多个连接后,每次通讯,需要选择某一可用连接

      (4)连接超时和关闭机制

      想想就觉得很复杂了!实际上,基于NIO直接实现这部分东西,即使是老手也容易出现错误,而使用Netty之后,你只需要关注逻辑处理部分就可以了。

    二、体验Netty

      

    这里我们引用Netty的example包里的一个例子,一个简单的EchoServer,它接受客户端输入,并将输入原样返回。其主要代码如下:
      public void run() {
        // Configure the server.
        ServerBootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));

        // Set up the pipeline factory.
        bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
          public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(new EchoServerHandler());
          }
        });
        

        // Bind and start to accept incoming connections.
        bootstrap.bind(new InetSocketAddress(port));
      }
      这里EchoServerHandler是其业务逻辑的实现者,大致代码如下:
      public class EchoServerHandler extends SimpleChannelUpstreamHandler {
        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
          // Send back the received message to the remote peer.
          e.getChannel().write(e.getMessage());
        }
      }

      还是挺简单的,不是吗?

    三、Netty背后的事件驱动机制

      理解Netty的关键点在哪呢?我觉得,除了NIO的相关知识,另一个就是事件驱动的设计思想。

      什么叫事件驱动?我们回头看看EchoServerHandler的代码,其中的参数:public void messageReceived(ChannelHandlerContext ctx, MessageEvent e),MessageEvent就是一个事件。

      这个事件携带了一些信息,例如这里e.getMessage()就是消息的内容,而EchoServerHandler则描述了处理这种事件的方式。一旦某个事件触发,相应的Handler则会被调用,并进行处理。这种事件机制在UI编程里广泛应用,而Netty则将其应用到了网络编程领域。

      在Netty里,所有事件都来自ChannelEvent接口,这些事件涵盖监听端口、建立连接、读写数据等网络通讯的各个阶段。而事件的处理者就是ChannelHandler,这样,不但是业务逻辑,连网络通讯流程中底层的处理,都可以通过实现ChannelHandler来完成了。事实上,Netty内部的连接处理、协议编解码、超时等机制,都是通过handler完成的。当博主弄明白其中的奥妙时,不得不佩服这种设计!

    四、开启Netty源码之门

      理解了Netty的事件驱动机制,我们现在可以来研究Netty的各个模块了。Netty的包结构如下:

      

  • 相关阅读:
    常用的排序方法
    mongoose 操作
    formidable使用
    cors跨域(支持cookie跨域) node后台 express
    mongoose Schema写法
    vue生命周期钩子 (mounted 加载数据没有缓存用 activated 配合keep-alive组件)
    vue路由跳转 页面回到顶部
    RESTful风格的路由设计
    router-link 绑定事件不生效
    axios的Content-Type类型导致后台无法解析数据
  • 原文地址:https://www.cnblogs.com/chy2055/p/5198786.html
Copyright © 2011-2022 走看看