前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【SCT】Spring Cloud Starter Tencent Metadata Transfer

【SCT】Spring Cloud Starter Tencent Metadata Transfer

作者头像
FoamValue
发布2022-12-20 16:32:58
6620
发布2022-12-20 16:32:58
举报
文章被收录于专栏:FoamValueFoamValue

【引用】

Spring Cloud Tencent 是腾讯开源的一站式微服务解决方案。SCT实现了Spring Cloud 标准微服务 SPI,开发者可以基于 Spring Cloud Tencent 快速开发 Spring Cloud 云原生分布式应用。

Spring Cloud Tencent 的核心依托腾讯开源的一站式服务发现与治理平台 Polaris,实现各种分布式微服务场景。

版本信息

https://github.com/Tencent/spring-cloud-tencent

spring-cloud-tencent:1.6.0-Hoxton.SR12-SNAPSHOT

Spring Cloud:Hoxton.SR12

Spring Framework:5.2.22.RELEASE

【Spring Cloud Starter Tencent Metadata Transfer】

元数据传输工程,实现元数据在请求中传输的能力。

【spring.factories】

指定开启 Spring Boot 自动配置类全路径。

【MetadataTransferAutoConfiguration.java】

元数据传输自动配置类。

1、判断 Web Application 类型是 SERVLET

  • 注入 DecodeTransferMetadataServletFilter.java
  • 通过 FilterRegistrationBean 注入过滤器 DecodeTransferMetadataServletFilter

2、判断 Web Application 类型是 REACTIVE

  • 注入 DecodeTransferMetadataReactiveFilter.java

3、判断是否存在类:com.netflix.zuul.http.ZuulServlet

  • 注入 EncodeTransferMetadataZuulFilter.java

4、判断是否存在类:org.springframework.cloud.gateway.filter.GlobalFilter

  • 注入 EncodeTransferMedataScgFilter.java

5、判断是否存在类:feign.Feign

  • 注入 EncodeTransferMedataFeignInterceptor.java

6、判断是否存在类:org.springframework.web.client.RestTemplate

  • 实现 ApplicationContextAware.java 接口,获取 ApplicationContext 实例。
  • 注入 EncodeTransferMedataRestTemplateInterceptor.java
  • 从 ApplicationContext 获取所有 RestTemplate 实例
  • 判断是否获取到
    • 循环获取的 RestTemplate 实例
    • 判断实例存在拦截器列表不为空,且不存在 EncodeTransferMedataRestTemplateInterceptor 实例时,手动加入 EncodeTransferMedataRestTemplateInterceptor 实例。
  • 调用内部类 EncodeTransferMetadataRestTemplatePostProcessor 类,实现 BeanPostProcessor.java 接口
    • 重写 postProcessAfterInitialization 方法,在 Bean 初始化回调之后,检查 Bean 是否为 RestTemplate 实例
    • 如果是 RestTemplate 实例
      • 判断实例存在拦截器列表不为空,且不存在 EncodeTransferMedataRestTemplateInterceptor 实例时,手动加入 EncodeTransferMedataRestTemplateInterceptor 实例。

【CustomTransitiveMetadataResolver.java】

从请求中获取需要传递的元数据信息,约定 key 前缀为:X-SCT-Metadata-Transitive-。

【DecodeTransferMetadataServletFilter.java】

Servlet 拦截器处理上游临时存储元数据信息,继承 OncePerRequestFilter 每次调用执行一次。

  • 从 Header 信息中获取元数据(key:SCT-CUSTOM-METADATA)
  • 从 Header 信息中获取需要传递的元数据信息(key:X-SCT-Metadata-Transitive-*)
  • 合并以上两种来源的元数据
  • 将合并后的结果,存储到 ThreadLocal。

【DecodeTransferMetadata*Filter.java】

其他的过滤器逻辑都与 DecodeTransferMetadataServletFilter.java 一致。唯一的区别是按 Web Application 类型的不同,通过 Header 或Attribute 进行元数据传递。


【结尾】

一年已经过去大半,是时候定一个小目标:阅读学习优秀的开源项目源代码。

本文是 Spring Cloud Tencent 第四篇文章,希望今年能完成整个 SCT 源代码的阅读与学习。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Alan 手记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【引用】
    • 版本信息
    • 【Spring Cloud Starter Tencent Metadata Transfer】
    • 元数据传输工程,实现元数据在请求中传输的能力。
    • 【结尾】
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档