专栏首页瓜农老梁Netty之客户端连接调用

Netty之客户端连接调用

前言

本文主要梳理Netty客户端如何发起连接请求的以及最终通过SocketChannel与服务端建立连接,顺便分析了在此过程中涉及到的地址解析过程。

一、获取地址解析器

备注:在Netty客户端发起连接前,先获取了AddressResolver,并进行了解析判断。

获取AddressResolver过程

备注:创建AddressResolver并将其放到缓存Map中,key为executor。

备注:默认使用DefaultAddressResolverGroup中的DefaultNameResolver构建InetSocketAddressResolver。

小结:从上面获取地址解析过程中,AddressResolverGroup拥有一组AddressResolver存储于Map中,key为EventExecutor,而AddressResolver是通过NameResolver构建的。

二、地址解析器图谱

1.AddressResolverGroup类图

2.AddressResolver类图

3.NameResolver类图

4.关系图示

三、地址解析过程

地址解析通过下面的方法来实现。分别看下isSupported、isResolved、doResolve的逻辑。

@1 isSupported主要判断传入socket地址是否属于InetSocketAddress,通过JDK中isInstance来实现。 @2 doIsResolved判断包含了isSupported和非空判断,入参非空并且属于InetSocketAddress则标记解析成功 @3 doResolve 根据host name解析成InetSocketAddress,通过InetAddress.getByName(hostname)实现。

小结:地址解析主要得到SocketAddress是合法有效的,如果为host name默认为通过InetAddress.getByName转换为InetAddress。

四、建立连接

在地址解析成功后,该建立连接了,接下来看下netty是如何发起的。

备注:接着调用AbstractChannel的connect方法,即:DefaultChannelPipeline#connect。

备注:从链表的最后一个tail发起连接。

备注:从之前文章分析中,我们知道链表构成。会调用到AbstractChannelHandlerContext#connect方法。通过方法findContextOutbound查找链表中负责出站的HandlerContext调用其connect方法,结束后向下一个出站HandlerContext传递调用。

备注:出站HandlerContext查找过程。

备注:上图为运行时DefaultChannelPipeline链表中的Handler结构。尾部为TailContext,头部为HeadContext。

备注:继续上面的连接传递,最后会调用HeaderContext的connect方法。通过unsafe.connect向服务端发起连接调用。

备注:调用NioSocketChannel#doConnect方法,最后通过Java NIO的SocketChannel#connect发起连接请求。

作者丨梁勇 来源丨瓜农老梁(ID:gh_01130ae30a83)

本文分享自微信公众号 - 瓜农老梁(gh_01130ae30a83),作者:梁勇

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RocketMQ存储--日志文件创建与映射流程【源码笔记】

    日志目录(可配置)/data/rocketmq/store/commitlog会有20位长度的日志文件。 1.日志文件什么时候创建的? 2.日志文件创建流程是什...

    瓜农老梁
  • RocketMQ Topic创建【源码笔记】

    Topic的创建分为自动创建和通过命令行创建两种。通过broker配置参数autoCreateTopicEnable设置。 通常可以在非生产环境开启自动创建,生...

    瓜农老梁
  • Kafka(0.11.0.2版本)堆内存不能正常回收问题分析【实战笔记】

    短信报警堆内存GC后依然超过4G内存,跟上篇文章所说情况相同。只是上次情况告警短信没发出来。这次介入前,dump了该节点的堆照,方便定位引起的问题。 告警GC日...

    瓜农老梁
  • JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    我们都知道运行一大段 JavaScript 代码性能会变得很糟糕。这段代码不仅需要通过网络传输,而且还需要解析、编译成字节码,最后执行。在之前的文章中,我们讨论...

    Fundebug
  • 基于Spring Boot架构的前后端完全分离项目API路径问题

    最近的一个项目采用前后端完全分离的架构,前端组件:vue + vue-router + vuex + element-ui + axios,后端组件:Sprin...

    2Simple
  • 20分钟了解微服务

    image.png 简介 所有的功能打包在一个war包里,基本没有外部依赖(除了容器),部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,...

    春哥大魔王
  • CCSK云安全认证-M3-管理云计算的安全性和风险

    管理云计算时要记住 的首要问题是,一个组织永远不能外包治理的责任,即使是使用外部供应商的情况下。 无论采用云计算或不采用云计算服务,这都是正确的 云计算影响治...

    一只特立独行的兔先生
  • 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

    基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发、部署、运维管理、持续开发持续集成的流程。平台提供基础设...

    lyb-geek
  • 中国智能硬件开发板玩家大盘点

    这段时间有幸在寨都深圳走访了几家专业开发板的生产厂家,对于国内开发板情况算是有一个新的认识。 CPU厂商为了将产品推向市场,为了让客户了解CPU的各项...

    罗超频道
  • FBI也需要云计算吗?

    Rainbond开源

扫码关注云+社区

领取腾讯云代金券