Netty之服务启动且注册成功之后

简介: Netty之服务启动且注册成功之后

前言

一直大大咧咧, 有点健忘, 万万没想到, 这次写文章也健忘了, 之前我们分析Netty的启动流程讲了初始化和注册, 但是初始化和注册成功之后的doBind0()方法给忘的一干二净...

网络异常,图片无法展示
|

浅浅回顾一下:

  • Netty自定义启动类MyServer中执行了ServerBootstrap.bind(port).sync()方法启动Netty
  • bind()方法的具体实现doBind()方法中先是执行了initAndRegister()方法, 对channel进行了初始化和注册
  • 当初始化和注册完成之后就会执行到doBind0()方法

doBind0()方法

网络异常,图片无法展示
|

在这个方法中, 我们可以看到, 他就是channle.eventLoop()执行了一个Runnable

channle.eventLoop() 方法

网络异常,图片无法展示
|

channle.eventLoop()方法是一个多态, 执行的是AbstractChannel类下的方法, 在这个方法中可以看到, 他就是对eventLoop进行了赋值并返回, 至于这个this.eventLoop的初始化是在register 的时候

Netty服务端启动流程分析 - 掘金 (juejin.cn)

网络异常,图片无法展示
|

// 简单代码如下
@Override
    public final void register(EventLoop eventLoop, final ChannelPromise promise) {
        ....
        AbstractChannel.this.eventLoop = eventLoop;
        ...
    } 
复制代码

网络异常,图片无法展示
|

通过我们打断点可以发现eventLoop的类型是NioEventLoop, 继承关系图如下所示

网络异常,图片无法展示
|

网络异常,图片无法展示
|

通过断点我们可以看到具体的执行过程就是进入到execute方法. 然后判断task是否为空, 不为空就进入最后的execute方法

网络异常,图片无法展示
|

在这个方法内部执行流程:

  • 判断当前线程是否为eventLoop线程
  • 将任务添加到taskQueue队列

网络异常,图片无法展示
|

addTask()方法详情, offerTask()方法的作用就是添加任务, 并返回是否添加成功, 如果添加失败, 就拒绝执行处理器

channel.bind()

接下来我们回到doBind0方法, 继续往下分析

网络异常,图片无法展示
|

channelNioServerSocketChannel类, 而bind方法的实现类是在AbstractChannel里面

网络异常,图片无法展示
|

网络异常,图片无法展示
|

调用的是pipeline.bind()pipeline它链接了ChannelHandlerContext,head是outbound,tail是inbound.

网络异常,图片无法展示
|

继续往下走 ,他会执行tail.bind()方法, 进入到AbstractChannelHandlerContextbind()方法

网络异常,图片无法展示
|

如果你看过我上一篇文章, 就会有很熟悉的感觉, findContextOutbound方法, 我们在上一篇文章有说

网络异常,图片无法展示
|

执行完findContextOutbound()方法之后, 也是我们熟悉的一部分, 已经讲过很多次了

网络异常,图片无法展示
|

next.invokeBind(localAddress, promise);方法就是执行回调的

端口绑定的发生

网络异常,图片无法展示
|

再次进入这个方法

网络异常,图片无法展示
|

pipeline.head就是outbound, 所以在这里的时候会执行DefaultChannelPipeline.bind()方法

网络异常,图片无法展示
|

再往下走

网络异常,图片无法展示
|

我们到了AbstractChannel类的bind方法, 直接看doBind(), 打断点跳转

网络异常,图片无法展示
|

在这里就是执行了 JDK 原生的bind()方法来绑定端口信息, 至此, 我们的Netty启动系列终于算是差不多完结了, 吗?

下一篇文章开始继续攻克任务三, 为什么创建的channel是非阻塞的

目录
相关文章
|
3月前
Netty 与硬件设备交互,下行命令时(服务对设备),如何等待设备响应,再进行业务操作解决方案
Netty 与硬件设备交互,下行命令时(服务对设备),如何等待设备响应,再进行业务操作解决方案
|
7月前
|
Java
Netty实现HTTP服务
Netty实现HTTP服务
57 0
|
安全 API
Gateway集成Netty服务
Netty是一个异步的,事件驱动的网络应用框架,用以快速开发高可靠、高性能的网络应用程序,提供网络传输能力的管理,支持常见的数据传输协议;
341 0
Gateway集成Netty服务
|
前端开发 网络协议 Java
Netty服务开发及性能优化
造成假死的原因可能是公网丢包、客户端或服务端网络故障等,Netty为我们提供了IdleStateHandler 来解决超时假死问题,示例代码如下
131 0
|
前端开发
Netty流程学习一-netty启动服务
问题:我们的线程:openSelector在什么时候创建的。 在创建NioEventLoop的时候,创建openSelector。 什么时候创建severSocketChannel、初始化serverSocketChannel,同时给serverSocketChannel从bossGroup中选择一个NioEventLoop 创建serverSocketChannel是在initAndRegister的时候,通过泛型+放射+工厂的方式创建serverSocketChannel。 而初始化则是设置channelOptions的相关参数信息、设置属性信息,同时通过channel的pipeline方
128 0
Netty流程学习一-netty启动服务
|
存储 负载均衡 API
Netty + ZooKeeper 实现简单的服务注册与发现
Netty + ZooKeeper 实现简单的服务注册与发现
334 0
Netty + ZooKeeper 实现简单的服务注册与发现
|
网络协议 Java Spring
netty案例,netty4.1基础入门篇十二《简单实现一个基于Netty搭建的Http服务》
Netty不仅可以搭建Socket服务,也可以搭建Http、Https服务。本章节我们通过一个简单的入门案例,来了解Netty搭建的Http服务,在我们后续的Netty网关服务中会使用到这样的功能点。 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
281 0
netty案例,netty4.1基础入门篇十二《简单实现一个基于Netty搭建的Http服务》
|
存储 缓存 NoSQL
跟着源码学IM(十一):一套基于Netty的分布式高可用IM详细设计与实现(有源码)
本文将要分享的是如何从零实现一套基于Netty框架的分布式高可用IM系统,它将支持长连接网关管理、单聊、群聊、聊天记录查询、离线消息存储、消息推送、心跳、分布式唯一ID、红包、消息同步等功能,并且还支持集群部署。
13506 1
|
7月前
|
消息中间件 Oracle Dubbo
Netty 源码共读(一)如何阅读JDK下sun包的源码
Netty 源码共读(一)如何阅读JDK下sun包的源码
132 1