元数据类别
TSF 提供两种类型的元数据供开发者在代码中进行设置:
类型 | 特点 |
标签信息(Tags) | 可设置传递性,仅支持 key-value 数据结构,key 和 value 均为字符串类型。 |
辅助信息(CustomMetadata) | 仅供展示,不支持筛选,不具备传递性。 |
场景说明:
标签信息 :用于信息分类,使用场景包括:
服务鉴权:被调方通过标签来决定是否提供服务。
服务路由:通过标签来判断应该访问什么服务,可用于实现金丝雀发布等。
调用链:可用于调用链的筛选和附带业务信息。
辅助信息 (CustomMetadata):仅供展示,不支持筛选,不具备传递性。
元数据的传递性
以调用关系 A ≥ B ≥ C,说明传递性的概念:
可传递(Transitive):需要传递的标签,在整条链路都传递,即用户在 A 设置的标签,会传递到 B 再传递到 C。
不可传递:不需要传递的标签,即用户在 A 设置的标签,会传递到 B,但是不会传递到 C。
标签信息允许用户设置是否支持传递,辅助信息不支持传递。
不同的标签可以设置不同传递性,例如一些业务场景:
userid
标签是需要传递的: 可以作为整条调用链上的服务的 上下文信息。
可以实现按 uin 区分的服务路由,例如 A、B、C 三个服务同时做滚动发布,那么可以让一批 uin 都走新版本的 A、B、C 服务,其他用户走老版本。
level=高级会员
这种标签,很可能就不需要在调用间传递下去。使用元数据
依赖项
在
pom.xml
中添加依赖项:<dependency><groupId>com.tencent.tsf</groupId><artifactId>spring-cloud-tsf-core</artifactId><version><!-- 调整为 SDK 最新版本号 --></version></dependency>
接口
public enum ControlFlag {TRANSITIVE // 表示标签要传递下去,默认不启用NOT_IN_AUTH // 表示标签不被使用在服务鉴权,默认是被使用的NOT_IN_ROUTE // 表示标签不被使用在服务路由,默认是被使用的NOT_IN_SLEUTH // 表示标签不被使用在调用链,默认是被使用的}public class TsfContext {/*** 设置多个 Tag。如果有某个 Tag 之前已经被设置过,那么它的值会被覆盖。*/public static void putTags(Map<String, String> tagMap, TagControlFlag... flags) {}/*** 设置 Tag。如果该 key 之前已经被设置过,那么它的值会被覆盖。*/public static void putTag(String key, String value, TagControlFlag... flags) {}}
场景1:设置鉴权 Tag
TSF 提供的 Demo
consumer-demo/src/main/java/com/tsf/demo/consumer/Controller.java
中设置了键为 user,请求参数作为值的 Tag。Tag 鉴权的具体使用方法可参见 服务鉴权。@RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET)public String rest(@PathVariable String str, @RequestParam String user) {TsfContext.putTag("user", user);return restTemplate.getForObject("http://provider-demo/echo/" + str, String.class);}
场景2:设置调用链 Tag
设置
user=12345678
的标签,用户可以在控制台调用链查询界面通过标签 custom.user=12345678 来检索调用链。注意需要添加“custom.”前缀查询。调用链标签的具体使用方法参见 调用链。TsfContext.putTag("user", "12345678", TRANSITIVE);
Tag 的长度限制
用户传递到下流的 Tag (包含从上流带过来的有传递性的 Tag),数量上限为16个。Key 的长度上限为 UTF-8 编码后32字节,value 的长度上限为 UTF-8 编码后128字节。