Dubbo 服务暴露

news2024/11/24 4:06:20

Dubbo 服务暴露

1. 服务暴露时序图

在这里插入图片描述

2. 源码分析

DubboBootstrap.exportServices

从配置管理器中获取到所有的ServiceConfig实例,遍历,然后一个一个的暴露。

在这里插入图片描述

ServiceConfig.export

  • 如果DubboBootstrap为空,也就没有初始化,就初始化一下DubboBootstrap
  • init serviceMetadata 初始化服务的原数据信息
  • export服务,判断是否延时export
  • 发布ServiceConfigExportedEvent事件

在这里插入图片描述

ServiceConfig.doExportUrls

一个服务ServiceConfig可能同时以多个协议export。

  • 获取服务注册中心的URL地址信息,一个服务可以同事在多个注册中心注册
  • 遍历服务要暴露的协议集合。一个服务可能同时以dubbo协议,rest协议等export。一般默认是dubbo协议,也推荐是用dubbo协议

在这里插入图片描述

ServiceConfig.doExportUrlsFor1Protocol

  • 设置协议名称,默认为dubbo
  • 设置各个参数,包括side、metadata-type、provider等等
  • 填充方法级别的各个参数,即dubbo:method 中的各个参数
  • 设置是否generic
  • 设置token ServiceConfig token
  • 初始化 serviceMetadata attachments
  • 生成对应service的url,填充host、port参数
  • 如果自定义ConfiguratorFactory,则获取自定义的参数
  • 获取scope参数,非remote,则执行exportLocal
  • 如果scope不是local,registryURLs不为空,则根据对应的registryURLs,循环生成url,invoker,wrapperInvoker对象,最终执行PROTOCOL#export(wrapperInvoker),完成暴露
  • 如果scope不是local,且registryURLs为空,则生成invoker,wrapperInvoker执行执行PROTOCOL#export(wrapperInvoker),完成。

通过以上流程,我们可以看到核心的暴露方法为exportLocal和PROTOCOL.export两个方法。

  • scope = none,不导出服务
  • scope != remote,导出到本地
  • scope != local,导出到远程

ProxyFactory.getInvoker

Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。

不管是导出到本地,还是远程。进行服务导出之前,均需要先创建 Invoker,这是一个很重要的步骤。因此下面先来分析 Invoker 的创建过程。

Invoker 是由 ProxyFactory 创建而来,Dubbo 默认的 ProxyFactory 实现类是 JavassistProxyFactory。

在这里插入图片描述

ServiceConfig.exportLocal

exportLocal 方法比较简单,首先根据 URL 协议头决定是否导出服务。若需导出,则创建一个新的 URL 并将协议头、主机名以及端口设置成新的值。然后创建 Invoker,并调用 InjvmProtocol 的 export 方法导出服务。

在这里插入图片描述

RegistryProtocol.exportRemote

与导出服务到本地相比,导出服务到远程的过程要复杂不少,其包含了服务导出与服务注册两个过程。这两个过程涉及到了大量的调用,比较复杂。

  • 调用 doLocalExport 导出服务
  • 向注册中心注册服务
  • 向注册中心进行订阅 override 数据
  • 创建并返回 DestroyableExporter
    在这里插入图片描述

DubboProtocol.export

假设运行时协议为 dubbo,此处的 protocol 变量会在运行时加载 DubboProtocol,并调用 DubboProtocol 的 export 方法。
在这里插入图片描述

openServer

在这里插入图片描述

服务注册

服务注册主要在 RegistryProtocol.export.

在这里插入图片描述

在这里插入图片描述

3. 总结

本篇文章详细分析了 Dubbo 服务导出过程,包括配置检测,URL 组装,Invoker 创建过程、导出服务以及注册服务等等。

4. 鸣谢

服务导出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

猴子都能看懂的噪声(noise)专题

背景 除了生成各种奇形怪状与自然景观,噪声也有其他美妙的用途! 工作原因,经常接触与噪声相关的画面效果(火焰啊,画面扰动啊之类的),做的时候一知半解,傻傻分不清楚各种形态的nois…

Java文件:XWPFDocument导出Word文档

文章目录一、前言二、基本的概念三、Maven依赖(JAR)四、Word模板1.正文段落2.正文表格3.页眉4.页脚五、XWPFDocument的使用5.4导出Word文档1.word模板2.PdfTest测试类3.ISystemFileService接口4.SystemFileServiceImpl实现类5.结果六、遇到问题5.1输出为word的时候换行符无效一…

NR5G基础概念扫盲

文章目录前言BWP未完待续前言 随着人工智能、万物互联时代的到来,人类社会进入到一个新的阶段。新兴的科技产业对信息社会基础设施提出了更高的要求,对低时延、大带宽、高流量的需求,催生了5G技术,并推动其蓬勃发展。通信&#x…

【深入浅出XML】包装纯粹信息的标记语言

XMLXML的定义和概述🎶XML的定义🎶XML的最好描述🎶HTML和XML的重要区别🎶XML的文档结构🎶其他一些标记XML和优势🎶XML的优势XML解析🎶DOM解析❔解析测试🤞解析步骤🤞案例测…

在Windows部署Java的Jar包

背景 使用 Java 编写了一些有用的工具,因为不方便部署到服务器上,所以需要把 Java 生成的 jar 包在本地 Windows 上部署。 查阅了几种部署方式,认为通过 winsw 进行部署最方便。 安装 winsw 进入 winsw 的下载页面,下载 sampl…

【ROS2 入门】ROS 2 参数服务器(parameters)概述

大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从ROS1切换到ROS2,在上一篇中,我们一起了解ROS 2中Topic, 这一篇,我们主要会围绕ROS中另外一个重要的概念“Parameters ”&am…

图的拓扑排序(AOV网络)

文章目录拓扑排序概念实现邻接表(队列)邻接矩阵(栈)总结源代码邻接表邻接矩阵拓扑排序 概念 拓扑排序是对有向无环图的顶点的一种排序. AOV网络 : 在有向图中, 用顶点表示活动或者任务, 弧表示活动或者任务间的优先关系, 则此有向图称为用顶点表示活动的网络(Activity On Ve…

小程序介绍和注册安装

小程序介绍和注册安装微信小程序介绍小程序特点其它平台小程序注册微信小程序开发帐号获取appidappid简介微信开发者工具安装创建一个小程序项目核心步骤微信开发者工具构成微信小程序介绍 简短定义:微信小程序是运行在微信APP中的一个程序。 常见小程序 行程码拼…

UDS诊断系列介绍11-3E服务

本文框架1. 系列介绍1.1 3E服务概述2. 3E服务请求与应答2.1 3E服务请求2.2 3E服务正响应2.3 3E服务否定响应3. Autosar系列文章快速链接1. 系列介绍 UDS(Unified Diagnostic Services)协议,即统一的诊断服务,是面向整车所有ECU的…

# 【笔记】大话设计模式21-23

【笔记】大话设计模式21-23 文章目录【笔记】大话设计模式21-23单例模式21.1 Example21.2 定义21.3 Show me the code一般单例代码(**懒汉模式**)静态初始化(**饿汉模式**)21.4 总结22 桥接模式22.1 Example22.2 定义22.3 Show me the code22.4 总结23 命…

Code for VeLO 1: Training Versatile Learned Optimizers by Scaling Up

Code for VeLO 1: Training Versatile Learned Optimizers by Scaling Up 这篇文章将介绍一下怎么用VeLO进行训练。 这篇文章基于https://colab.research.google.com/drive/1-ms12IypE-EdDSNjhFMdRdBbMnH94zpH#scrollToRQBACAPQZyB-,将介绍使用learned optimizer in…

入门力扣自学笔记230 C++ (题目编号:2293)

2293. 极大极小游戏 题目: 给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。 对 nums 执行下述算法: 设 n 等于 nums 的长度,如果 n 1 ,终止 算法过程。否则,创建 一个新的整数数组 newNums …

【Python百日进阶-数据分析】Day226 - plotly的仪表盘go.Indicator()

文章目录一、语法二、参数三、返回值四、实例4.1 Bullet Charts子弹图4.1.1 基本子弹图4.1.2 添加步骤和阈值4.1.3 自定义子弹4.1.4 多子弹4.2 径向仪表图4.2.1 基本仪表4.2.2 添加步骤、阈值和增量4.2.3 自定义仪表图4.3 组合仪表图4.3.1 组合仪表图4.3.2 单角量规图4.3.3 子弹…

Android 深入系统完全讲解(19)

技术的学习关键点 是什么?思路。 而我这里分享一个学习的经典路线,先厘清总框架,找到思路,然后再逐步击破。 这里关于音视频的就是: 总体分为几部分: 1 绘制 2 编解码格式 3 Android 平台的 FFmpeg 开源移…

Compressed Sensing——从零开始压缩感知

Problem 考虑一个线性方程组求解问题: Axb(1)A x b \tag{1}Axb(1) 其中,A∈RmnA \in\mathbb R^{m\times n}A∈Rmn,x∈Rn1x \in\mathbb R^{n\times 1}x∈Rn1,b∈Rm1b \in\mathbb R^{m\times 1}b∈Rm1且m≪nm \ll nm≪n 这是一个…

【C++11】—— lambda表达式

目录 一、lambda表达式的简介 二、lambda表达式的基本语法 三、lambda表达式的使用方法 四、lambda表达式的底层原理 一、lambda表达式的简介 lambda表达式就类似于仿函数,相比仿函数要更加的简洁,我们看一下下面的代码: //商品类 struct…

【项目实战】使用MybatisPlus乐观锁插件功能

一、背景 当要更新一条记录时,希望这条记录没有被别人更新,可以考虑使用MybatisPlus乐观锁插件功能来实现以上需求。 二、乐观锁介绍 2.1 乐观锁是什么? 乐观锁是一种乐观思想,即认为读多写少,遇到并发的可能性低&…

使用ASM框架创建ClassVisitor时遇到IllegalArgumentException的一种可能解决办法

背景 ASM是java语言中最为广泛使用的插装框架,其优点在于可以动态地在运行时改变java系统的行为,加入我们自己的逻辑。在软件测试领域应用广泛。但是其使用难度很高,一方面使用asm框架需要对java底层知识有较高的了解,另一方面网…

网页共享电脑屏幕与播放(带声音)

这次项目我们是写的一个课堂辅助软件的网页版,其中有一个功能感觉能作为我们项目的一个亮点,就是直播功能,在之前并没有写过这个东西。虽然现在这个功能还不知道怎么写,但是它的流程终归是利用视频流将本地的视频给共享出去&#…

Verilog:【8】基于FPGA实现SD NAND FLASH的SPI协议读写

碎碎念: 终于熬过了期末周,可以开始快乐的开发之旅了。 这一期作为一千粉后的首篇博客,由于之后项目会涉及到相关的部分,因此介绍的是使用FPGA实现SD NAND FLASH的读写操作,以雷龙科技提供的SD NAND FLASH样品为例&…