如何快速更新自己的技术积累?
- 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
- 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
- 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
- 学习以后不知道有没有学成,则可以通过面试去检验。
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
Netty服务端初始化序列图
提供如下Netty服务端示例代码:
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;
写在最后
为了这次面试,也收集了很多的面试题!
以下是部分面试题截图
tps://bbs.youkuaiyun.com/forums/4f45ff00ff254613a03fab5e56a57acb)收录**