003-Dubbo服务的发布和引用

目录

  • Dubbo3.0
    • 发布注册
      • 应用级注册-配置
      • 应用级注册-端口
      • 应用级注册-消费者-确定服务信息
      • 应用级注册-消费者-元数据中心
      • 应用级注册-提供者-提供者zk实例端口
      • 应用级注册-消费者读取服务流程
    • 注册步骤
      • 接口服务导出
      • 应用服务导出
    • 服务引入步骤
      • 强制接口(FORCE_INTERFACE)
      • 强制应用(FORCE_APPLICATION)
      • 如果配置两个都要有(APPLICATION_FIRST)
    • 其他细节
      • 新老版本兼容-权重控制

Dubbo3.0

发布注册

应用级注册-配置

因为接口级注册随着服务增多,注册中压力会越来越大
所以在3.0版本提供了应用级注册

#默认是all 接口和应用都会注册(监控)
#如果确定没有3.0一下调用就直接改为 instance 只走应用注册
#注册中心每个应用是一个目录
dubbo.application.register-mode=instance

应用级注册-端口

如果有dubbo协议端口就存dubbo配置的端口
没有的话就取第一个配置的端口

应用级注册-消费者-确定服务信息

服务的信息 ServiceInfo(name\group\version\protocol\path\params)
在提供者那边会解析并存入 MetadataInfo对象中
最后统一存入注册中心
这里其实是元数据,这里可以拆分存储

  1. 元数据存入元数据中心
  2. 应用信息(ip:port)存入注册中心

应用级注册-消费者-元数据中心

默认是服务提供者本地开启一个Dobbo元数据服务
#默认是local 可以改为remote注册到远程
dubbo.application.metadata-type=local

元数据存储在zk路径:
dubbo/metadata/dubbo-springboot-demo-provider/应用id
内容为:
003-Dubbo服务的发布和引用_第1张图片
存储本地路径为:

The MetadataService exports urls : [dubbo://192.168.3.2:20880/org.apache.dubbo.metadata.MetadataService?anyhost=true&application=dubbo-learn-provider&background=false
&bind.ip=192.168.3.2&bind.port=20880&corethreads=2&delay=0&deprecated=false&dubbo=2.0.2&dynamic=true&executes=100&executor-management-mode=default&file.cache=true&generic=false
&getAndListenInstanceMetadata.1.callback=true&getAndListenInstanceMetadata.return=true&getAndListenInstanceMetadata.sent=true&group=dubbo-learn-provider&interface=org.apache.dubbo.metadata.MetadataService
&metadata-type=local&methods=exportInstanceMetadata,getAndListenInstanceMetadata,getExportedServiceURLs,getExportedURLs,getExportedURLs,getExportedURLs,getExportedURLs,getExportedURLs,getInstanceMetadataChangedListenerMap,getMetadataInfo,getMetadataInfos,getMetadataURL,getServiceDefinition,getServiceDefinition,getSubscribedURLs,isMetadataService,serviceName,toSortedStrings,toSortedStrings,version
&pid=14088&prefer.serialization=fastjson2,hessian2&qos.enable=true&register=false&release=3.2.0-beta.4&revision=3.2.0-beta.4&service-name-mapping=true&side=provider
&threadpool=cached&threads=100&timestamp=1689088500541&version=1.0.0], dubbo version: 3.2.0-beta.4, current host: 192.168.3.2

应用级注册-提供者-提供者zk实例端口

如果服务只注册了非dubbo协议,
配置了local也会默认开启一个dubbo服务端口提供元数据查询
端口则是从20880开始 new ServerSocket(端口)
如果异常则说明端口被占用 catch之后什么也没做
端口+1继续尝试
003-Dubbo服务的发布和引用_第2张图片

应用级注册-消费者读取服务流程

消费者最终其实要根据接口和方法来找到对应的 url
比如: dubbo://127.0.0.1:10880/geoName

  1. 根据@DubboReference注解的接口查询zk的mapping节点,获取对应的应用
    003-Dubbo服务的发布和引用_第3张图片
  2. 根据应用查询对应的实例,节点:services/dubbo-learn-provider
    003-Dubbo服务的发布和引用_第4张图片
    这个可以知道此实例(应用级)元数据信息存在哪里
  3. 调用元数据信息就知道实例提供的此接口到底是什么协议,这里协议的端口还是在zk的实例信息里存着,具体见上图,这样组合就知道url是什么,在容器启动的时候就能创建对应的Invoker

003-Dubbo服务的发布和引用_第5张图片

org.apache.dubbo.rpc.protocol.dubbo.DubboInvoker
org.apache.dubbo.rpc.protocol.tri.TripleInvoker

注册步骤

接口服务导出

接口解析
组装MatadataInfo对象

应用服务导出

启动元数据端口或者传入远程元数据中心

生成实例对象 DefaultServiceInstance
003-Dubbo服务的发布和引用_第6张图片
实例编号是所有服务的信息(接口+参数)组成的字符串最后md5得到的
所有如果服务出现变动编号就会改变

服务引入步骤

解析注解
获取服务代理对象 MigrationInvoker

强制接口(FORCE_INTERFACE)

根据不同的路径(XXXInvoker)组合生成的ClusterInvoker
赋值给MigrationInvoker的invoker和currentAvailableInvoker属性

强制应用(FORCE_APPLICATION)

元数据中心查询接口对应的应用名
找到对应的所有实例

单个实例遍历:
注册中心查询实例信息
查询所有接口和协议
生成Url
根据服务过滤

如果配置两个都要有(APPLICATION_FIRST)

场景:新老dubbo版本切换
则会接口和应用都会走
并且合并
但是在真实调用服务的时候会计算接口是否有新的提供
如果有则走新的

MighrationInvoker中
invoker:保存所有接口级别对应的invoker
serviceDiscoveryInvoker 保存所有应用级别对应的invoker
currentAvailableInvoker:保存最终调用的invoker

其他细节

新老版本兼容-权重控制

如果新老版本接口都有,可以配置 promotion作为老的权重(默认100走新的)

你可能感兴趣的:(dubbo,dubbo)