feign调用如何传递token_Springcloud学习笔记之微服务之间互相调用时token传递问题...

微服务之间调用时时常遇到需要将服务A的token传递给服务B的情况,如果每个服务调用单独写就太僵硬了,之前试过自己写AOP去处理这个问题,功能上虽然没问题,但是总感觉比较low,最近在解决另外一个问题时,意外学到了一个解决方法。

这里贴一下核心代码

@Slf4j

@Service

public class FeignServiceImpl implements FeignService {

@Autowired

private ConfigurableEnvironment environment;

@Autowired

private FeignClientRequestInterceptor requestInterceptor;

private final Feign.Builder nameBuilder;

@Autowired

public FeignServiceImpl(Decoder decoder, Encoder encoder, Client client, Contract contract) {

// nameBuilder直接使用client,它会使用负载均衡

nameBuilder = Feign.builder()

.client(client)

.encoder(encoder)

.decoder(decoder)

.contract(contract);

}

@Override

public T newInstanceByTenantName(ClassapiType, String shortName) {

String bsServiceName = environment.getProperty("feign.name");

String instanceName = "http://" + shortName.toLowerCase() + "-" + bsServiceName;

return nameBuilder

.requestInterceptor(requestInterceptor)

.target(apiType, instanceName);

}

}

@Configuration

public class FeignClientRequestInterceptor implements RequestInterceptor {

@Override

public void apply(RequestTemplate requestTemplate) {

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder

.getRequestAttributes();

HttpServletRequest request = attributes.getRequest();

String token = request.getHeader(AUTHORIZATION);

requestTemplate.header(AUTHORIZATION, token);

}

}

这个例子里面,主要就是使用feignbuilder动态的根据url得到目标服务的地址,在去请求对应的服务B(这一步可以无视啦,项目的业务场景)。而在此之前添加了一个拦截器,强行把自己的token塞给对别人的请求header。

很简单,也很简洁,比我之前的方法好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值