You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@dubbo.apache.org by "FoghostCn (via GitHub)" <gi...@apache.org> on 2023/09/22 11:43:54 UTC
[GitHub] [dubbo-go] FoghostCn opened a new issue, #2432: dubbo-go metadata 模块梳理
FoghostCn opened a new issue, #2432:
URL: https://github.com/apache/dubbo-go/issues/2432
### metadata 数据主要分 4 个主要部分:
1. 应用实例接口配置元数据:/dubbo/metadata/dubbo.io/${revision},内容如下所示:
```json
{
"app" : "dubbo.io",
"revision" : "4647984502",
"services" : {
"dubbo-go/org.apache.dubbogo.samples.api.Greeter:3.0.1:tri" : {
"name" : "org.apache.dubbogo.samples.api.Greeter",
"group" : "dubbo-go",
"version" : "3.0.1",
"protocol" : "tri",
"path" : "org.apache.dubbogo.samples.api.Greeter",
"params" : {
"application" : "dubbo.io",
"cluster" : "failover",
"group" : "dubbo-go",
"loadbalance" : "random",
"release" : "dubbo-golang-3.0.4",
"timestamp" : "1695208370",
"version" : "3.0.1"
}
}
}
}
```
2. provider 元数据 /dubbo/metadata/org.apache.dubbogo.samples.api.Greeter/3.0.1/dubbo-go/provider,内容如下所示:
```json
{
"parameters" : {
"accesslog" : "",
"app.version" : "3.0.1",
"application" : "dubbo.io",
"auth" : "",
"bean.name" : "GreeterProvider",
"cluster" : "failover",
"config.tracing" : "",
"environment" : "",
"execute.limit" : "",
"execute.limit.rejected.handler" : "",
"export" : "true",
"group" : "dubbo-go",
"interface" : "org.apache.dubbogo.samples.api.Greeter",
"loadbalance" : "random",
"max-server-recv-msg-size" : "4mib",
"max-server-send-msg-size" : "",
"metadata-type" : "remote",
"module" : "sample",
"name" : "dubbo.io",
"organization" : "dubbo-go",
"owner" : "dubbo-go",
"param.sign" : "",
"pid" : "55273",
"registry" : "zookeeper",
"registry.role" : "3",
"release" : "dubbo-golang-3.0.4",
"retries" : "",
"serialization" : "",
"service.filter" : "echo,token,accesslog,tps,generic_service,execute,pshutdown,metrics",
"side" : "provider",
"timestamp" : "1695208370",
"tps.limit.interval" : "",
"tps.limit.rate" : "",
"tps.limit.rejected.handler" : "",
"tps.limit.strategy" : "",
"tps.limiter" : "",
"version" : "3.0.1",
"warmup" : ""
},
"canonicalName" : "org.apache.dubbogo.samples.api.Greeter",
"codeSource" : "",
"methods" : [ {
"name" : "SayHello",
"parameterTypes" : [ "ptr" ],
"returnType" : "ptr",
"parameters" : null
}, {
"name" : "SayHelloStream",
"parameterTypes" : [ "interface" ],
"returnType" : "",
"parameters" : null
} ],
"types" : null
}
```
3. consumer 元数据 /dubbo/metadata/org.apache.dubbogo.samples.api.Greeter/3.0.1/dubbo-go/consumer,内容如下所示:
```json
{
"app.version" : "3.0.1",
"application" : "dubbo.io",
"async" : "false",
"bean.name" : "GreeterClientImpl",
"cluster" : "failover",
"config.tracing" : "",
"environment" : "",
"generic" : "",
"group" : "dubbo-go",
"interface" : "org.apache.dubbogo.samples.api.Greeter",
"loadbalance" : "",
"metadata-type" : "remote",
"module" : "sample",
"name" : "dubbo.io",
"organization" : "dubbo-go",
"owner" : "dubbo-go",
"provided-by" : "",
"reference.filter" : "cshutdown,metrics",
"registry.role" : "0",
"release" : "dubbo-golang-3.0.4",
"retries" : "",
"serialization" : "",
"side" : "consumer",
"sticky" : "false",
"timestamp" : "1695208341",
"version" : "3.0.1"
}
```
4. mapping 接口 - 应用映射关系信息 /dubbo/mapping/org.apache.dubbo.samples.api.GreetingsService,内容为应用名(applicationName)
```
first-dubbo-provider
```
### medatadata 相关文件分布:
```
common
├── extension // 扩展相关
│ ├── metadata_remote.go
│ ├── metadata_report_factory.go
│ ├── metadata_service.go
│ ├── metadata_service_exporter.go
│ ├── metadata_service_proxy_factory.go
├── metadata_info.go // 实例 metadata 实体定义 for /dubbo/metadata/dubbo.io/reversion
config
├── instance
│ ├── metadata_report.go // MetadataReport 全局缓存
│ ├── registry_metadata_report.go // registry 相关 MetadataReport 缓存?
├── metadata_report_config.go // 配置相关实体
metadata
├── definition
│ ├── definition.go // 实体定义 provider for /dubbo/metadata/org.apache.dubbogo.samples.api.Greeter/3.0.1/dubbo-go/provider,consumer 是个 map
│ └── mock.go
├── identifier // MetadataReport 接口参数定义
│ ├── base_metadata_identifier.go
│ ├── metadata_identifier.go
│ ├── service_metadata_identifier.go
│ ├── subscribe_metadata_identifier.go
├── mapping // 接口与应用之间的对应关系 for /dubbo/mapping/org.apache.dubbo.samples.api.GreetingsService
│ ├── memory
│ │ └── service_name_mapping.go
│ ├── metadata
│ │ └── service_name_mapping.go
│ ├── mock_service_name_mapping.go
│ └── service_name_mapping.go
├── report // MetadataReport 各种实现
│ ├── delegate
│ │ ├── delegate_report.go
│ ├── etcd
│ │ ├── report.go
│ ├── factory
│ │ └── report_factory.go
│ ├── nacos
│ │ ├── report.go
│ ├── report.go // MetadataReport 定义,数据上报元数据中心
│ ├── reporter_metric.go // metric 装饰,添加 metric 事件总线发布
│ └── zookeeper
│ └── report.go
└── service // MetadataService 相关,对其他模块提供 medatadata 接口
├── exporter // MetadataService export as service
│ ├── configurable
│ │ ├── exporter.go
│ └── exporter.go
├── local
│ ├── metadata_service_proxy_factory.go
│ ├── service.go
│ ├── service_proxy.go
│ └── service_test.go
├── local_service.go
├── remote
│ ├── service.go
└── remote_service.go
```
### metadata 依赖方:
```
// Metadata 本身维护或扩展
common/extension/metadata_remote.go
common/extension/metadata_report_factory.go
common/extension/metadata_service_exporter.go
common/extension/metadata_service_proxy_factory.go
common/extension/metadata_service.go
common/extension/service_name_mapping.go
config/instance/metadata_report.go
config/instance/registry_metadata_report.go
// 依赖方
config/config_loader.go
config/root_config.go
config/service_config.go
config/metadata_report_config.go
config/registry_config.go
registry/event/metadata_service_url_params_customizer.go
registry/event/protocol_ports_metadata_customizer.go
registry/event/service_revision_customizer.go
registry/servicediscovery/service_discovery_registry.go
registry/servicediscovery/service_instances_changed_listener_impl.go
```
- 依赖细节:
```
config/config_loader.go:
79: func registerServiceInstance() {
109: if remoteMetadataService, err := extension.GetRemoteMetadataService(); err == nil && remoteMetadataService != nil {
110: remoteMetadataService.PublishMetadata(GetApplicationConfig().Name)
config/metadata_report_config.go:
83: func (mc *MetadataReportConfig) StartMetadataReport() error {
88: instance.SetMetadataReportInstance(tmpUrl)
91: return perrors.Wrap(err, "Start MetadataReport failed.")
96: localService, err := extension.GetLocalMetadataService(constant.DefaultKey)
105: if remoteMetadataService, err := extension.GetRemoteMetadataService(); err == nil && remoteMetadataService != nil {
106: remoteMetadataService.PublishServiceDefinition(url)
110: // selectMetadataServiceExportedURL get already be exported url
111: func selectMetadataServiceExportedURL() *common.URL {
113: metaDataService, err := extension.GetLocalMetadataService(constant.DefaultKey)
118: urlList, err := metaDataService.GetExportedURLs(constant.AnyValue, constant.AnyValue, constant.AnyValue, constant.AnyValue)
config/registry_config.go:
98: instance.SetMetadataReportInstanceByReg(tmpUrl)
config/root_config.go:
176: if err := rc.MetadataReport.Init(rc); err != nil {
215: exportMetadataService()
224: MetadataReport: NewMetadataReportConfigBuilder().Build(),
348: func exportMetadataService() {
349: ms, err := extension.GetLocalMetadataService(constant.DefaultKey)
366: expt := extension.GetMetadataServiceExporter(constant.DefaultKey, ms)
386: func publishMapping(sc exporter.MetadataServiceExporter) error {
config/service_config.go:
323: ms, err := extension.GetLocalMetadataService("")
328: if err := ms.SetMetadataServiceURL(ivkURL); err != nil {
config/instance/registry_metadata_report.go:
35: regInstances = make(map[string]report.MetadataReport, 8)
39: // GetMetadataReportByRegistryProtocol obtain metadata report instance through registry config
40: func GetMetadataReportByRegistryProtocol(protocol string) report.MetadataReport {
57: // SetMetadataReportInstanceByReg set metadata reporting instances by registering urls
58: func SetMetadataReportInstanceByReg(url *common.URL) {
65: fac := extension.GetMetadataReportFactory(url.Protocol)
67: regInstances[url.Protocol] = fac.CreateMetadataReport(url)
registry/event/metadata_service_url_params_customizer.go:
58: ms, err := local.GetLocalMetadataService()
63: url, err := ms.GetMetadataServiceURL()
74: instance.GetMetadata()[constant.MetadataServiceURLParamsPropertyName] = string(str)
registry/event/protocol_ports_metadata_customizer.go:
51: metadataService, err := local.GetLocalMetadataService()
60: list, err := metadataService.GetExportedServiceURLs()
registry/event/service_revision_customizer.go:
54: ms, err := local.GetLocalMetadataService()
81: ms, err := local.GetLocalMetadataService()
registry/servicediscovery/service_discovery_registry.go:
67: metaDataService service.MetadataService
83: metaDataService, err := local.GetLocalMetadataService()
95: metaDataService: metaDataService,
106: return s.metaDataService.UnexportURL(url)
113: err := s.metaDataService.UnsubscribeURL(url)
184: ok, err := s.metaDataService.ExportURL(url)
211: _, err := s.metaDataService.SubscribeURL(url)
registry/servicediscovery/service_instances_changed_listener_impl.go:
225: remoteMetadataServiceImpl, err := extension.GetRemoteMetadataService()
229: metadataInfo, err = remoteMetadataServiceImpl.GetMetadata(instance)
235: proxyFactory := extension.GetMetadataServiceProxyFactory(constant.DefaultKey)
236: metadataService := proxyFactory.GetProxy(instance)
237: metadataInfo, err = metadataService.GetMetadataInfo(revision)
```
参考文献:
1. [https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/metadata-center/overview/](https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/metadata-center/overview/)
2. [https://cn.dubbo.apache.org/zh-cn/overview/reference/proposals/service-discovery/](https://cn.dubbo.apache.org/zh-cn/overview/reference/proposals/service-discovery/)
3. [https://cn.dubbo.apache.org/zh-cn/overview/reference/proposals/registry-config-meta/](https://cn.dubbo.apache.org/zh-cn/overview/reference/proposals/registry-config-meta/)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org
For additional commands, e-mail: notifications-help@dubbo.apache.org
Re: [I] dubbo-go metadata 模块梳理 [dubbo-go]
Posted by "FoghostCn (via GitHub)" <gi...@apache.org>.
FoghostCn closed issue #2432: dubbo-go metadata 模块梳理
URL: https://github.com/apache/dubbo-go/issues/2432
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org
For additional commands, e-mail: notifications-help@dubbo.apache.org
Re: [I] dubbo-go metadata 模块梳理 [dubbo-go]
Posted by "FoghostCn (via GitHub)" <gi...@apache.org>.
FoghostCn commented on issue #2432:
URL: https://github.com/apache/dubbo-go/issues/2432#issuecomment-1786377625
# Metadata模块优化 draft
- MetadataService 本地及对外暴露元数据接口
```go
// 从 ServiceDiscovery 列表中获取元数据信息
type MetadataService interface {
// 服务段暴露的接口 url
GetExportedServiceURLs() ([]*common.URL, error)
// 客户端订阅的接口 url
GetSubscribedURLs() ([]*common.URL, error)
// metadata 版本号
Version() (string, error)
// 获取本地服务发现的 metadataInfo,用于对外暴露,客户端可以通过这个接口获取应用 metadataInfo
GetMetadataInfo(revision string) (*MetadataInfo, error)
// 获取本地所有的服务发现的 metadataInfo 列表
getMetadataInfos()[]*MetadataInfo
// 获取 metadataService 服务的 url 参数
GetMetadataServiceURL() (*common.URL, error)
}
```
- MetadataInfo 存储 servicediscovery 相关元数据容器
```go
type MetadataInfo struct {
Reported bool `json:"-"`
App string `json:"app,omitempty"`
Revision string `json:"revision,omitempty"`
Services map[string]*ServiceInfo `json:"services,omitempty"`
exportedServiceURLs map[string]gxset.HashSet
subscribedServiceURLs map[string]gxset.HashSet
}
// 服务端 添加一个service 的 url,一个应用可以有多个服务暴露,一个接口可以有多个协议暴露
func (info *MetadataInfo) AddService(url *common.URL) (bool, error) {
}
// 服务端 删除一个 service 的 url 元数据
func (info *MetadataInfo) RemoveService(url *common.URL) error {
}
// 客户端 订阅一个 服务的 url 元数据
func (info *MetadataInfo) AddSubscribeURL(url *common.URL) (bool, error) {
}
// 客户端 删除一个订阅的服务 url 元数据
func (info *MetadataInfo) RemoveSubscribeURL(url *common.URL) error{
}
```
- ServiceDiscovery 的 metadata 接口
```go
// register/subscribe 时将元数据写入自身 metadataInfo,
// unregister/unsubscribe 时移除 metadataInfo 中相关内容
type ServiceDiscovery interface {
// 返回本地服务元数据
GetLocalMetadata() *MetadataInfo;
// 从本地缓存获取,否则从 MetadataReport 获取,否则从 rpc MetadataService 获取
GetRemoteMetadata(revision string) *MetadataInfo
}
```
- MetadataReport 接口
```go
// 接口均为应用级服务发现使用
type MetadataReport interface {
// GetAppMetadata get metadata info from report
// zookeeper: /dubbo/metadata/dubbo.io/${revision}
GetAppMetadata(*identifier.SubscriberMetadataIdentifier) (*MetadataInfo, error)
// PublishAppMetadata publish metadata info to reportss
// zookeeper: /dubbo/metadata/dubbo.io/${revision}
PublishAppMetadata(*identifier.SubscriberMetadataIdentifier, *MetadataInfo) error
// RegisterServiceAppMapping map the specified Dubbo service interface to current Dubbo app name
// zookeeper: /dubbo/mapping/org.apache.dubbo.samples.api.GreetingsService
RegisterServiceAppMapping(key string, group string, content string) error
// GetServiceAppMapping get the app names from the specified Dubbo service interface
// zookeeper: /dubbo/mapping/org.apache.dubbo.samples.api.GreetingsService
GetServiceAppMapping(key string, group string, MappingListener) (*gxset.HashSet, error)
// RemoveServiceAppMappingListener remove the serviceMapping listener by key and group
// zookeeper: /dubbo/mapping/org.apache.dubbo.samples.api.GreetingsService
RemoveServiceAppMappingListener(key string, group string) error
}
```
- 元数据中心数据维护流程
```go
Server:
start -> export -> register -> PublishAppMetadata && RegisterServiceAppMapping
Client:
start -> refer -> subscribe -> GetServiceAppMapping && GetAppMetadata ->
stop -> unsubscribe -> RemoveServiceAppMappingListener
```
- 目录调整:
```
common
├── extension
│ ├── metadata_remote.go // 取消扩展接口,操作远程 Metadata
│ ├── metadata_report_factory.go
│ ├── metadata_service.go // 取消扩展接口, MetadataService 本身
│ ├── metadata_service_exporter.go // 取消扩展接口 MetadataService 暴露方式
│ ├── metadata_service_proxy_factory.go // 取消扩展接口,rpc 调用 MetadataService
├── metadata_info.go // move to metadata 目录
config
├── instance // move to metadata 目录
│ ├── metadata_report.go // MetadataReport 实例化,全局缓存
│ ├── registry_metadata_report.go // registry 相关 MetadataReport 缓存
├── metadata_report_config.go // 配置相关实体
metadata
├── definition // 删除,不再需要
│ ├── definition.go // 实体定义 provider metadata
│ └── mock.go
├── identifier // move to metadata/report metadataReport 接口参数定义
│ ├── base_metadata_identifier.go
│ ├── metadata_identifier.go
│ ├── service_metadata_identifier.go
│ ├── subscribe_metadata_identifier.go
├── mapping
│ ├── memory
│ │ └── service_name_mapping.go
│ ├── metadata
│ │ └── service_name_mapping.go
│ ├── mock_service_name_mapping.go
│ └── service_name_mapping.go
├── report // MetadataReport 各种实现
│ ├── delegate
│ │ ├── delegate_report.go
│ ├── etcd
│ │ ├── report.go
│ ├── factory
│ │ └── report_factory.go
│ ├── nacos
│ │ ├── report.go
│ ├── report.go
│ ├── reporter_metric.go
│ └── zookeeper
│ └── report.go
└── service // 整体上移到 metadata 目录
├── exporter // MetadataService export as service
│ ├── configurable
│ │ ├── exporter.go
│ └── exporter.go // MetadataService 暴露接口定义,可扩展自定义实现?
├── local
│ ├── metadata_service_proxy_factory.go
│ ├── service.go
│ ├── service_proxy.go // rpc 获取 metadataInfo,可以简化实现,
│── service_test.go
├── local_service.go
├── remote
│ ├── service.go
└── remote_service.go // 应用级服务发现使用
```
- 调整后目录:
```
common
├── extension
│ ├── metadata_report_factory.go
config
├── metadata_report_config.go
metadata
├── metadata_info.go
├── configurableExporter.go // MetadataService 暴露接口定义,取消 extension 扩展
├── service.go // MetadataService 实现类
├── service_proxy.go // rpc 式调用 metadataService 接口,取消 extension 扩展
├── metadata_service.go // MetadataService 接口定义
├── mapping
│ ├── metadata
│ │ └── service_name_mapping.go
│ └── service_name_mapping.go
├── report
| ├── identifier
| │ ├── base_metadata_identifier.go
| │ ├── metadata_identifier.go
| │ ├── service_metadata_identifier.go
| │ ├── subscribe_metadata_identifier.go
│ ├── etcd
│ │ ├── report.go
│ ├── factory
│ │ └── report_factory.go
│ ├── nacos
│ │ └── report.go
| ├── zookeeper
| │ └── report.go
│ ├── delegate_report.go
│ ├── report.go
│ └── reporter_metric.go // metrics 相关,融入到基类或者 delegate_report
```
备注:
服务发现 zk 示例,路径 /services/{appName}/{IP}:{PORT}
```json
{
"name": "metrics-provider",
"id": "10.253.77.49:20880",
"address": "10.253.77.49",
"port": 20880,
"sslPort": null,
"payload": {
"@class": "org.apache.dubbo.registry.zookeeper.ZookeeperInstance",
"id": "10.253.77.49:20880",
"name": "metrics-provider",
"metadata": {
"dubbo.endpoints": "[{\"port\":20880,\"protocol\":\"dubbo\"}]",
"dubbo.metadata-service.url-params": "{\"prefer.serialization\":\"fastjson2,hessian2\",\"version\":\"1.0.0\",\"dubbo\":\"2.0.2\",\"release\":\"3.2.1\",\"side\":\"provider\",\"port\":\"20881\",\"protocol\":\"dubbo\"}",
"dubbo.metadata.revision": "a12dcb4cf2519a7aa7cc2539a256648e",
"dubbo.metadata.storage-type": "local",
"timestamp": "1698398778406"
}
},
"registrationTimeUTC": 1698403384382,
"serviceType": "DYNAMIC",
"uriSpec": null
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org
For additional commands, e-mail: notifications-help@dubbo.apache.org
Re: [I] dubbo-go metadata 模块梳理 [dubbo-go]
Posted by "FoghostCn (via GitHub)" <gi...@apache.org>.
FoghostCn commented on issue #2432:
URL: https://github.com/apache/dubbo-go/issues/2432#issuecomment-1786407261
# Metadata模块优化 draft
### 整体设想:
1. 删除 provider 和 cousumer 元数据上报,只保留应用级服务发现相关元内容及 MetadataService 服务
2. 考虑到 dubbo-go 这边也支持多注册中心,MetadataInfo 信息和服务发现实例相关联,与 java 实现一致
3. metadata 相关内容集中存放在 metadata 目录下,减少一些不必要的扩展接口
4. 精简接口实现无用接口全部移除
- MetadataService 本地及对外暴露元数据接口
```go
// 从 ServiceDiscovery 列表中获取元数据信息
type MetadataService interface {
// 服务端暴露的接口 url
GetExportedServiceURLs() ([]*common.URL, error)
// 根据参数获取服务端暴露的接口 url,tcp 接口调用使用到
GetExportedURLs(serviceInterface string, group string, version string, protocol string) ([]*common.URL, error)
// 客户端订阅的接口 url
GetSubscribedURLs() ([]*common.URL, error)
// metadata 版本号
Version() (string, error)
// 获取本地服务发现的 metadataInfo,用于对外暴露,客户端可以通过这个接口获取应用 metadataInfo
GetMetadataInfo(revision string) (*MetadataInfo, error)
// 获取本地所有的服务发现的 metadataInfo 列表,tcp 接口调用使用到
getMetadataInfos()[]*MetadataInfo
// 获取 metadataService 服务的 url 参数
GetMetadataServiceURL() (*common.URL, error)
}
```
- MetadataInfo 存储 servicediscovery 相关元数据容器
```go
type MetadataInfo struct {
Reported bool `json:"-"`
App string `json:"app,omitempty"`
Revision string `json:"revision,omitempty"`
Services map[string]*ServiceInfo `json:"services,omitempty"`
exportedServiceURLs map[string]gxset.HashSet
subscribedServiceURLs map[string]gxset.HashSet
}
// 服务端 添加一个service 的 url,一个应用可以有多个服务暴露,一个接口可以有多个协议暴露
func (info *MetadataInfo) AddService(url *common.URL) (bool, error) {
}
// 服务端 删除一个 service 的 url 元数据
func (info *MetadataInfo) RemoveService(url *common.URL) error {
}
// 客户端 订阅一个 服务的 url 元数据
func (info *MetadataInfo) AddSubscribeURL(url *common.URL) (bool, error) {
}
// 客户端 删除一个订阅的服务 url 元数据
func (info *MetadataInfo) RemoveSubscribeURL(url *common.URL) error{
}
```
- ServiceDiscovery 的 metadata 接口
```go
// register/subscribe 时将元数据写入自身 metadataInfo,
// unregister/unsubscribe 时移除 metadataInfo 中相关内容
type ServiceDiscovery interface {
// 返回本地服务元数据
GetLocalMetadata() *MetadataInfo;
// 从本地缓存获取,否则从 MetadataReport 获取,否则从 rpc MetadataService 获取
GetRemoteMetadata(revision string) *MetadataInfo
}
```
- MetadataReport 接口
```go
// 接口均为应用级服务发现使用
type MetadataReport interface {
// GetAppMetadata get metadata info from report
// zookeeper: /dubbo/metadata/dubbo.io/${revision}
GetAppMetadata(*identifier.SubscriberMetadataIdentifier) (*MetadataInfo, error)
// PublishAppMetadata publish metadata info to reportss
// zookeeper: /dubbo/metadata/dubbo.io/${revision}
PublishAppMetadata(*identifier.SubscriberMetadataIdentifier, *MetadataInfo) error
// RegisterServiceAppMapping map the specified Dubbo service interface to current Dubbo app name
// zookeeper: /dubbo/mapping/org.apache.dubbo.samples.api.GreetingsService
RegisterServiceAppMapping(key string, group string, content string) error
// GetServiceAppMapping get the app names from the specified Dubbo service interface
// zookeeper: /dubbo/mapping/org.apache.dubbo.samples.api.GreetingsService
GetServiceAppMapping(key string, group string, MappingListener) (*gxset.HashSet, error)
// RemoveServiceAppMappingListener remove the serviceMapping listener by key and group
// zookeeper: /dubbo/mapping/org.apache.dubbo.samples.api.GreetingsService
RemoveServiceAppMappingListener(key string, group string) error
}
```
- 元数据中心数据维护流程
```go
Server:
start -> export -> register -> PublishAppMetadata && RegisterServiceAppMapping
Client:
start -> refer -> subscribe -> GetServiceAppMapping && GetAppMetadata ->
stop -> unsubscribe -> RemoveServiceAppMappingListener
```
- 目录调整:
```
common
├── extension
│ ├── metadata_remote.go // 取消扩展接口,操作远程 Metadata
│ ├── metadata_report_factory.go
│ ├── metadata_service.go // 取消扩展接口, MetadataService 本身
│ ├── metadata_service_exporter.go // 取消扩展接口 MetadataService 暴露方式
│ ├── metadata_service_proxy_factory.go // 取消扩展接口,rpc 调用 MetadataService
├── metadata_info.go // move to metadata 目录
config
├── instance // move to metadata 目录
│ ├── metadata_report.go // MetadataReport 实例化,全局缓存
│ ├── registry_metadata_report.go // registry 相关 MetadataReport 缓存
├── metadata_report_config.go // 配置相关实体
metadata
├── definition // 删除,不再需要
│ ├── definition.go // 实体定义 provider metadata
│ └── mock.go
├── identifier // move to metadata/report metadataReport 接口参数定义
│ ├── base_metadata_identifier.go
│ ├── metadata_identifier.go
│ ├── service_metadata_identifier.go
│ ├── subscribe_metadata_identifier.go
├── mapping
│ ├── memory
│ │ └── service_name_mapping.go
│ ├── metadata
│ │ └── service_name_mapping.go
│ ├── mock_service_name_mapping.go
│ └── service_name_mapping.go
├── report // MetadataReport 各种实现
│ ├── delegate
│ │ ├── delegate_report.go
│ ├── etcd
│ │ ├── report.go
│ ├── factory
│ │ └── report_factory.go
│ ├── nacos
│ │ ├── report.go
│ ├── report.go
│ ├── reporter_metric.go
│ └── zookeeper
│ └── report.go
└── service // 整体上移到 metadata 目录
├── exporter // MetadataService export as service
│ ├── configurable
│ │ ├── exporter.go
│ └── exporter.go // MetadataService 暴露接口定义,可扩展自定义实现?
├── local
│ ├── metadata_service_proxy_factory.go
│ ├── service.go
│ ├── service_proxy.go // rpc 获取 metadataInfo,可以简化实现,
│── service_test.go
├── local_service.go
├── remote
│ ├── service.go
└── remote_service.go // 应用级服务发现使用
```
- 调整后目录:
```
common
├── extension
│ ├── metadata_report_factory.go
config
├── metadata_report_config.go
metadata
├── metadata_info.go
├── configurableExporter.go // MetadataService 暴露接口定义,取消 extension 扩展
├── service.go // MetadataService 实现类
├── service_proxy.go // rpc 式调用 metadataService 接口,取消 extension 扩展
├── metadata_service.go // MetadataService 接口定义
├── mapping
│ ├── metadata
│ │ └── service_name_mapping.go
│ └── service_name_mapping.go
├── report
| ├── identifier
| │ ├── base_metadata_identifier.go
| │ ├── metadata_identifier.go
| │ ├── service_metadata_identifier.go
| │ ├── subscribe_metadata_identifier.go
│ ├── etcd
│ │ ├── report.go
│ ├── factory
│ │ └── report_factory.go
│ ├── nacos
│ │ └── report.go
| ├── zookeeper
| │ └── report.go
│ ├── delegate_report.go
│ ├── report.go
│ └── reporter_metric.go // metrics 相关,融入到基类或者 delegate_report
```
备注:
服务发现 zk 示例,路径 /services/{appName}/{IP}:{PORT}
```json
{
"name": "metrics-provider",
"id": "10.253.77.49:20880",
"address": "10.253.77.49",
"port": 20880,
"sslPort": null,
"payload": {
"@class": "org.apache.dubbo.registry.zookeeper.ZookeeperInstance",
"id": "10.253.77.49:20880",
"name": "metrics-provider",
"metadata": {
"dubbo.endpoints": "[{\"port\":20880,\"protocol\":\"dubbo\"}]",
"dubbo.metadata-service.url-params": "{\"prefer.serialization\":\"fastjson2,hessian2\",\"version\":\"1.0.0\",\"dubbo\":\"2.0.2\",\"release\":\"3.2.1\",\"side\":\"provider\",\"port\":\"20881\",\"protocol\":\"dubbo\"}",
"dubbo.metadata.revision": "a12dcb4cf2519a7aa7cc2539a256648e",
"dubbo.metadata.storage-type": "local",
"timestamp": "1698398778406"
}
},
"registrationTimeUTC": 1698403384382,
"serviceType": "DYNAMIC",
"uriSpec": null
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org
For additional commands, e-mail: notifications-help@dubbo.apache.org