dubbo源码分析7(服务暴露之远程暴露)

根据上一篇说的,本地暴露服务就是把服务A暴露到当前jvm中,使得当前的jvm中B服务要使用A服务时,就不用去注册中心获取走网络请求的方式,直接从jvm中获取性能会更高;

那么本篇就说一下服务是怎么暴露到远程的,引用我上一篇写的东西,下图所示,上一篇我们是分析到了步骤2,接下来我们会走完步骤2到步骤6,准备好,开始发车

dubbo源码分析7(服务暴露之远程暴露)

注意,本篇会有很多的代码截图,不会看的很细的,我们首先把流程看完,建议自己也调试一下源码

1. 起点

我们还是从梦开始的地方,打开类org.apache.dubbo.config.ServiceConfig的doExportUrlsFor1Protocol()方法,下图所示

从这里我们知道,一个服务默认会本地暴露一次,同时还远程暴露一次;

而且根据下图中444行,可以知道dubbo暴露服务是可以支持多个协议的,也就是每一种协议都会暴露一份(我们配置文件只配置了dubbo协议)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

2. 远程暴露

从上图中国protocal.export()方法进入,下面这个类在上一篇博客已经说了,需要我们自己手动创建的

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

接下来就是关键的了,下图可以说是包含了整个远程暴露服务的所有核心逻辑了!!!

dubbo源码分析7(服务暴露之远程暴露)

3.开启netty服务

从上图中的步骤1进入

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

为了篇幅的简洁,省略了中间一些没啥用的截图,反正一步一步的就到了下面这里

dubbo源码分析7(服务暴露之远程暴露)

下面的createServer(url)方法就是创建netty服务端了,dubbo中默认netty监听端口是20880,所以平常我们如果本地20880端口占用了,那么启动dubbo服务就会失败的!

dubbo源码分析7(服务暴露之远程暴露)

进入到creatServer()方法

dubbo源码分析7(服务暴露之远程暴露)

可以看到是通过获取exchange之后,去绑定启动netty监听服务

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

省略中间一点没啥用的步骤,反正就是获取NettyTransporter,调用bind方法,然后就是创建nerrtServer实例,NettyServer的继承类图如下所示

dubbo源码分析7(服务暴露之远程暴露)

我们在实例化NettyServer实例的时候,肯定会优先调用父类的构造方法的,在父类AbstractServer构造方法中调用doOpen()方法,这个doOpen()方法是在NettyServer中实现的,最后就是netty框架的使用了

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

只要是稍微使用过netty的小伙伴,看到下图应该就不陌生了吧!!!(-_-メ)

dubbo源码分析7(服务暴露之远程暴露)

4.连接注册中心zookeeper

就这一行代码开始去连接注册中心,我们从这里出发

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

下面这个类也是需要自己从控制台复制,然后去手动创建

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

到了下图这里,就是封装了zookeeper注册中心的对象了,我们到这里就不继续往里看了;

dubbo源码分析7(服务暴露之远程暴露)

5.创建zookeeper节点

既然上面已经连接连接好了注册中心,现在就开始根据我们的服务信息去zookeeper中创建节点了

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

下面就是真正的使用工具类api创建zookeeper节点了,详细的过程如下:

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

然后我们就可以到zookeeper中可以看到provider节点了(注意,这里使用的操作zookeeper的工具是curator,有兴趣的可以花一分钟看看zkClient和curator的区别)

dubbo源码分析7(服务暴露之远程暴露)

6.监听zookeeper节点

最后就是dubbo订阅zookeeper节点的信息,当服务有数据变化的时候,就会调用回调函数;

不知道大家有注意看到上图的zookeeper中有个节点是configurators,这个节点就是用于监听的(服务消费者和服务提供者都会去监听这个节点的哦!)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

其实到这里,整个远程服务暴露的逻辑已经过了一遍了

顺便一提: 注意上图中最后一行的notify方法,这里面会做一些特殊的事情,就是会将dubbo中服务提供者信息给保存成文件,本地磁盘保存一份,这样的话,即使注册中心挂了,但是服务也是可以正常使用的

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

dubbo源码分析7(服务暴露之远程暴露)

7.总结

本篇博客没有太多的东西,基本上都是截图,我们走通了整个远程服务暴露的逻辑了,我们现在看看下图,我们终于是走完了步骤0和步骤1的逻辑,服务提供者大概就是这样的;

dubbo服务提供者会使用一个容器(就是spring的ioc容器)去启动,启动了之后就去将配置文件中的服务信息解析出来,封装成一个个的invoker对象,然后使用protocol将invoker转换为exporter

在转成exporter的过程中,会首先去启动netty服务端默认监听20880端口,然后去连接zookeeper注册中心,然后就是使用curator操作zookeeper,根据服务信息创建节点provider,写入服务相关信息,并且创建和监听configurators节点,将其中的数据保存一份到本地磁盘

到此为止,就走完了服务的暴露逻辑

dubbo源码分析7(服务暴露之远程暴露)

Original: https://www.cnblogs.com/wyq1995/p/15732086.html
Author: java小新人
Title: dubbo源码分析7(服务暴露之远程暴露)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574190/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 多线程笔记(二)

    多线程笔记(二) 1. Synchronized 和 Lock 的区别 synchronized是Java的关键字,是 JVM 层面的内置功能和实现。 Lock是一个接口,是代码层…

    Java 2023年6月8日
    061
  • 学习完nio的一个小笔记吧

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年11月10日
    0131
  • ConcurrentHashMap(1.7)分析

    先来了解ConcurrentHashMap中的几个成员,当然大多数与HashMap中的相似,我们只看独有的成员 构造函数 3 . 我们来看put()方法 来具体看一下Segemen…

    Java 2023年6月6日
    074
  • Python工具箱系列(四)

    上期描述了如何在Windows下安装官方的Python3.8,本期描述如何安装Anaconda。建立Python环境这个话题,为何要大费周章、不厌其烦的叙述呢,主要的原因是: 所有…

    Java 2023年6月16日
    067
  • Java 北京时间 转 UTC时间

    ” 北京时间” 转为” UTC时间“,根据需要转换格式不同,实现方式有所不同。 简单整理如下4种格式: 1、UTC格式:2021-1…

    Java 2023年5月29日
    048
  • 面试官:你说你精通Redis,你看过持久化的配置吗?

    前边我们已经介绍了 Redis 五种数据类型的命令与 配置文件的基本配置,今天让我们从理论和配置两个层面来揭开 Redis持久化的神秘面纱。 所谓持久化可以简单理解为将内存中的数据…

    Java 2023年6月5日
    057
  • 架构设计之设计模式总结

    在实际项目开发中我们会经常使用到设计模式,设计模式是否能够正确、合理、灵活的运用到项目当中,是评判你开发能力的重要指标之一, 这一方面需要你打下牢固的编程基础,同时也需要积累大量的…

    Java 2023年6月9日
    089
  • 分治思维谈管道模式

    本文摘自我的公众号:【陶朱公Boy】。也欢迎大家关注我的公众号,里面有很多优质的文章包括架构、面试、学习方法论等。 文章:《分治思维谈管道模式》 回复关键字” pipe…

    Java 2023年6月15日
    052
  • 常用开发工具的安装和使用

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年10月24日
    0330
  • 保姆级服务,一键 Git Worktree,这样满意吗?

    前言 上一篇文章Git Worktree 高级使用 整体反应不错,这完全是日常开发中可以用到的奇淫技巧。微服务环境下,通常我们都会有多个 repo,高级用法好归好,但每个 repo…

    Java 2023年6月5日
    069
  • 实时折射、镜面反射shader

    原文链接:http://www.ceeger.com/forum/read.php?tid=3162&fid=2 Unity没有原生的实时镜面反射Shader,分享几个自己…

    Java 2023年5月30日
    056
  • Nginx作反向代理时超时重试配置

    nginx重置,nginx超时 这里只讨论作反向代理时,当上游服务发生如接口超时、返回指定状态码等状况时而导致nginx超时重试。 这里使用的nginx版本为 1.16.1,可通过…

    Java 2023年6月8日
    075
  • SpringBoot三招组合拳,手把手教你打出优雅的后端接口

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年9月22日
    0194
  • NO2:自动生成sql语句

    SQL语句自动生成工具 大哉乾元 2016/2/26 作者原创转载请注明出处 前言 这个程序是几年前做成的,现在整理成文档和大家分享,当时参与的项目中大量使用的sql语句,所以Sq…

    Java 2023年6月8日
    061
  • Spring中常见的注解

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年11月10日
    0170
  • Java—泛型

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Java 2022年10月20日
    0194
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球