Netty源码 服务端的启动
最近一直在看netty,看完之后就想做点笔记。可是实在是太忙了,挤了还要几个晚上终于挤出来了
上图是服务端的实例代码。大致的流程先梳理一遍。
首先会执行 用于创建两个线程组,boosGroup用于接受外部连接,对 SelectionKey.OP_ACCEPT 感兴趣
,workGroup用于处理io操作,内部,每当有新连接进来的时候boosGroup 都会把连接封装成一个channel 交给workGroup 去处理。
我们再看 NioEventLoopGroup 的构造方法,一直点进去,实际上调用的 MultithreadEventExecutorGroup
可以看到 这两行代码实际就是创建两个包含 NioEventLoop 对象的数组。NioEventLoop对象我们后面介绍。
ServerBootstrap 是一个辅助类,主要用于设置各种配置参数,
.group(bossGroup, workerGroup)
就是上面我们创建的两个线程组,bossGroup
的作用就是不断地accept到新的连接,将新的连接丢给workerGroup
来处理
.channel(NioServerSocketChannel.class)
表示服务端启动的是nio相关的channel,channel在netty里面是一大核心概念,可以理解为一条channel就是一个连接或者一个服务端bind动做
.childHandler(new ChannelInitializer<SocketChannel>)
表示一条新的连接进来之后,该怎么处理
上面的几行代码都是做相应配置。
真正的关键在于bind方法
我们一路点击进去。这个干了三件事 初始化,注册,绑定端口。
我们先看 initAndRegister
总共三步,创建channel,初始化,注册。
1.创建 反射调用,这里的clazz是在中设置的,所以这里创建出的是NioServerSocketChannel
2.初始化
初始化只做了两件事
- 将配置属性设置到channelConfig或者channel 中
- 加入新连接处理器
p.addLast()
向serverChannel的流水线处理器中加入了一个 ServerBootstrapAcceptor
,从名字上就可以看出来,这是一个接入器,专门接受新请求,把新的请求扔给某个事件循环器
3.注册
将该条channel
绑定到一个selector
上去,一个selector被一个reactor线程使用,后续该channel
的事件轮询,以及事件处理,异步task执行都是由此reactor线程来负责
现在我们的channel
已经和reactor
线程绑定在一起了,现在就剩下最后一步了,完成端口的绑定。
netty通过异步线程的方式完成端口绑定,这段代码比较难找,最终会来到 io.netty.channel.DefaultChannelPipeline.HeadContext#bind
最终调到了jdk里面的bind方法,这行代码过后,正常情况下,就真正进行了端口的绑定。
Netty源码 服务端的启动的更多相关文章
- Netty源码—一、server启动(1)
Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo.RocketMQ.可以说Netty是对Java NIO的封装,比如ByteBu ...
- Netty(6)源码-服务端与客户端创建
原生的NIO类图使用有诸多不便,Netty向用户屏蔽了细节,在与用户交界处做了封装. 一.服务端创建时序图 步骤一:创建ServerBootstrap实例 ServerBootstrap是Netty服 ...
- Netty源码分析之客户端启动过程
一.先来看一下客户端示例代码. public class NettyClientTest { public void connect(int port, String host) throws Exc ...
- Netty源码—二、server启动(2)
我们在使用Netty的时候的初始化代码一般如下 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGro ...
- 口袋微博android源码服务端和客户端
刚刚在源码天堂看到了一个不错的安卓SNS应用源码,而且也比较完整的,它基本具备了新浪微博的所有功能,包括查看最新的微博.微博评论.好友资料.回复评论以及发私信等,除此之外,还提供了许多独有的特色功能: ...
- Netty源码 reactor 模型
翻阅源码时,我们会发现netty中很多方法的调用都是通过线程池的方式进行异步的调用, 这种 eventLoop.execute 方式的调用,实际上便是reactor线程.对应项目中使用广泛的NioE ...
- Netty 源码(一)服务端启动
Netty 源码(一)服务端启动 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) ServerBootstap 创建时序图如 ...
- Netty源码分析第1章(Netty启动流程)---->第1节: 服务端初始化
Netty源码分析第一章: Server启动流程 概述: 本章主要讲解server启动的关键步骤, 读者只需要了解server启动的大概逻辑, 知道关键的步骤在哪个类执行即可, 并不需要了解每一步的 ...
- Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化
Netty源码分析第一章:Netty启动流程 第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...
随机推荐
- heartbeat.go
body: %s", resp.StatusCode, body) } return nil }
- stats.go
, len(c.clients)) for _, client := range c.clients { clients = append(cl ...
- SSIS 调试和故障排除
SSIS内置的调试工具是非常完备的,主要是设置断点和查看变量值,这是在Package的设计阶段可以使用的工具,在Package部署到服务器之后,用户还可以使用事件处理程序以实现Package出错的自我 ...
- Tensorflow学习-数据读取
Tensorflow数据读取方式主要包括以下三种 Preloaded data:预加载数据 Feeding: 通过Python代码读取或者产生数据,然后给后端 Reading from file: 通 ...
- 【源码解析】Sharding-Jdbc的执行过程(一)
一.ShardingContext 在Sharding-Jdbc中,我们其实需要抓住一个核心类,也就是ShardingContext,分片上下文,里面定义了下面几个内容: @RequiredArgsC ...
- BZOJ_2561_最小生成树_最小割
BZOJ_2561_最小生成树_最小割 题意: 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条 ...
- 在weblogic上部署遇到的问题总结
最近在weblogic上发布自己的项目,但是当调用程序服务时却报错了.于是查看了错误日志. 错误日志如下: Root cause of ServletException. java.lang.Link ...
- 【SAP业务模式】之STO(一):业务背景和前台操作
所谓STO即两个关联公司之间的库存转储交易,一家公司发出采购订单向另一家公司做采购,然后在做发货.如此之后,两家公司有相应应收应付的票据,以及开票和发票校验等动作. STO分为一步法与两步法,因为一步 ...
- JAVA基础第二章-java三大特性:封装、继承、多态
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...
- spring mvc+redis实现微信小程序登录
本文将详细的介绍微信小程序的登录流程以及在ssm框架下如何实现小程序用户登录 登录流程概要 主要的登录流程可以参考官方提供的一张流程图: 1.微信前台页面: 在微信版本更新之后,提高了安全机制,我们需 ...