Netty学习之旅----源码分析netty服务端初始化流程(Reactor主从模式实现)(1)

最后总结我的面试经验

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

BAT面试经验

实战系列:Spring全家桶+Redis等

其他相关的电子书:源码+调优

面试真题:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

1、创建ServerBootstrap实例。

2、调用ServerBootstrap的group方法,设置主,从线程组。对应Reactor模式的主Reactor、从Reactor。

3、调用channel方法,传入NioServerSocketChannel,表示创建的通道为服务端通道。

4、调用childHandler方法,传入的是用户自定义的初始化Handler链,该定制类继承自ChannelInitializer类,完成Handler的编排。

5、调用bind()方法,具体实现在AbstractBootstrap中。

5.1 调用initAndRegister

5.1.1 调用newChannel,创建NioServerSocketChannel。

5.1.2 调用init()方法,具体实现在ServerBootstrap,主要完成如下三件事:

1)用相关选项配置Channel(NioSocketChannel)

2)将childHandler(ChannelInitializer子类handler)加入到管道,已便后续注册应用程序编排的处理链条(Handler)。

3)增加ServerBootstrapAcceptor,Handler处理器,主要是channelRead事件的处理,后续会重点讲解。

5.2 调用gourp().register()方法

gourp()返回的是主Reactor线程组,也就是示例程序boosGroup线程组,register的具体实现类为SingleThreadEventLoop。最终会调用netty Channel,NioServerSocketChannel.register方法,然后调用相应的Unsafe的register方法,最终会调用java.nio.ServerSocketChannel完成注册操作,并用channelRegister,通过ChannelPipeline.fireChannelRegister传播事件。

channelRegister事件会被一个重要的handler所处理,也就是我们自定义的Handler,用于服务编排,也就是步骤4中提到的ChannelInitializer子类。

首先,initChannel 方法被调用,将用户编排的handler一个一个加入到管道。

然后第二步,把自己从管道中移除,亮点,也就是自定义的Handler只会运行一次。亮点所在呀。

第三步,继续传播注册事件。

经过channelRegiser事件的处理后,在服务端,ServerBootstratAdapter会作为处理链条中的第二个,而该类的channelRead事件是核心所在,下文会将在何时触发。

经过上述步骤后,netty服务器就在监听端口等待客户端的接入,事件触发器select()会运行。

一旦有客户端请求连接,服务端会接受到accept事件,然后对该键进行处理:

该段代码应该不会陌生,见于NioEventLoop的processSelectedKey()方法,得知,accept事件,会触发read操作,NioServerSocketChannel在处理读事件时,重写了doReadMessages,此方法,创建一个NioSocketChannel,作为message,传播到Handler进行处理。创建的message即NioServerSocketChannel,会被ServerBootstratAdapter的channelRead方法处理,该方法的核心就是用从Reactor线程组将channel注册到selector上【  childGroup.register(child).addListener】,Reactor主从模式体现的淋漓尽致。

下面列出ServerBootstratAdapter的channelRead方法:

@Override

@SuppressWarnings(“unchecked”)

public void channelRead(ChannelHandlerContext ctx, Object msg) {

final Channel child = (Channel) msg;

child.pipeline().addLast(childHandler);

for (Entry<ChannelOption<?>, Object> e: childOptions) {

try {

if (!child.config().setOption((ChannelOption) e.getKey(), e.getValue())) {

logger.warn("Unknown channel option: " + e);

}

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

image

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?

若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理

梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值