是否可以根据目标 URL 禁用 Spring Cloud Sleuth header 传播?
Is it possible to disable Spring Cloud Sleuth header propagation based on destination URL?
我们正在使用 Brave 的 ExtraFieldPropagation
功能在服务之间作为 HTTP headers.
传播自定义字段(例如 internal-only 请求标识符)
我们的一些服务在处理请求的过程中使用 RestTemplate
或 Feign 客户端向外部服务发出请求。由于 Sleuth 通过传播功能增强了所有 RestTemplate
bean 和 Feign 客户端,这意味着外部服务接收 internal-only headers,我想避免这种情况。
我知道有两种解决方法可以避免这种行为,但都存在缺陷:
- 手动实例化客户端 object 而不是使用
@Bean
,这样 Sleuth 就不会添加拦截器。我在这里看到的缺点是开发人员必须记住遵循这种模式以避免泄露信息,而这很难执行。
- 添加一个拦截器,从传出请求中删除这些 headers。这里的缺点是 a) 我需要为
RestTemplate
和 Feign 客户端使用单独的拦截器(不是什么大问题); b) 看起来 Feign 客户端拦截器没有办法影响执行顺序(参见 javadoc here),所以我不能保证新拦截器将 运行 最后一个/在 Sleuth 拦截器之后.
有没有一种方法可以自定义 Sleuth(例如,通过某种注入器 bean),以便在向外发 HTTP 请求中注入 headers 之前,我可以推断出请求的目的地?我看到了关于 custom injector beans 的文档,但 spring boot >= 2 中似乎不再存在这些文档。我似乎无法在 Brave 中找到等效的构造。
您可以对给定的 URL 取消采样,这意味着 headers 将被传播但不会发送到 Zipkin。您不能仅对某些 URL 禁用检测,因为我们正在检测所有注册为 bean 的组件。
我们正在使用 Brave 的 ExtraFieldPropagation
功能在服务之间作为 HTTP headers.
我们的一些服务在处理请求的过程中使用 RestTemplate
或 Feign 客户端向外部服务发出请求。由于 Sleuth 通过传播功能增强了所有 RestTemplate
bean 和 Feign 客户端,这意味着外部服务接收 internal-only headers,我想避免这种情况。
我知道有两种解决方法可以避免这种行为,但都存在缺陷:
- 手动实例化客户端 object 而不是使用
@Bean
,这样 Sleuth 就不会添加拦截器。我在这里看到的缺点是开发人员必须记住遵循这种模式以避免泄露信息,而这很难执行。 - 添加一个拦截器,从传出请求中删除这些 headers。这里的缺点是 a) 我需要为
RestTemplate
和 Feign 客户端使用单独的拦截器(不是什么大问题); b) 看起来 Feign 客户端拦截器没有办法影响执行顺序(参见 javadoc here),所以我不能保证新拦截器将 运行 最后一个/在 Sleuth 拦截器之后.
有没有一种方法可以自定义 Sleuth(例如,通过某种注入器 bean),以便在向外发 HTTP 请求中注入 headers 之前,我可以推断出请求的目的地?我看到了关于 custom injector beans 的文档,但 spring boot >= 2 中似乎不再存在这些文档。我似乎无法在 Brave 中找到等效的构造。
您可以对给定的 URL 取消采样,这意味着 headers 将被传播但不会发送到 Zipkin。您不能仅对某些 URL 禁用检测,因为我们正在检测所有注册为 bean 的组件。