在微服务中使用Fegin进行内部调用无法获取用户信息

这种是因为我们在A服务调用B服务时,并不能把当前线程的用户信息带过去,因为SecurityContextHolder.getContext().getAuthentication()取值,是取的自己本地线程的。Feign集成Hystrix默认是关闭Hystrix的,只有在配置文件中设置feign.hystrix.enabled=true才会开启Hystrix。开启Hystrix后feign之间的方法调用就会默认启动新的线程执行,和主程序不在一个线程中,因此如果上下文中存在ThreadLocal变量,在该方法中就失效了。

一、不开启服务降级熔断

可以直接使用SecurityContextHolder.getContext().getAuthentication();获取当前token并传递给下游服务

@Configuration
public class MyOAuthRequestInterceptor implements RequestInterceptor {

	 @Override
    public void apply(RequestTemplate template) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            
        if (authentication instanceof JwtAuthenticationToken){
            JwtAuthenticationToken jwtAuthenticationToken = (JwtAuthenticationToken) authentication;
            String tokenValue = jwtAuthenticationToken.getToken().getTokenValue();
            template.header(HttpHeaders.AUTHORIZATION,
				String.format("%s %s", OAuth2AccessToken.To
微服务架构中,跨服务调用是构建分布式系统的核心问题之一。由于服务之间通常运行在不同的进程中,甚至部署在不同的物理节点上,因此需要通过网络通信实现服务间的交互。以下是一些常见的实现方式和技术手段: ### 1. 使用 RESTful API 进行同步调用 RESTful API 是一种基于 HTTP 协议的轻量级通信方式,广泛用于微服务之间的同步调用。每个服务对外暴露一组 HTTP 接口,其他服务可以通过标准的 HTTP 请求(如 GET、POST、PUT、DELETE)进行访问。这种方式简单易用,适合轻量级的同步交互场景[^3]。 例如,使用 Python 的 `requests` 库调用其他服务的接口: ```python import requests response = requests.get('http://service-b/api/data') data = response.json() ``` ### 2. 使用 gRPC 实现高效的远程调用 gRPC 是一种高性能的远程过程调用(RPC)框架,基于 Protocol Buffers 序列化格式和 HTTP/2 协议。它支持双向流、流控、多路复用等特性,适合需要高性能、低延迟的微服务调用场景。相比 RESTful API,gRPC 提供了更强的类型安全性和更高效的序列化机制[^1]。 ### 3. 异步消息队列实现解耦调用 对于不需要即时响应的场景,可以使用消息队列(如 RabbitMQ、Kafka、ActiveMQ)进行异步通信。服务之间通过发布/订阅模式进行交互,避免了直接调用带来的耦合性问题,提高了系统的可伸缩性和容错能力。 例如,使用 Kafka 发送消息: ```python from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers='localhost:9092') producer.send('service-topic', b'some data') ``` ### 4. 引入服务发现机制 在微服务架构中,服务实例的地址可能动态变化,因此需要服务发现机制来动态获取服务实例的信息。常见的服务发现工具包括 Consul、Eureka、Zookeeper 和 Kubernetes 内置的服务发现机制。通过服务发现,调用方可以自动获取目标服务的最新地址,从而实现灵活的服务调用[^1]。 ### 5. 使用 API Gateway 统一入口 API Gateway 作为系统的统一入口,负责路由请求、负载均衡、身份验证等功能。它可以将请求转发到相应的微服务,并处理跨服务调用中的公共逻辑,如认证、限流、熔断等。这种方式可以降低服务间的耦合度,并简化客户端的调用逻辑[^4]。 ### 6. 引入负载均衡策略 为了提高系统的可用性和性能,通常会对服务进行多实例部署。负载均衡策略(如轮询、最少连接数、一致性哈希)可以确保请求被合理地分发到不同的服务实例上。常见的负载均衡工具有 Nginx、HAProxy 以及客户端负载均衡库如 Ribbon。 ### 7. 异常处理与重试机制 在跨服务调用中,网络故障、服务不可用等问题不可避免。因此需要引入重试机制、断路器(如 Hystrix)和降级策略,以提高系统的健壮性。例如,在调用失败时自动重试或切换到备用服务实例,避免系统整体崩溃。 ### 8. 使用服务网格(Service Mesh) 服务网格是一种专门处理服务间通信的基础设施层,典型的实现包括 Istio 和 Linkerd。它将服务通信、安全控制、监控等功能从应用层剥离,交由独立的代理(如 Sidecar)处理,从而简化了微服务的开发和维护工作[^4]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘个Java

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

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

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

打赏作者

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

抵扣说明:

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

余额充值