【发布时间】:2020-03-30 18:08:26
【问题描述】:
我们正在使用 Brave 的 ExtraFieldPropagation 功能在服务之间传播自定义字段(例如,仅限内部的请求标识符)作为 HTTP 标头。
我们的一些服务在处理请求的过程中使用RestTemplate 或 Feign 客户端向外部服务发出请求。由于 Sleuth 使用传播功能增强了所有 RestTemplate bean 和 Feign 客户端,这意味着外部服务接收仅限内部的标头,我想避免这种情况。
我知道有两种解决方法可以让我避免这种行为,但这两种方法都有缺陷:
- 手动实例化客户端对象,而不是使用
@Bean,这样Sleuth 就不会添加拦截器。我在这里看到的缺点是开发人员必须记住遵循这种模式以避免信息泄露,而这很难执行。 - 添加一个拦截器,从传出请求中删除这些标头。这里的缺点是 a) 我需要为
RestTemplate和 Feign 客户端提供单独的拦截器(不是什么大问题); b) 看起来 Feign 客户端拦截器无法影响执行顺序(参见 javadoc here),所以我不能保证新的拦截器会在 Sleuth 之后运行。
有没有办法自定义 Sleuth(例如,通过某种注入器 bean),这样,在向传出的 HTTP 请求注入标头之前,我可以推断出请求的目的地?我看到了有关 custom injector beans 的文档,但似乎那些在 spring boot >= 2 中不再存在。我似乎在 Brave 中找不到等效的构造。
【问题讨论】:
标签: spring spring-boot spring-cloud-sleuth