因为接口级注册随着服务增多,注册中压力会越来越大
所以在3.0版本提供了应用级注册
#默认是all 接口和应用都会注册(监控)
#如果确定没有3.0一下调用就直接改为 instance 只走应用注册
#注册中心每个应用是一个目录
dubbo.application.register-mode=instance
如果有dubbo协议端口就存dubbo配置的端口
没有的话就取第一个配置的端口
服务的信息 ServiceInfo(name\group\version\protocol\path\params)
在提供者那边会解析并存入 MetadataInfo对象中
最后统一存入注册中心
这里其实是元数据,这里可以拆分存储
默认是服务提供者本地开启一个Dobbo元数据服务
#默认是local 可以改为remote注册到远程
dubbo.application.metadata-type=local
元数据存储在zk路径:
dubbo/metadata/dubbo-springboot-demo-provider/应用id
内容为:
存储本地路径为:
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®ister=false&release=3.2.0-beta.4&revision=3.2.0-beta.4&service-name-mapping=true&side=provider
&threadpool=cached&threads=100×tamp=1689088500541&version=1.0.0], dubbo version: 3.2.0-beta.4, current host: 192.168.3.2
如果服务只注册了非dubbo协议,
配置了local也会默认开启一个dubbo服务端口提供元数据查询
端口则是从20880开始 new ServerSocket(端口)
如果异常则说明端口被占用 catch之后什么也没做
端口+1继续尝试
消费者最终其实要根据接口和方法来找到对应的 url
比如: dubbo://127.0.0.1:10880/geoName
org.apache.dubbo.rpc.protocol.dubbo.DubboInvoker
org.apache.dubbo.rpc.protocol.tri.TripleInvoker
接口解析
组装MatadataInfo对象
启动元数据端口或者传入远程元数据中心
生成实例对象 DefaultServiceInstance
实例编号是所有服务的信息(接口+参数)组成的字符串最后md5得到的
所有如果服务出现变动编号就会改变
解析注解
获取服务代理对象 MigrationInvoker
根据不同的路径(XXXInvoker)组合生成的ClusterInvoker
赋值给MigrationInvoker的invoker和currentAvailableInvoker属性
元数据中心查询接口对应的应用名
找到对应的所有实例
单个实例遍历:
注册中心查询实例信息
查询所有接口和协议
生成Url
根据服务过滤
场景:新老dubbo版本切换
则会接口和应用都会走
并且合并
但是在真实调用服务的时候会计算接口是否有新的提供
如果有则走新的
MighrationInvoker中
invoker:保存所有接口级别对应的invoker
serviceDiscoveryInvoker 保存所有应用级别对应的invoker
currentAvailableInvoker:保存最终调用的invoker
如果新老版本接口都有,可以配置 promotion作为老的权重(默认100走新的)