Skip to content

七、标签传递-Metadata Transfer

1、元数据管理简介

在微服务架构中,常常需要在微服务实例内部或实例之间管理一些元数据,这些元数据可以用来做为内部使用的基础系统信息,也可以作为需要在实例之间传递的数据信息,在微服务的全链路中都会有或多或少的作用。而 Spring Cloud 默认的组件没有提供相应的功能,因此,Spring Cloud Tencent 为了自身组件的使用并拓展给开发者自定义开发,提供了一套元数据管理解决方案。

2、元数据分类

元数据管理功能,会让应用从多个渠道读取元数据,覆盖尽可能多的使用场景,方便开发者使用不同姿势设置元数据。元数据可以根据来源进行分类,包括:

  • 系统环境变量读取
  • 配置文件读取
  • 服务链路上游传递

元数据有些是需要传递到下游服务的,有些是只允许当前服务实例使用的,因此元数据还可以根据传递类型分为:

  • 可传递元数据
  • 不可传递元数据

3、代码结构

在项目内,元数据相关逻辑主要在两个模块内。

  1. spring-cloud-tencent-commons,其中包含微服务实例本地元数据存储和读取等逻辑。
  2. spring-cloud-starter-tencent-metadata-transfer,其中包含元数据在上下游传递的具体行为逻辑,包括从上游传下来的元数据读取和向下游传递可传递元数据。

4、使用说明

1、系统环境变量读取

元数据管理支持从系统环境变量读取。开发者可以在系统环境变量中添加以 SCT_METADATA_CONTENT_ 开头的环境变量,设置需要被读取的元数据键值对,同时添加 SCT_METADATA_CONTENT_TRANSITIVE 环境变量用于表示需要传递到下游的元数据键的列表,用“,”分隔。元数据管理还支持三个特定的环境变量读取,即 SCT_METADATA_ZONESCT_METADATA_REGIONSCT_METADATA_CAMPUS,用于表示服务实例的位置信息,用于就近路由。如下所示,自定义元数据总共包含三个,即 (env,blue)(label,value1)(name,zhangsan),从第四行可以得出,只有 (env,blue)(label,value1) 两个元数据键值对需要传递到下游服务。最后三行是位置信息元数据,依次是华南地区、深圳地域、深圳1区,该元数据会被上报到注册中心,并使用于就近路由。

SCT_METADATA_CONTENT_env=blue
SCT_METADATA_CONTENT_label=value1
SCT_METADATA_CONTENT_name=zhangsan
SCT_METADATA_CONTENT_TRANSITIVE=env,label
SCT_METADATA_ZONE=huanan
SCT_METADATA_REGION=shenzhen
SCT_METADATA_CAMPUS=shenzhen1

2、配置文件读取

自定义元数据通过 spring.cloud.tencent.metadata.content 打标,需要被链路上传递的标签则需要在 spring.cloud.tencent.metadata.transitive 指定 Key。不在 spring.cloud.tencent.metadata.transitive 中的 Key 则不会被传递到链路上。

如下所示 (a,1) 将会被传递到下游服务,而 (b,2) 不会被传递。

spring:
  cloud:
    tencent:
      metadata:
        content:
          a: 1
          b: 2
        transitive:
          - a

3、服务链路上游传递

元数据也支持在服务链路上进行传递,开发者可以在HTTP头部加入以 X-SCT-Metadata-Transitive- 开头的键值对,然后被 spring-cloud-starter-tencent-metadata-transfer 模块识别后,纳入可传递元数据之中。例如:

curl -L -X GET 'localhost:48083/router/service/caller/feign?name=skye' -H 'X-SCT-Metadata-Transitive-env: env2'

4、引入 Spring Cloud Tencent Metadata Transfer 依赖

使用元数据传递能力需要增加以下依赖

<!-- 引入 Bom -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.tencent.cloud</groupId>
            <artifactId>spring-cloud-tencent-dependencies</artifactId>
            <version>${latest.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 引入依赖 -->
<dependency>
    <groupId>com.tencent.cloud</groupId>
    <artifactId>spring-cloud-starter-tencent-metadata-transfer</artifactId>
</dependency>

5、元数据 API

1、可传递的自定义 Metadata

  1. MetadataContextHolder 途径

该途径为获取ThreadLocal。

  • 获取可传递的元数据映射表
MetadataContextHolder.get().getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE);
  1. StaticMetadataManager途径

该途径首先需要获取对应的 Bean ,然后再进行使用操作。

@Autowired
private StaticMetadataManager staticMetadataManager;
  • 获取zone
staticMetadataManager.getZone();
  • 获取region
staticMetadataManager.getRegion();
  • 获取campus
staticMetadataManager.getCampus();
  • 获取所有地理信息元数据映射表
staticMetadataManager.getLocationMetadata();
  • 获取所有环境变量读取到的元数据映射表
staticMetadataManager.getAllEnvMetadata();
  • 获取环境变量中可传递的元数据映射表
staticMetadataManager.getEnvTransitiveMetadata();
  • 获取所有配置文件读取到的元数据映射表
staticMetadataManager.getAllConfigMetadata();
  • 获取配置文件中可传递的元数据映射表
staticMetadataManager.getConfigTransitiveMetadata();
  • 获取所有读取到的元数据映射表
staticMetadataManager.getMergedStaticMetadata();
  • 获取所有读取到的可传递的元数据映射表
staticMetadataManager.getMergedStaticTransitiveMetadata();