如何优雅使用feign调用微服务及转发token

标签: feign 微服务 token | 发表时间:2022-01-15 05:10 | 作者:kuanghua
出处:https://juejin.cn/tag/%E6%9E%B6%E6%9E%84

完整项目地址: micro-service-plus

系列文章入口:

前言

有时我们微服务需要相互调用,这时就需要feign了,但是当网关转发到微服务时token还在请求头中,假设请求gateway-A-B,到B服务时token没了,这时就需要重新写feign配置了,下面我们就来详解如何更优雅的feign调用及转发请求头参数

我们先看看配置和使用

1642151423583

在ty-example引入feign配置

micro-service-plus\ty-example\src\main\java\top\kuanghua\tyexample\config\BaseConfig.java

  @Configuration
//将integration-front服务的feign扫描引入
@EnableFeignClients(basePackages = {"top.kuanghua.feign.integrationfront"})
public class BaseConfig {

}

如何使用

  @Service
public class SeataTestService {

    @Resource
    private UserFeign userFeign;
    @GlobalTransactional(rollbackFor = Exception.class)
    public void testSeataRollback(){
        userFeign.insertUser("jzfai");
        int i=10/0;
    }
}

注:本架构所有的微服务的feign统一放到ty-common/feign下,方便统一管理和调用

解决feign id重复问题

  spring:
  main:
    allow-bean-definition-overriding: true

请求头转发token

默认feign转发到其他服务后,请求头的东西会丢失,例如我们在网关设置的token信息

feign核心头转发文件

ty-common\src\main\java\top\kuanghua\feign\config\FeignConfiguration.java

  /*feign转发时将请求的参数设转发到请求头上*/
@Configuration
@Log4j2
public class FeignConfiguration implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        //获取到头参数
        ServletRequestAttributes attributes = (ServletRequestAttributes)
                RequestContextHolder.getRequestAttributes();
        if (!ObjectUtils.isEmpty(attributes)) {
            HttpServletRequest request = attributes.getRequest();
            Enumeration headerNames = request.getHeaderNames();
            if (headerNames != null) {
                //循环设置头参数,进行转发
                while (headerNames.hasMoreElements()) {
                    String name = headerNames.nextElement();
                    String values = request.getHeader(name);
                    template.header(name, values);
                }
            }
        }
    }
}

使用 ty-common\src\main\java\top\kuanghua\feign\tyauth\feign\TestGetTokenFeign.java

  //configuration:自定义feign转发配置
@FeignClient(name = "ty-auth", configuration = FeignConfiguration.class)
@RequestMapping("feignTest")
public interface TestGetTokenFeign {
    @PostMapping("getTokenInfo")
    public ResResult getTokenInfo();
}

体验例子

体验地址

gateway->ty-example->ty-auth输出

ty-example\src\main\java\top\kuanghua\tyexample\controller\GetTokenFromOtherService.java

  @RestController
@Api(tags = "feign转发请求头测试")
@RequestMapping("testFeign")
@Slf4j
public class GetTokenFromOtherService {
    @Resource
    private TestGetTokenFeign testGetTokenFeign;

    @ApiOperation(value = "上传图片或文件")
    @PostMapping("getTokenFromService")
    public void getTokenFromService() {
        ResResult tokenInfo = testGetTokenFeign.getTokenInfo();
        log.info(tokenInfo.getData().toString());

    }

ty-auth\src\main\java\top\kuanghua\tyauth\controller\TestGetTokenController.java

  @RestController
@RequestMapping("feignTest")
@Slf4j
public class TestGetTokenController {
    /*
     * 解析token
     * */
    @PostMapping("getTokenInfo")
    public ResResult getTokenInfo(
            @ApiIgnore @RequestHeader("TOKEN_INFO") String TOKEN_INFO,
            @ApiIgnore @RequestHeader("AUTHORIZE_TOKEN") String AUTHORIZE_TOKEN
    ) {
        try {
            Map tokenInfo = JSON.parseObject(URLDecoder.decode(TOKEN_INFO, "utf-8"));
            //得到转发信息
            log.info(tokenInfo.toString());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        log.info(AUTHORIZE_TOKEN);
        return new ResResult().success(TOKEN_INFO);
    }
}

所有从网关转发的微服务中可以通过

@RequestHeader("TOKEN_INFO"):获取token解析后的信息 @RequestHeader("AUTHORIZE_TOKEN"):获取到未解析的token

相关 [feign 微服务 token] 推荐:

如何优雅使用feign调用微服务及转发token

- - 掘金 架构
完整项目地址: micro-service-plus. 带你用springcloud微服务撸后台(入口). 有时我们微服务需要相互调用,这时就需要feign了,但是当网关转发到微服务时token还在请求头中,假设请求gateway-A-B,到B服务时token没了,这时就需要重新写feign配置了,下面我们就来详解如何更优雅的feign调用及转发请求头参数.

Spring Cloud Feign接口返回流

- - Blog_龙飞
身无彩凤双飞翼,心有灵犀一点通. 关注微信公众号 java干货 不定期分享干货资料.

干掉 Feign,Spring Cloud Square 组件发布

- - 掘金 后端
Spring Cloud Square 是什么. 谈起 Spring Cloud 生态大家一定对 Feign 不陌生,如下图所示,Feign 可以把底层(okhttp、httpclient)Rest 的请求进行隐藏,伪装成类似 SpringMVC 的 Controller 一样. 你不用再自己拼接 url,拼接参数等等操作,一切都交给 Feign 去做.

RSA的SecureID token数据被偷了?

- ripwu - 张志强的网络日志
博客 » 记事本 » 密码学 ». WSJ报道:RSA承认其数据被偷,4000万SecureID token需要被更新. 中国银行银行密钥用的就是RSA生产,就是下图这玩意儿,手里有这玩意儿的同学们要小心了(当然,如果你的账户里的钱没有6位数以上,也不用太担心,毕竟网银的安全性不全依赖于这个设备):.

什么是 JWT -- JSON WEB TOKEN - 简书

- -
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(. (RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景. JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密.

从 Feign 使用注意点到 RESTFUL 接口设计规范 - ImportNew

- -
最近项目中大量使用了Spring Cloud Feign来对接http接口,踩了不少坑,也产生了一些对RESTFUL接口设计的想法,特此一篇记录下. SpringMVC的请求参数绑定机制. 了解Feign历史的朋友会知道,Feign本身是Netflix的产品,Spring Cloud Feign是在原生Feign的基础上进行了封装,引入了大量的SpringMVC注解支持,这一方面使得其更容易被广大的Spring使用者开箱即用,但也产生了不小的混淆作用.

Feign 透明转发Header头信息的解决方案 - SegmentFault 思否

- -
在 Spring Cloud 中 微服务之间的调用会用到Feign,但是在默认情况下,Feign 调用远程服务存在Header请求头丢失问题. 首先需要写一个 Feign请求拦截器,通过实现RequestInterceptor接口,完成对所有的Feign请求,传递请求头和请求参数. 通过配置文件配置 让 所有.

Spring Cloud Feign如何实现JWT令牌中继,传递认证信息?

- - 程序猿DD
在上一篇实现了 Spring Cloud资源服务器的定制化,但是又发现了一个新的问题,Spring Cloud微服务调用的过程中需要令牌中继. 只有令牌中继才能在调用链中保证用户认证信息的传递. 今天就来分享一下如何在Feign中实现令牌中继. 令牌中继(Token Relay)是比较正式的说法,说白了就是让Token令牌在服务间传递下去以保证资源服务器能够正确地对调用方进行鉴权.

微信平台的token安全验证(转)

- - 行业应用 - ITeye博客
本文目标:学习一种比较安全的服务器间互相验证身份的方式. 问题:开发微信公众平台接口,开发者的服务器为了确保请求是否来自微信服务器,应该如何去做. 1)  在微信管理页面上填写URL和TOKEN,开发者服务器上也记录同样的TOKEN. 2)  微信服务器发送HTTP请求,附带上参数(注意TOKEN是不会被传输的).

springmvc下的基于token的防重复提交

- - zzm
现在的网站在注册步骤中,由于后台要处理大量信息,造成响应变慢(测试机器性能差也是造成变慢的一个因素),在前端页面提交信息之前,等待后端响应,此时如果用户. 再点一次提交按钮,后台会保存多份用户信息. 为解决此问题,借鉴了struts2的token思路,在springmvc下实现token. 在springmvc配置文件中加入拦截器的配置,拦截两类请求,一类是到页面的,一类是提交表单的.