Spring Cloud Feign统一设置验证token实现方法解析

我们也在zuul中通过前置过滤器来统一设置token, 其实还漏掉了一种,那就是业务服务调用业务服务的时候,是没有zuul这种前置过滤器的,那么我们该如何设置呢?

其实也挺简单的,因为我们服务之前的调用是依赖于Feign的,我们可以从Feign上来做文章。

如果你仔细看过Feign的文档的话,肯定会注意到下面一段代码:

static class DynamicAuthTokenTarget<T> implements Target<T> {
  public DynamicAuthTokenTarget(Class<T> clazz,
                 UrlAndTokenProvider provider,
                 ThreadLocal<String> requestIdProvider);
  ...
  @Override
  public Request apply(RequestTemplate input) {
   TokenIdAndPublicURL urlAndToken = provider.get();
   if (input.url().indexOf("http") != 0) {
    input.insert(0, urlAndToken.publicURL);
   }
   input.header("X-Auth-Token", urlAndToken.tokenId);
   input.header("X-Request-ID", requestIdProvider.get());
   return input.request();
  }
 }
 ...
 Bank bank = Feign.builder()
     .target(new DynamicAuthTokenTarget(Bank.class, provider, requestIdProvider));

我们可以为Feign设置一个请求拦截器,在调用之前做一些事情,添加请求头信息。

原生的Feign都能添加拦截器,Spring Cloud中那肯定也是可以的。

前面的文章中我们讲过通过自定义配置来覆盖默认配置,我们创建了一个FeignConfiguration配置类来配置Feign的日志。

今天终于又派上用场了, 可以在这边自定义一个拦截器:

@Configuration
public class FeignConfiguration {
  /**
   * 日志级别
   * @return
   */
  @Bean
  Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;
  }
  /**
   * 创建Feign请求拦截器,在发送请求前设置认证的token,各个微服务将token设置到环境变量中来达到通用
   * @return
   */
  @Bean
  public FeignBasicAuthRequestInterceptor basicAuthRequestInterceptor() {
    return new FeignBasicAuthRequestInterceptor();
  }
}
/**
 * Feign请求拦截器
 * @author yinjihuan
 * @create 2017-11-10 17:25
 **/
public class FeignBasicAuthRequestInterceptor implements RequestInterceptor {
  public FeignBasicAuthRequestInterceptor() {
  }
  @Override
  public void apply(RequestTemplate template) {
    template.header("Authorization", System.getProperty("fangjia.auth.token"));
  }
}

大致的步骤呢就是通过设置Feign的拦截器来设置token, 因为这边是通用的,所有呢token的值通过环境变量来传递。

每个微服务只需要将获取的token信息设置到环境变量中即可:

System.setProperty("fangjia.auth.token", token);

上次我们也讲过如果来自动获取token,我们是通过定时任务来定时刷新的,当时还创建了AuthService来获取token。

今天在优化下,因为这个也需要通用,所以直接将Service去掉了。

/**
 * 定时刷新token
 *
 * @author yinjihuan
 * @create 2017-11-09 15:39
 **/
@Component
public class TokenScheduledTask {
  private static Logger logger = LoggerFactory.getLogger(TokenScheduledTask.class);
  public final static long ONE_Minute = 60 * 1000 * 60 * 20;
  @Autowired
  private AuthRemoteClient authRemoteClient;
  /**
   * 刷新Token
   */
  @Scheduled(fixedDelay = ONE_Minute)
  public void reloadApiToken() {
    String token = this.getToken();
    while (StringUtils.isBlank(token)) {
      try {
        Thread.sleep(1000);
        token = this.getToken();
      } catch (InterruptedException e) {
        logger.error("", e);
      }
    }
    System.setProperty("fangjia.auth.token", token);
  }
  public String getToken() {
    AuthQuery query = new AuthQuery();
    query.setAccessKey("1");
    query.setSecretKey("1");
    ResponseData response = authRemoteClient.auth(query);
    return response.getData() == null ? "" : response.getData().toString();
  }
}

到现在,各个微服务直接的安全认证就结束啦,用起来不麻烦,下面总结下

  • 定义一个用于认证的微服务,可以有用户信息,和业务无关,提供认证接口
  • 定义JWT工具类,提供生成token和检查token的方法,公用
  • 定义认证token的过滤器,公用
  • 在需要认证的微服务中注册过滤器即可实现拦截操作, 也可做成公用的,就是所有都需要认证
  • 在调用方配置TokenScheduledTask,实现定时刷新token, 也可做成公用的
  • 如果不需要认证,那么不注册拦截过滤器即可,也不用 TokenScheduledTask,对业务代码无任何侵入性

具体代码可以参考github:

https://github.com/yinjihuan/spring-cloud

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringCloud项目集成Feign、Hystrix过程解析

    这篇文章主要介绍了SpringCloud项目集成Feign.Hystrix过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Feign的功能:这是个消费者,根据服务注册在Eureka的ID去找到该服务,并调用接口 Hystrix的功能:熔断器,假如A服务需要调用B服务的/cities接口获取数据,那就在A服务的controller里声明@HystrixCommand,如果B服务的/cities接口挂了,就返回一个自定义的值 项目结构 [r

  • 详解springcloud 基于feign的服务接口的统一hystrix降级处理

    springcloud开发微服务时,基于feign来做声明式服务接口,当启用hystrix服务熔断降级时,项目服务众多,每个Feign服务接口都得写一些重复问的服务降级处理代码,势必显得枯燥无味: Feign服务接口: @FeignClient(name="springcloud-nacos-producer", qualifier="productApiService", contextId="productApiService", fallb

  • 如何使用Spring Cloud Feign日志查看请求响应

    这篇文章主要介绍了如何使用Spring Cloud Feign日志查看请求响应,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在使用微服务时,常常会用feign做客户端去调用别的微服务,但是在日志中很难查看到具体的请求和响应.因此,需要把feign默认的日志打开. 日志设置创建feign配置类 @Configuration public class FeignLogConfiguration { @Bean Logger.Level feign

  • SpringCloud Feign参数问题及解决方法

    这篇文章主要介绍了SpringCloud Feign参数问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天遇到使用Feign调用微服务,传递参数时遇到几个问题 1.无参数 以GET方式请求 服务提供者 @RequestMapping("/hello") public String Hello(){ return "hello,provider"; } 服务消费者 @GetMapping("

  • SpringCloud Feign服务调用请求方式总结

    前言 最近做微服务架构的项目,在用feign来进行服务间的调用.在互调的过程中,难免出现问题,根据错误总结了一下,主要是请求方式的错误和接参数的错误造成的.在此进行一下总结记录.以下通过分为三种情况说明,无参数,单参数,多参数.每种情况再分get和post两种请求方式进行说明.这样的话,6种情况涵盖了feign调用的所有情况. 有个建议就是为了保证不必要的麻烦,在写feign接口的时候,与我们的映射方法保持绝对一致,同时请求方式,请求参数注解也都不偷懒的写上.如果遵循这种规范,可以避开90%的调

  • Spring Cloud Feign性能优化代码实例

    1.替换 tomcat 首先,把 tomcat 换成 undertow,这个性能在 Jmeter 的压测下,undertow 比 tomcat 高一倍第一步,pom 修改去除tomcat <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <ex

  • Spring Cloud Feign报错问题解决

    这篇文章主要介绍了Spring Cloud Feign报错问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 如果我们使用Spring Cloud的Feign实现熔断,首先需要自定义一个熔断类,实现你的feign接口,然后实现方法,这些方法就是熔断方法,最后需要在你的feign接口中指定fallback为自定义类 但是启动过程中却出现了 org.springframework.beans.factory.BeanCreationExcept

  • SpringCloud使用Feign实现服务调用

    Spring Cloud Feign简介 Spring Cloud Feign也是一个基础工具类,它整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能以外,它还提供了一种声明式的Web服务客户端定义方式.使用它可以进行服务的消费,但是它的客户端负载平衡仍是通过Ribbon实现的 使用Spring Cloud Feign 创建一个SpringBoot工程,作为服务调用方 1.pom.xml <dependency> <group

  • Spring Cloud Feign统一设置验证token实现方法解析

    我们也在zuul中通过前置过滤器来统一设置token, 其实还漏掉了一种,那就是业务服务调用业务服务的时候,是没有zuul这种前置过滤器的,那么我们该如何设置呢? 其实也挺简单的,因为我们服务之前的调用是依赖于Feign的,我们可以从Feign上来做文章. 如果你仔细看过Feign的文档的话,肯定会注意到下面一段代码: static class DynamicAuthTokenTarget<T> implements Target<T> { public DynamicAuthTo

  • Spring cloud Feign 深度学习与应用详解

    简介 Spring Cloud Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数.格式.地址等信息.Feign会完全代理HTTP请求,开发时只需要像调用方法一样调用它就可以完成服务请求及相关处理.开源地址:https://github.com/OpenFeign/feign.Feign整合了Ribbon负载和Hystrix熔断,可以不再需要显式地

  • Spring Cloud Feign 自定义配置(重试、拦截与错误码处理) 代码实践

    基于 spring-boot-starter-parent 2.1.9.RELEASE, spring-cloud-openfeign 2.1.3.RELEASE 引子 Feign 是一个声明式.模板化的HTTP客户端,简化了系统发起Http请求.创建它时,只需要创建一个接口,然后加上FeignClient注解,使用它时,就像调用本地方法一样,作为开发者的我们完全感知不到这是在调用远程的方法,也感知不到背后发起了HTTP请求: /** * @author axin * @suammry xx 客

  • 解决Spring Cloud Feign 请求时附带请求头的问题

    问题描述 Feign 在请求时是不会将 request 的请求头带着请求的,导致假如 Feign 调用的接口需要请求头的信息,比如当前用户的 token 之类的就获取不到 解决方案 FeignConfiguration 通过实现 Feign 的 RequestInterceptor 将从上下文中获取到的请求头信息循环设置到 Feign 请求头中. /** * feign 配置文件 * 将请求头中的参数,全部作为 feign 请求头参数传递 * @author: linjinp * @create

  • Spring Cloud Feign实现动态URL

    目录 需求描述 具体实现 使用Feign定义统一回调方法 使用Spring Cloud Feign定义统一回调方法 总结 需求描述 动态URL的需求场景: 有一个异步服务S,它为其他业务(业务A,业务B...)提供异步服务接口,在这些异步接口中执行完指定逻辑之后需要回调相应业务方的接口. 这在诸如风控审核,支付回调等场景中挺常见的. 那么,这个回调业务方接口该怎么实现呢?首先,需要约定好回调这些业务方接口时的请求方法(通常为POST请求),请求参数格式(通常为JSON格式,方便扩展)和响应消息格

  • Spring Cloud Feign实例讲解学习

    前面博文搭建了一个Eureka+Ribbon+Hystrix的框架,虽然可以基本满足服务之间的调用,但是代码看起来实在丑陋,每次客户端都要写一个restTemplate,为了让调用更美观,可读性更强,现在我们开始学习使用Feign. Feign包含了Ribbon和Hystrix,这个在实战中才慢慢体会到它的意义,所谓的包含并不是Feign的jar包包含有Ribbon和Hystrix的jar包这种物理上的包含,而是Feign的功能包含了其他两者的功能这种逻辑上的包含.简言之:Feign能干Ribb

  • Spring Cloud Feign组件实例解析

    这篇文章主要介绍了Spring Cloud Feign组件实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 采用Spring Cloud微服务框架后,经常会涉及到服务间调用,服务间调用采用了Feign组件. 由于之前有使用dubbo经验.dubbo的负载均衡策略(轮训.最小连接数.随机轮训.加权轮训),dubbo失败策略(快速失败.失败重试等等), 所以Feign负载均衡策略的是什么? 失败后是否会重试,重试策略又是什么?带这个疑问,查了

  • Spring Cloud Feign高级应用实例详解

    这篇文章主要介绍了Spring Cloud Feign高级应用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.使用feign进行服务间的调用 Spring boot2X Consul如何使用Feign实现服务调用 2.开启gzip压缩 Feign支持对请求与响应的压缩,以提高通信效率,需要在服务消费者配置文件开启压缩支持和压缩文件的类型 添加配置 feign.compression.request.enabled=true feig

  • Spring Cloud Feign内部实现代码细节

    1. 概述 Feign用于服务间调用,它的内部实现是一个包含Ribbon(负载均衡)的**JDK-HttpURLConnection(Http)**调用.虽然调用形式是类似于RPC,但是实际调用是Http,这也是为什么Feign被称为伪RPC调用的原因. 内部调用过程如下: 2. 代码细节 1) BaseLoadBalancer.java配置初始化 重点功能: 1. 初始化负载均衡策略 2. 初始化取服务注册列表调度策略 void initWithConfig(IClientConfig cli

随机推荐