写点什么

docker 修改容器编码,含 BATJM 大厂

发布于: 2021 年 07 月 30 日

流程描述

我们从 bind 函数开始:1、首先创建了两个 NioEventLoopGroup,这是初始化了两个线程组,这两个线程组根据命名可以知道一个是 bossGroup,是服务器用来接收客户端的请求的,另一个是 workGroup 是用来处理 NioServerSocketChannel 的网络读写的。这两个线程组实际承担的是一个 Reactor 的角色。2、第二步就是初始化一个 ServerBootstrap,这是 Netty 用于启动 NIO 服务端的辅助启动类,目的是降低服务器开发的复杂度。ServerBootstrap 的初始化首先是调用 group 方法,将两个线程组作为参数传到 ServerBootstrap 中。接着创建 channel 为 NioServerSocketChannel。然后调用 option 配置 channel 的 TCP 参数,其中 SO_BACKLOG 设置为 1024 的意思是服务器监听队列的大小是 1024,最后设置处理 IO 事件的处理器 ChildChannelHandler,它的作用类似于 Rector 模式中的 handler 用来处理 IO 事件。3、启动类初始化完成后调用 ServerBootstrap 的 bind 方法绑定端口,监听请求,在调用 sync 等待绑定完成。完成之后返回一个 ChannelFuture 作用是用于异步操作的通知回调。4、调用 future.channel().closeFuture().sync 进行阻塞,等待服务端链路关闭 main 函数退出。5、调用 EventLoopGroup 的 shutdownGracefully 方法,释放相关的资源。


Netty 的线程模型

netty 是一个高可用的基于事件驱动的异步的 NIO 框架,核心的线程模型是 Reactor,Reactor 线程模型有单线程 Reactor,多线程 Reactor 和多线程主从复制的 Reactor,这里我们就用最简单的单线程 Reactor 来分析下 Netty 的线程模型,进而来看 Netty 的相关核心类在此模型下扮演的角色和作用。在网络交互中,无论你是建立连接进行通信还是数据的读写都是继续网络通信协议的,底层就是 TCP/IP 协议栈,协议栈是操作系统层的,我们无法修改他的协议栈,但是操作系统给了我们可以操作和使用协议栈的接口,比如我们经常使用的 bind、accept、connect 等,而这写操作的本身,我们都是对 socket 的操作,所以我们可以任务一个 socket,就是用户跟 TCP/IP 协议栈进行交互的门户。

传统的 IO


一请求一应答,这是 BIO。每次读写都需要生成新的线程,请求多的时候占用大量的线程资源。高并发的情况下很可能造成巨大的线上故障。

NIO Reactor 模型


socket 注册到 Selector 中,由 Selector 决策哪个事件可以执行。

Netty 的线程模型

服务器的线程模型为例:



抽象出 NioEventLoop 来表示一个不断循环执行处理任务的线程,每个 NioEventLoop 有一个 selector,用于监听绑定在其上的 socket 链路。服务端维护了两个 EventLoopGroup,一个 bossGroup,一个 workGroup,bossGroup 用来处理客户端的连接请求,然后打开 Channel,把这个 Channel 交给 workGroup 中的一个 EventLoop 被注册来处理该 Channel 上的所有请求。一个 Channel 只会被一个 workGroup 处理,一个 workGroup 可以同时被多个 Channel 使用。简单了解了 Netty 的一个线程模型,我们来看看 netty 编程中那些核心类的作用。

Netty 架构

核心类分析

EventLoop

EventLoop 是 Netty 中极其重要的组件,翻译为时间循环,一个 EventLoop 被分配给 Channel 来负责这个 Cahnnel 上的所有事件。EventLoop 你可以理解为一个线程,EventLoopGroup 是一个线程池,EventLoopGroup 继承 ScheduledExecutorService,也就是调度线程池,理论上 EventLoopGroup 应该具有 ScheduledExecutorService 的所有的功能,之所以叫做事件循环,我猜想它必然有一个循环把 Cahnnel 上面准备就绪的事件提交给一个 Thread 来处理。这个实现在 SingleThreadEventLoop 的一个继承类 EpollEventLoop 中的 run 方法实现

最后

对于很多 Java 工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。


整理的这些资料希望对 Java 开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。


再免费分享一波我的 Java 面试真题+视频学习详解+技能进阶书籍


点击这里即可免费获取以上我收集整理的全部学习资料



用户头像

还未添加个人签名 2021.07.03 加入

VX:Lzzzzzz63 领取资料

评论

发布
暂无评论
docker修改容器编码,含BATJM大厂