Netty

简述

Netty是由JBoss开发,基于Java NIO的一个高性能通信框架。Netty支持非常多的协议,比如HTTP、WebSocket等。当然,Netty也可以自定义协议。Netty同时支持Java的BIO和NIO两种方式。且很容易与Spring等主流框架进行集成。

为什么不适用原生的IO

  • 原生API使用单线程模型,不能很好利用多核优势,如果自己去写多线程结合起来比较麻烦;
  • 原生API是直接使用的IO数据,没有做任何封装处理,对数据的编解码、TCP的粘包和拆包、客户端断连、网络的可靠性和安全性方面没有做处理

主要应用领域

  • 高性能的RPC框架:常用于微服务之间的高性能远程调用(如Dubbo)
  • 游戏行业:Netty可以很轻松地定制和开发一个私有协议栈,
  • 即时通讯:Netty基于Java NIO,并且做了一些优化,支持高性能的即时通讯
    在这里插入图片描述

Reactor 线程模型

Reactor是反应堆的意思。Reactor线程模型是指通过一个或多个输入,同时传递给服务处理器的服务请求的事件驱动处理模式。

  • 首先介绍处理事件的两种方式:

1:轮询方式:线程不断轮询访问相关事件发生源有没有发生事件,有发生事件就调用事件处理逻辑。Java 原生的NIO就是使用的轮询方式。:
2:事件驱动方式,发生事件,主线程把事件放入事件队列,在另外线程不断循环消费事件列表中的事件,调用事件对应的处理逻辑处理事件。事件驱动方式也被称为消息通知方式,其实是设计模式中观察者模式的思路。

工作原理

在这里插入图片描述
Reactor 有一个专门负责监听和分发事件的线程,如图中的Service Handler,所有请求进来后,被它分发到具体的处理线程,如图中的EventHandler去处理。

Reactor可能有多个,而Netty正是使用了多Reactor的线程模型

Netty工作流程

在这里插入图片描述
Netty里面有两个Group,分别是Boss Group和Worker Group。其中,Boss Group用于处理连接,Worker Group用于处理实际的读写IO。

Boss Group里面的NioEventLoop会轮询accept事件,遇到有新的连接,就生成NioSocketChannel,并把这个Channel注册到Worker Group的Selector上。

Worker Group轮询read和write事件,在可读或者可写条件满足时,就进行处理。

Worker Group和Boss Group都是通过里面的NioEventLoop来操作的。NioEventLoop中维护了一个线程和任务队列,支持异步提交执行任务,线程启动时会调用NioEventLoop的run方法。

最后都会执行一个runAllTasks方法,它用于处理任务队列中的任务。任务队列中的任务包括用户调用 eventloop.execute或schedule执行的任务,或者其他线程提交到该eventloop的任务

代码

public class Server {

    private final static int PORT = 8080;

    public static void main(String[] args) {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    .childHandler(new ChildChannelHandler());

            ChannelFuture f = b.bind(PORT).sync();
            System.out.println(Thread.currentThread().getName() +
                    ",服务器开始监听端口,等待客户端连接.........");

            f.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }


    private static class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
        @Override
        protected void initChannel(SocketChannel socketChannel) throws Exception {
            socketChannel.pipeline().addLast(new ServerHandler());
        }
    }

    static class ServerHandler extends ChannelInboundHandlerAdapter {

        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            ByteBuf buf = (ByteBuf) msg;
            byte[] reg = new byte[buf.readableBytes()];
            buf.readBytes(reg);
            String body = new String(reg, StandardCharsets.UTF_8);
            System.out.println(Thread.currentThread().getName() +
                    ",The server receive  order : " + body);

            String respMsg = "I am Server,消息接收 success!";
            ByteBuf respByteBuf = Unpooled.copiedBuffer(respMsg.getBytes());
            ctx.write(respByteBuf);
        }
    }
}
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值