Spring Cloud Netflix:通过 RequestInterceptor 将主机请求参数传递给 FeignClient

     2023-02-27     22

关键词:

【中文标题】Spring Cloud Netflix:通过 RequestInterceptor 将主机请求参数传递给 FeignClient【英文标题】:Spring Cloud Netflix : Passing host request parameter via RequestInterceptor to FeignClient 【发布时间】:2016-04-03 07:44:38 【问题描述】:

我正在使用 Eureka、Zuul 和 FeignClient 构建一个 Spring Cloud 项目(带有 Spring Boot 1.3.1 的 Brixton.M4),我正在尝试添加多租户支持(租户由子域标识:tenant1.myservice.com)。为此,我想以某种方式将原始子域与通过 Feign 从服务转发到另一个服务的请求一起传递,但我似乎无法找到正确的方法。

我有一个客户端,它公开一个@RestController,它调用一个@FeignClient 来与我的后端通信,后端通过它自己的@RestController 向客户端公开服务器操作。

@FeignClient 使用与服务器上我的@RestController 相同的接口:

@FeignClient(name = "product")
public interface ProductService extends IProductService 


我目前要做的是在 RequestInterceptor 中设置一个标头:

@Component
public class MultiTenancyRequestInterceptor implements RequestInterceptor 

    private CurrentTenantProvider currentTenantProvider;

    @Autowired
    public MultiTenancyRequestInterceptor(CurrentTenantProvider currentTenantProvider) 
        this.currentTenantProvider = currentTenantProvider;
    

    @Override
    public void apply(RequestTemplate template) 
        try 
            template.header("TENANT", currentTenantProvider.getTenant());
         catch (Exception e) 
            // "oops"
        
    

我的提供者类是一个简单的组件,我试图在其中注入一个请求/会话范围 bean:

@Component
public class CurrentTenantProvider 

    @Autowired
    private CurrentTenant currentTenant;
    //...

bean(我尝试了会话和请求范围):

@Bean
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public CurrentTenant currentTenant() 
    return new CurrentTenant();

在服务器上,我使用 Hibernate 多租户提供程序,它应该捕获标头值并使用它来定义要连接到哪个数据库:

@Autowired
private HttpServletRequest httpRequest;

@Override
public String resolveCurrentTenantIdentifier() 
    return httpRequest.getHeader("TENANT");

似乎对服务器的 Feign 调用是在另一个线程中完成的,并且超出了传入的请求范围,所以我不确定如何传递该值。

当我在 RequestInterceptor 中对租户值进行硬编码时,一切正常,因此我知道其余的工作正常。

我还查看了许多其他关于 Zuul “X-Forwaded-For” 标头的帖子,但在服务器收到的请求中找不到它。我也尝试添加一个 ZuulFilter 以将主机名传递给下一个请求,但我看到的是 ZuulFilter 接收了对客户端的原始请求,我可以添加但当 Feign 请求发送到后端服务时不能添加,即使我在 zuul 中映射它(我猜这是有意的?)。

我不太确定下一步是什么,希望能得到一些建议。

【问题讨论】:

刚刚发现 feign tracking 项目似乎做了类似的事情可能会起作用:github.com/isthari/spring-cloud-feign-tracing 【参考方案1】:

希望它对您有用,但我们在 Spring-Cloud-Sleuth 中做类似的事情,但我们使用 ThreadLocal 在不同的库和方法(包括 Feign + Hystrix)之间传递跨度。

这是一个突出显示的示例,我们从线程本地检索 Span:https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceFeignClientAutoConfiguration.java#L123

【讨论】:

Marcin,感谢您的回答!我确实尝试过使用 Threadlocal,但我记得它也不起作用,因为假装执行似乎发生在不同的线程中,但我明天再试一次。 如果你将 Feign 与 Hystrix 一起使用,那么肯定会发生这种情况。我们通过两种方法解决了这个问题。 1) Hystrix 的全局 - 自定义并发策略 - github.com/spring-cloud/spring-cloud-sleuth/blob/master/… 2) 仅适用于 Feign 的自定义方法 github.com/spring-cloud/spring-cloud-sleuth/blob/master/… 我终于按照你的自定义并发示例让它工作了。我将租户值存储在可调用构造函数中,并在 call() 中将其设置回 hystrix 线程。非常感谢您的帮助! 太棒了!这正是需要做的 :) 这就是在线程之间传递事物的方式。 如果你问这个问题,Sleuth 中的 feign Code 已经发生了很大变化。无论如何,对于启动 1.4,一切都应该正常

Spring Cloud Netflix:通过 RequestInterceptor 将主机请求参数传递给 FeignClient

】SpringCloudNetflix:通过RequestInterceptor将主机请求参数传递给FeignClient【英文标题】:SpringCloudNetflix:PassinghostrequestparameterviaRequestInterceptortoFeignClient【发布时间】:2016-04-0307:44:38【问题描述】:我正在使用Eureka、Zuul和FeignClient构建... 查看详情

Spring Cloud Eureka Netflix zuul 过滤器

】SpringCloudEurekaNetflixzuul过滤器【英文标题】:SpringCloudEurekaNetflixzuulfilters【发布时间】:2020-04-1517:27:13【问题描述】:我有三个使用springEureka服务器和zuul作为网关的springboot微服务。我有身份验证微服务,它是验证用户的zuul网关... 查看详情

usingribbonandfeignwithouteurekaorboth(代码片段)

...啊。springcloud官方文档(http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#spring-cloud-ribbon-without-eureka)中的这个方法,的前提是你没有使用Eureka。实现方法参考资料:http://cloud.spring.io/spring-cloud-netflix/single... 查看详情

如何使用 spring-cloud-netflix 和 feign 编写集成测试

】如何使用spring-cloud-netflix和feign编写集成测试【英文标题】:Howtowriteintegrationtestswithspring-cloud-netflixandfeign【发布时间】:2017-01-2019:35:57【问题描述】:我使用Spring-Cloud-Netflix进行微服务之间的通信。假设我有两个服务,Foo和Bar... 查看详情

Spring Boot 2、Cloud Netflix 和用户名/密码认证架构

】SpringBoot2、CloudNetflix和用户名/密码认证架构【英文标题】:SpringBoot2,CloudNetflixandusername/passwordauthenticationarchitecture【发布时间】:2020-07-2314:08:22【问题描述】:这是一个架构问题。我想实现一个处理两种用户(管理员和客户端... 查看详情

spring-cloud之feign

Feign是Netflix实现的一套轻量级的RESTAPI调用工具,Spring-Cloud-Feign是在Netflix的Feign上再次封装的一层,下面我们通过一些Feign的示例带你快速了解如何使用它。原文:https://blog.vchar.top/java/1621167133.htmlFeign的引入可以让我们通过接口注... 查看详情

spring cloud Netflix 球衣版本冲突

】springcloudNetflix球衣版本冲突【英文标题】:springcloudnetflixjerseyversionconflict【发布时间】:2015-07-0101:36:09【问题描述】:您好,我有一个正在使用的SpringBoot应用程序<dependency><groupId>org.springframework.boot</groupId><artifa... 查看详情

Spring Cloud / Netflix OSS 中的负载均衡

】SpringCloud/NetflixOSS中的负载均衡【英文标题】:LoadBalancinginSpringCloud/NetflixOSS【发布时间】:2016-10-0708:13:01【问题描述】:我正在查看SpringBoot/Cloud和NetflixFW(Eureka,Ribbon)。我正在研究这个例子:https://spring.io/blog/2015/07/14/microser... 查看详情

Spring cloud netflix eureka server - 启动时出现tomcat错误

】Springcloudnetflixeurekaserver-启动时出现tomcat错误【英文标题】:Springcloudnetflixeurekaserver-tomcaterroronstartup【发布时间】:2018-12-1101:41:34【问题描述】:这是我在***上的第一个问题,所以我尽力详细描述所有内容。我有一个简单的基... 查看详情

Spring Cloud Netflix 与 Kubernetes [关闭]

】SpringCloudNetflix与Kubernetes[关闭]【英文标题】:SpringCloudNetflixvsKubernetes[closed]【发布时间】:2017-07-1502:07:54【问题描述】:我试图最终在SpringCloudNetflix、Kubernetes和Swarm之间进行选择,以构建我们的微服务环境。他们都很酷,做一... 查看详情

Spring cloud netflix 和 HystrixObservable --> JsonMappingException

】Springcloudnetflix和HystrixObservable-->JsonMappingException【英文标题】:SpringcloudnetflixandHystrixObservable-->JsonMappingException【发布时间】:2017-07-0807:07:22【问题描述】:代码见我的小4类githubproject我正在使用SpringFeignClients连接到休息服... 查看详情

将 apache kafka 与 Spring Cloud netflix 堆栈一起使用

】将apachekafka与SpringCloudnetflix堆栈一起使用【英文标题】:usingapachekafkawithspringcloudnetflixstack【发布时间】:2018-11-2306:54:23【问题描述】:目前我正在使用SpringCloudNetflix堆栈来开发基于微服务的应用程序。我使用过Netflix堆栈提供... 查看详情

使用 spring-cloud-starter-netflix-eureka-client 依赖项在 pom.xml 中出现错误

】使用spring-cloud-starter-netflix-eureka-client依赖项在pom.xml中出现错误【英文标题】:Gettingerrorinpom.xmlwithspring-cloud-starter-netflix-eureka-clientdependency【发布时间】:2021-08-2212:56:29【问题描述】:我正在开发需要通过eureka服务器与服务注册... 查看详情

Spring Cloud Netflix:使用 Feign 处理远程服务错误

】SpringCloudNetflix:使用Feign处理远程服务错误【英文标题】:SpringCloudNetflix:RemoteserviceerrorhandlingwithFeign【发布时间】:2016-12-1721:33:15【问题描述】:我们正在尝试将SpringCloudNetflix放入生产环境。现在我们遇到一个关于业务逻辑错... 查看详情

Spring Cloud Netflix:ribbon.NIWSServerListClassName 和ribbon.listOfServers 有啥区别?

】SpringCloudNetflix:ribbon.NIWSServerListClassName和ribbon.listOfServers有啥区别?【英文标题】:SpringCloudNetflix:Whatisthedifferencebetweenribbon.NIWSServerListClassNameandribbon.listOfServers?SpringCloudNetflix:ribbon.NIWSServerLi 查看详情

Spring Cloud Netflix Turbo.stream 报告无数据

】SpringCloudNetflixTurbo.stream报告无数据【英文标题】:Springcloudnetflixturbine.streamreportsnodata【发布时间】:2016-04-2720:33:41【问题描述】:像我之前的其他一些人一样,我无法让我的服务报告的hystrix流由涡轮机(本地,而不是amqp)聚... 查看详情

Spring Cloud Netflix Feign - 不支持错误 405 请求方法“POST”

】SpringCloudNetflixFeign-不支持错误405请求方法“POST”【英文标题】:SpringCloudNetflixFeign-Error405Requestmethod\'POST\'notsupported【发布时间】:2016-07-1301:58:31【问题描述】:我正在尝试使用Feign为我的Web服务构建一个REST客户端。Web服务是使... 查看详情

具有基于 DNS 配置的 spring-cloud-netflix 上的 Eureka,所有实例都显示为不可用

】具有基于DNS配置的spring-cloud-netflix上的Eureka,所有实例都显示为不可用【英文标题】:Eurekaonspring-cloud-netflixwithDNSbasedconfig,allinstancesshowingupasunavailable【发布时间】:2016-07-1700:07:42【问题描述】:我正在尝试使用基于DNS的EIP配置... 查看详情