GitHub user AlexStocks added a comment to the discussion: metadata

一个“dubbo-go metadata 全链路时序图”:

下面这张图按 dubbo-go 当前实现画,把 `provider -> metadata -> service discovery -> consumer` 
这条链路串起来了。

```mermaid
flowchart TD
    A["Provider 导出服务 URL"] --> B["metadata.AddService(registryId, url)<br/>本地收集 
exported URLs"]
    A --> C["serviceNameMapping.Map(url)<br/>登记 接口 -> 应用 映射"]

    B --> D["生成 MetadataInfo<br/>services / exported URLs / app"]
    D --> E["计算 revision<br/>dubbo.metadata.revision"]

    E --> F["创建 ServiceInstance"]
    F --> G["写入实例 metadata<br/>storage-type / revision / meta-v / endpoints / 
metadata-service.url-params"]

    G --> H{"metadata-type ?"}
    H -->|local| I["导出本地 MetadataService RPC<br/>dubbo / tri v1 / tri v2"]
    H -->|remote| J["PublishAppMetadata(app, revision, MetadataInfo)<br/>发布到 
metadata report"]

    I --> K["注册应用实例到 Service Discovery"]
    J --> K

    L["Consumer 按接口订阅"] --> M{"provided-by 是否显式配置?"}
    M -->|是| N["直接得到应用集合"]
    M -->|否| O["serviceNameMapping.Get(url, listener)<br/>从 metadata report 
查询/监听 接口 -> 应用"]

    N --> P["订阅这些应用实例变化"]
    O --> P

    K --> P

    P --> Q["拿到 ServiceInstance 列表"]
    Q --> R["读取实例 metadata 中的 revision"]

    R --> S{"storage-type ?"}
    S -->|remote| T["GetMetadataFromMetadataReport(revision, instance)"]
    S -->|local| U["GetMetadataFromRpc(revision, instance)<br/>调用 provider 
MetadataService"]

    T --> V["得到 MetadataInfo"]
    U --> V

    V --> W["遍历 MetadataInfo.Services"]
    W --> X["instance.ToURLs(serviceInfo)<br/>实例 + 服务语义 => 最终 URL"]
    X --> Y["形成 consumer 可调用 URL 列表"]
```

如果你想更直观一点,也可以把它压成一句话:

`注册中心给实例,mapping 把接口翻成应用,metadata 再把实例翻成服务 URL。`

再补一张“模块职责图”,方便和上面的时序图对着看:

```mermaid
flowchart LR
    A["Service Discovery"] -->|"应用实例列表"| B["Consumer"]
    C["Metadata Report"] -->|"app metadata / mapping"| B
    D["Provider MetadataService"] -->|"local metadata RPC"| B
    E["Provider 本地 metadata"] -->|"生成 revision / services"| A
    E -->|"发布 app metadata"| C
    E -->|"导出 MetadataService"| D
    E -->|"登记 接口 -> 应用"| C
```

最容易记混的边界是这三个:

- `Service Discovery` 负责“发现哪个应用实例在线”
- `Mapping` 负责“这个接口属于哪些应用”
- `Metadata` 负责“这些实例到底暴露了哪些服务,以及怎么恢复成最终调用 URL”


GitHub link: 
https://github.com/apache/dubbo-go/discussions/3300#discussioncomment-16618685

----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: 
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to