spring cloud fegin传递request header

本文介绍如何在 Spring Cloud Feign 中实现跨服务传递 Token 的解决方案,通过创建 RequestInterceptor 子类并进行配置,确保每次请求都能携带 header 信息,实现前后端或服务间 Token 的透明传递。

本文链接:https://blog.youkuaiyun.com/zhongzunfa/article/details/82791903

1、概述

今天一个朋友, 遇到一个如何在使用spring cloud feign 传递token 等参数问题。

2、解决方案

2.1 创建类继承RequestInterceptor

创建类继承RequestInterceptor 具体如下代码所示:

2.2 在@configuration 类中定义其

2.3 在yml 或者properties 中添加下面关键配置

# To set thread isolation to SEMAPHORE

3、总结

按照上面的操作就可以将上一个服务或者是前端传递过来的header参数传递到下一个服务中去。
需要注意的是, 每个请求都会拦截设置上header信息。

4. 参考地址

http://cloud.spring.io/spring-cloud-openfeign/single/spring-cloud-openfeign.html

Spring Cloud 微服务架构中,通常服务名是通过服务注册与发现机制(如 Eureka、Consul 或 Nacos)进行管理的。服务消费者会通过服务名来调用对应的服务提供者,而不是直接使用 IP 地址或域名。 若需从请求中获取服务名,可以通过以下几种方式实现: ### 1. 从请求头中提取服务名 在某些场景下,例如网关层(Spring Cloud Gateway 或 Zuul)转发请求时,可以将目标服务名作为请求头的一部分传递到下游服务中。下游服务可以从请求头中提取该信息[^2]。 ```java @GetMapping("/example") public String getServiceName(HttpServletRequest request) { String serviceName = request.getHeader("X-Service-Name"); return "Service name from header: " + serviceName; } ``` ### 2. 使用 `RequestContextHolder` 获取当前请求信息 通过 `RequestContextHolder` 可以访问当前线程中的 HTTP 请求对象,并从中获取请求路径、参数等信息。如果服务名嵌入在 URL 路径中,可以通过解析路径来获取服务名[^3]。 ```java @GetMapping("/api/{serviceName}/endpoint") public String getServiceNameFromPath(@PathVariable String serviceName) { return "Service name from path: " + serviceName; } ``` ### 3. 利用服务注册中心获取服务实例信息 在服务内部,可以通过 `DiscoveryClient` 来查询当前请求的目标服务实例信息。例如,在使用 Ribbon 或 Spring Cloud LoadBalancer 的情况下,可以通过服务名查找对应的实例列表,并进一步获取元数据或实例详情[^1]。 ```java @Autowired private DiscoveryClient discoveryClient; @GetMapping("/service-instance/{serviceId}") public List<ServiceInstance> getServiceInstances(@PathVariable String serviceId) { return discoveryClient.getInstances(serviceId); } ``` ### 4. 在网关中动态路由并获取服务名 在 Spring Cloud Gateway 中,可以通过自定义过滤器从路由配置中提取服务名。例如,在 `GatewayFilterChain` 中访问路由定义并获取服务名: ```java @Component public class CustomGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String routeId = exchange.getAttribute(GatewayRouteConstants.ROUTE_ID_ATTRIBUTE); // 根据 routeId 获取服务名 return chain.filter(exchange); } @Override public int getOrder() { return -100; // 设置过滤器优先级 } } ``` ### 5. 从负载均衡器上下文中获取服务名 当使用 `RestTemplate` 或 `FeignClient` 发起远程调用时,Spring Cloud LoadBalancer 会在底层选择一个具体的服务实例。可以通过 `LoadBalancerClient` 获取所选服务名和实例信息[^1]。 ```java @Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/choose-service/{serviceId}") public String chooseServiceInstance(@PathVariable String serviceId) { ServiceInstance instance = loadBalancerClient.choose(serviceId); return "Selected instance: " + instance.getServiceId() + " at " + instance.getHost() + ":" + instance.getPort(); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微笑点燃希望

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值