feign在服务间传递header
时间:2019-10-24
本文章向大家介绍feign在服务间传递header,主要包括feign在服务间传递header使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
场景:
用户登陆后,再次访问网页,将用户信息loginToken放在request的header中,首先经过网关,然后到达A服务,然后A服务调用B服务时如何把loginToken传递给B服务
1.修改hytrix配置,配置hytrix的 strategy为 SEMAPHORE。
Hystrix 提供两种执行隔离策略( ExecutionIsolationStrategy ) :SEMAPHORE
、THREAD
SEMAPHORE
:信号量,命令在调用线程执行。THREAD
:线程池,命令在线程池执行。
如果不修改配置,默认配置的为THREAD,因为不在同一个线程中,无法获得请求的上下文对象,无法执行第二步操作
feign:
httpclient:
enabled: false
okhttp:
enabled: true
hystrix:
enabled: true
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 60000
2.增加拦截器
feign提供的 RequestInterceptor 接口会默认拦截feign发出去所有请求,所以在这里拦截服务A发送给服务B的请求,然后再请求头中添加loginToken
如果再第一步没有修改 hystrix 的 strategy,则这一步中 RequestContextHolder.getRequestAttributes()的结果无法获取到,结果为null
package com.yuanian.example.feignA.config; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; /** * @author liujy * @date 2019/10/24 10:57 **/ @Component public class FeignTokenInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { HttpServletRequest request = getServletRequest(); if (null == request){ return; } template.header("loginToken", getHeaders(request)); } private HttpServletRequest getServletRequest() { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); return ((ServletRequestAttributes) requestAttributes).getRequest(); } private String getHeaders(HttpServletRequest request){ return request.getHeader("loginToken"); } }
原文地址:https://www.cnblogs.com/yechen2019/p/11731745.html
- JavaScript之面向对象学习七(动态原型模式、寄生构造函数模式、稳妥构造函数模式创建自定义类型)
- ExtJs学习笔记(16)_Form布局
- JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象
- 未来几年苹果公司很可能“不务正业”,进军汽车无人驾驶界
- ExtJs学习笔记(15)_fit布局
- JavaScript之call()和apply()方法详解
- Javascript快速入门(下篇)
- JavaScript引用类型之Array数组的栈方法与队列方法
- ExtJs学习笔记(14)_Column布局
- 高级盲注—floor,rand,group by报错注入
- 刷脸注册、试装、支付……仅靠一张脸就能买买买的时尚店开业了
- JavaScript引用类型之Array数组之强大的splice()方法
- Linux快速入门03-系统管理
- JavaScript引用类型之Array数组的concat()和push()方法的区别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 2-14 |“特殊”的日子,多学一种表达爱的方式
- 盘一盘Tidyverse| 只要你要只要我有-filter 筛选行
- RNA相互作用神器——ENCORI
- R|tableone 快速绘制文章“表一”-基线特征三线表
- R-apply| 基因表达量批量二分类,Get!(修正版)
- TCGAbiolinks获取癌症临床信息
- R-rbind.fill|列数不一致的多个数据集“智能”合并,Get!
- R-ggpmisc|回归曲线添加回归方程,R2,方差表,香不香?
- 靶场测试Writeup编写框架
- 搭建本地 HTTPS 环境
- JavaScript时钟
- 网址导航
- Ceph CSI 3.0.0 发布了!
- 自然语言处理——词频统计
- 如何让两个线程“系鞋带"