定时器(@Scheduled)使用feign夸服务调用,Oauth2 客户端client_credentials模式


应用场景

定时器(@Scheduled)使用feign夸服务调用(A——>B)。因为不是web请求,所以没有HTTP 请求信息,所以:ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); 获取不到token。报null值异常。
(PS:我的A服务是专门做定时器的服务,不走任何web请求!

解决办法(仅代表个人)

我在A服务调用B服务之前加了一个私有的feign拦截器(写在了A服务里面):使用Oauth2的客户端(client_credentials)模式获取到token并塞进了请求头中。

参数说明
/oauth/token 是Oauth2 提供的token获取地址
grant_type=client_credentials 代表客户端模式请求token
client_id=schedule “schedule”数据库设置的
client_secret=123456 “123456 ”数据库设置的
scope 代表权限,不填代表所有

package cn.config;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;
import java.util.Map;/*** 实现RequestInterceptor接口:* feign全局设置求头信息*/
@Configuration
public class MyFeignRequestInterceptor implements RequestInterceptor {@ResourceRestTemplate restTemplate;@Overridepublic void apply(RequestTemplate requestTemplate) {Map<String,Object> objectMap = restTemplate.getForObject("http://jhcloud-portal/oauth/token?grant_type=client_credentials&client_id=schedule&client_secret=123456",Map.class);String token = objectMap.get("access_token").toString();requestTemplate.header("Authorization", "bearer "+token);}
}
然后在全局的feignConfig中加个判断
package cn.jhcloud_common.config;
@Configuration
public class FeignConfig implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();if (attributes == null) {//因为私有的feign拦截器,所以请求头里已经有了token信息了,就不需要在这里在做处理了!}else {HttpServletRequest request = attributes.getRequest();requestTemplate.header(HttpHeaders.AUTHORIZATION, request.getHeader(HttpHeaders.AUTHORIZATION));}//seata分布式事务requestTemplate.header(RootContext.KEY_XID, RootContext.getXID());}
}
使用 RestTemplate调用的时候最好设置一个全局的:RestTemplateConfig,不然可能会报错。
package cn.jhcloud_common.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Bean@LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力public RestTemplate getRestTemplate() {return new RestTemplate();}}
yml 里面最好也设置一下,如果不设置的话。会报:I/O ERROR ON GET REQUEST FOR "http://jhcloud-portal/auth/currentUser":
security:oauth2:resource:#每次调用接口都获取一下当前登录人的信息user-info-uri: http://jhcloud-portal/auth/currentUser loadBalanced: true #让这个RestTemplate在请求时拥有客户端负载均衡的能力

  • [ 1、] 可能存在的问题,因为yml里面设置了每次调用接口之前都需要先获取一下当前登录人的信息,然而客户端模式获取到的token,不是用户token,所以没有用户信息,相应的也没有用户权限。所以postmain可能会"无效的token"错误。根据控制台报错信息定位一下会发现是:FixedAuthoritiesExtractor.extractAuthorities 报错

  • 所以你可能需要在获取用户信息的地方,“/currentUser”。自己封装一下权限

    然后正常调用就可以了。


因为时间有点长,遇到的其他问题也忘了。先写这么多吧。想起来再补充.

定时器(@Scheduled)使用feign夸服务调用,Oauth2 客户端client_credentials模式相关推荐

  1. Feign实现服务调用

    上一篇博客我们使用ribbon+restTemplate实现负载均衡调用服务,接下来我们使用feign实现服务的调用,首先feign和ribbon的区别是什么呢? ribbon根据特定算法,从服务列表 ...

  2. Spring Cloud —— Feign 实现服务调用

    引言 本篇博客简单介绍 Feign 的基础知识和基本应用,以前一篇博客<Spring Cloud Alibaba--Nacos实现服务治理>为代码基础,实现更简单的微服务调用方式. 一.什 ...

  3. feign调用多个服务_SpringCloud使用Feign实现服务调用|chu

    Spring Cloud Feign简介 Spring Cloud Feign也是一个基础工具类,它整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两 ...

  4. 文件上传结合SpringCloud的Feign进行服务调用

    工作中一直使用的是SpringCloud,其中的多个组件的使用也已经有一段时间了,包括对组件的配置文件的编写,今天要讲的是SpringCloud中的一个远程服务调用的组件,使用Feign之后,我们调用 ...

  5. SpringCloud中Feign进行服务调用 java.io.IOException: too many bytes written 问题解决

    问题描述 Spring Cloud 中通过 Feign 调用微服务时,报错:java.io.IOException: too many bytes written 问题来源 在 Feign 调用拦截器 ...

  6. [Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用

    上一节我们使用了Ribbon(基于Http/Tcp)进行微服务的调用,Ribbon的调用比较简单,通过Ribbon组件对请求的服务进行拦截,通过Eureka Server 获取到服务实例的IP:Por ...

  7. feign响应拦截_[Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用

    上一节我们使用了Ribbon(基于Http/Tcp)进行微服务的调用,Ribbon的调用比较简单,通过Ribbon组件对请求的服务进行拦截,通过Eureka Server 获取到服务实例的IP:Por ...

  8. 微服务feignclient_[Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用

    上一节我们使用了Ribbon(基于Http/Tcp)进行微服务的调用,Ribbon的调用比较简单,通过Ribbon组件对请求的服务进行拦截,通过Eureka Server 获取到服务实例的IP:Por ...

  9. Spring Cloud之(十一)服务调用Feign

    十一.服务调用Feign 11.1 Feign简介 Feign是Netflix开发的声明式,模板化的HTTP客户端,其灵感来自Retrofit,JAXRS-2.0以及WebSocket. Feign可 ...

最新文章

  1. 用 Linux 命令玩一个有趣的数学游戏
  2. CTO:再写 if-else,逮着罚款 1000!
  3. css如何清除浮动(二)
  4. [ linq2db ] 使用LoadWith()对外键进行查询
  5. php关键词分词搜索 最多匹配的排在最前面_图解 | 通用搜索引擎背后的技术点...
  6. ubuntu mysql 2003_Ubuntu 安装 mysql Ubuntu 安装 mysql 忘记初始密码解决方法
  7. 9.Tornado下的一个简易Blog--2013-05-21
  8. 2019-2020-1 20175313 《信息安全系统设计基础》第一周学习总结
  9. html文本框%3cdiv%3e,index.html
  10. tensorflow和keras的关系
  11. android微信下拉出现小程序,微信下拉出现小程序怎么关闭 微信下拉小程序去掉方法...
  12. word_大纲视图/导航视图/设置标题时需要注意(不成功的原因)
  13. PostgreSQL数据库统计信息——analyze执行函数
  14. linux lvm分区表丢失,重启系统后lvm分区没了,附带错误信息
  15. 网络通信技术--设置IP地址
  16. linux kill virus
  17. DevOps基础-2.5-持续改善
  18. 汉字在计算机上的表达方式
  19. [引爆流行]Meme Engine话题(一)
  20. linux文件IO简述和内容整理

热门文章

  1. 一个真实的中国互联网:精英与草根(zz)
  2. GT1030 GTX1050 Pascal Maxwell系列N卡上Big Sur (Monterey)开启QE/CI驱动教程
  3. U大师电脑版一键备份还原系统V1.0.0
  4. css实现列表下拉菜单_逐行:点击打开下拉列表和菜单的高级CSS技巧
  5. 魔兽世界服务器卡顿原理,魔兽世界:正式服卡到爆炸,暴雪却还在为怀旧服提升游戏体验...
  6. 一张图详解项目经理PMO应用波士顿矩阵的步骤和流程
  7. umeditor百度编辑器上传图片时自带域名怎么去除,解决办法
  8. swagger和jwt整合问题笔记
  9. 永恒之塔打BOSS的故事
  10. 转载 硬核图解!30张图带你搞懂!路由器,集线器,交换机,网桥,光猫有啥区别?