博客
关于我
Dubbo笔记③ : 服务发布流程 - ServiceConfig#export
阅读量:493 次
发布时间:2019-03-07

本文共 3023 字,大约阅读时间需要 10 分钟。

Apache Dubbo服务发布与注册中心机制深度分析

一、前言

本文为Dubbo学习笔记,基于《深度剖析Apache Dubbo 核心技术内幕》进行个人理解和总结。文中内容主要基于Dubbo 2.7.0版本,可能存在理解偏差,提建议。


2. ServiceConfig#export

在Dubbo中,服务的发布主要通过ServiceConfig#export方法实现。其核心逻辑主要包含以下几个步骤:

1. checkAndUpdateSubConfigs()

此方法主要负责检查并更新子配置,确保配置的完整性和一致性。具体包括:

  • 检查和更新全局配置参数,优先级为:ServiceConfig > ProviderConfig > ModuleConfig > ApplicationConfig。
  • 启动配置中心以获取最新配置。
  • 自动创建缺失配置项,并调用刷新配置功能。
  • 检查接口元信息,确保接口名不为空,并根据接口类型获取对应类。
  • 校验本地实现类和Stub实现类是否与接口一致。
  • 初始化调试样例,进行元数据检查。

2. doExport()

doExport方法是服务发布的核心入口,主要负责进行以下工作:

  • 检查导出状态,防止已取消导出。
  • 如果导出配置为空,直接返回。
  • 设置导出标记为已启用。
  • 根据配置获取唯一服务名和接口类信息。
  • 创建服务提供者模型,并初始化应用模型。
  • 调用doExportUrls方法,进行服务URL生成和注册。
  • 3. doExportUrls()

    doExportUrls是服务URL生成的核心方法,它主要负责:

  • 加载所有注册中心信息(支持多注册中心)。
  • 遍历所有协议配置,针对每个协议生成服务暴露URL。
  • 在触发时调用服务协议扩展点进行服务暴露。

  • 3.Dubbo中的URL

    Dubbo中的URL不仅是一个信息传递的容器,更是一个灵活的配置载体。URL格式遵循:

    protocol://username:password@host:port/path?key=value&key=value

    在Dubbo中,URL主要用于服务发现和信息传递,具体包含以下参数:

    • protocol:服务发布的协议类型,如 dubbothrifthttpzk 等。
    • username/password:用户名及密码认证信息。
    • host/port:服务主机及端口信息。
    • path:接口服务路径。
    • parameters:服务相关参数,如timeoutversion等。

    典型Dubbo URL示例:

    dubbo://192.168.1.6:20880/moe.cnkirito.sample.HelloService?timeout=3000zk://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=demo-consumer&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=1214&qos.port=33333&timestamp=1545721981946consumer://30.5.120.217/org.apache.dubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.0.2&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=1209&qos.port=33333&side=consumer&timestamp=1545721827784

    4. 服务发布流程解析

    服务的发布过程主要包含以下关键环节:

    4.1 计算服务唯一名称

    服务唯一名称通过以下方式生成:

    UniqueServiceName = ServiceConfig#service + "-" + interfaceName

    确保不同服务之间互不冲突。

    4.2 服务提供者模型创建

    创建ProviderModel,包含服务信息、服务引用信息及扩展信息。

    ProviderModel providerModel = new ProviderModel(getUniqueServiceName(), ref, interfaceClass);ApplicationModel.initProviderModel(getUniqueServiceName(), providerModel);

    4.3 服务URL生成

    通过doExportUrls方法生成服务暴露URL。对于支持多注册中心的协议,会先将服务信息注册至注册中心,再通过扩展点完成服务暴露。

    4.4 服务协议扩展点触发

    根据URL前缀(如 dubbo://)触发相应协议扩展点进行服务暴露。如果没有指定注册中心,Dubbo会通过双向通信直接完成服务暴露。


    5. 注册中心 支持详解

    5.1 导出服务的URL结构

    • 无注册中心:URL格式为:
    dubbo://service-host/com.foo.FooService?version=1.0.0
    • 有注册中心:URL格式为:
    registry://registry-host/org.apache.dubbo.registry.RegistryService?export=URL.encode("dubbo://service-host/com.foo.FooService?version=1.0.0")

    5.2 注册中心配置的注意事项

  • 检查是否配置了注册中心,如果不配置会默认创建一个。
  • 配置参数应包含注册中心地址、接口信息、应用名、协议版本、服务ID等。
  • URL参数如timestamp等用于灰度发布或版本控制。

  • 6. loadRegistries 方法解析

    loadRegistries方法负责解析和加载所有注册中心信息。主要逻辑包括:

  • 初始化空注册中心列表。
  • 遍历所有注册中心配置。
  • 对每个注册中心地址进行格式检查和参数配置。
  • 根据配置生成完整的URL。
  • 将符合条件的注册中心URL添加至列表中。
  • 参数拼接逻辑如下:

    Map
    params = new HashMap<>();params.put("path", serviceInterface);// 添加其他配置参数String finalUrl = UrlUtils.parseURLs(address, params).iterator().next().toString();

    7. 服务发布的关键点

  • 延迟发布ServiceConfig#export支持延迟发布,主要通过线程池定时触发doExport
  • 多协议支持: Dubbo支持多种协议(如 dubbothrift),通过protocol参数指定。
  • 多注册中心支持:支持多个服务注册中心,通过逻辑地址分割实现负载均衡。
  • 本地服务暴露:无需经常配置即可实现本地服务暴露,主要通过端口号识别。

  • 以上内容为对Dubbo 2.7.0版本服务发布及其注册中心机制的深度解析,供学习和研究参考。如有疑问或补充,请联系作者。

    转载地址:http://mykcz.baihongyu.com/

    你可能感兴趣的文章
    MySQL 的mysql_secure_installation安全脚本执行过程介绍
    查看>>
    MySQL 的Rename Table语句
    查看>>
    MySQL 的全局锁、表锁和行锁
    查看>>
    mysql 的存储引擎介绍
    查看>>
    MySQL 的存储引擎有哪些?为什么常用InnoDB?
    查看>>
    Mysql 知识回顾总结-索引
    查看>>
    Mysql 笔记
    查看>>
    MySQL 精选 60 道面试题(含答案)
    查看>>
    mysql 索引
    查看>>
    MySQL 索引失效的 15 种场景!
    查看>>
    MySQL 索引深入解析及优化策略
    查看>>
    MySQL 索引的面试题总结
    查看>>
    mysql 索引类型以及创建
    查看>>
    MySQL 索引连环问题,你能答对几个?
    查看>>
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>