【SCT】Spring Cloud Starter Tencent Metadata Transfer
【引用】
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 源代码的阅读与学习。
相关文章
- 架构瓶颈原则:用注意力probe估计神经网络组件提供多少句法信息
- dubbo十层
- 让机器人的触觉感官更灵敏、稳定、高效,腾讯Robotics X在传感器上火力全开
- OpenAI新上线GPT太强了,服务器瞬间挤爆,马斯克:你们太沉迷了
- mvn install 报错 Please refer to E:\maven\web_nanchang\target\surefire-reports for the indivi..
- Connected to the target VM, address: ‘127.0.0.1:62995‘, transport: ‘socket‘错误解决办法
- Scheduled 每月最后一天晚上8点 ;关于@Scheduled cron表达式中不支持每月最后一天`L`的解决方案
- 近万人围观Hinton最新演讲:前向-前向神经网络训练算法,论文已公开
- 用少于256KB内存实现边缘训练,开销不到PyTorch千分之一
- 追求高性能触觉反馈:腾讯Robotics X用执行器助力盲文读取、VR沉浸体验
- 终结1.x时代,PyTorch 2.0来了!100%向后兼容,一行代码将训练提速76%
- Java反射,通过对象获取属性及属性值
- 电脑上已经安装了jdk,在运行某些exx文件的时候,提示还要下载安装怎么办?运行Java程序之This application requires a Java Runtime Environment
- Lucene查询需要注意,有时候,有些字段可以查询到,但是有些不能。怎么解决?
- input标签内发生变化进行监听
- Dubbo2.7.5连接zookeeper时报错: zookeeper not connected
- 【多种情况】Springboot集成kafka-No group.id found in consumer config
- 有效融合语言模型、图神经网络,文本图训练框架GLEM实现新SOTA
- 【已解决】solr设置了高亮,但是高亮区域没有值怎么办?
- 字节跳动李航:人工智能需要新的范式和理论