我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Feign调用中的两种Header传参方式小结

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Feign调用中的两种Header传参方式小结

Feign调用中的两种Header传参方式

在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。

我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client, Spring的RestTemplate。公司目前使用的是Feign。

下面来和大家一起学习下feign调用中两种Header传参方式。

在请求拦截器中统一配置

每次Feign调用中,需要传递一些安全校验参数,比如说token,bizId啥的,如果单独在每次调用的时候去配置这些重复的逻辑,显然不合适。所以我们可以在Feign的拦截器中统一配置这些权限参数。

如何配置呢?其实很简单。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
 
@Configuration
public class FeignConfiguration implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes)
                RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                template.header(name, values);
            }
        }
    }
}

然后再feignClient中配置自定义的配置类,覆盖默认的配置

@Component
@FeignClient(value = "feignTest" ,configuration = FeignConfiguration.class)
public interface FeignTestService {
}

这样就所有的Feign调用都会在Header调用中加上request中传递过来的参数。不需要单独在每次Feign调用重复添加参数。

通过@RequestHeader注解

上面也说到,我们在拦截器中获取request传递过来的参数,然后再放到header中。在拦截器中配置的一般都是公用的一些参数。

但是如果一个服务接口,需要一些特殊参数。但是其他服务不需要这个参数,这时候我们不必在拦截器中配置其他服务不需要的参数,只需在需要的服务接口上加上@RequestHeader注解,然后在feign调用的时候把参数传过来就ok了。

@PostMapping(value = "/orderDetails")
public ReturnInfo getOrderDetail(@RequestHeader(name = "id") String orderId);

比如说之前在quartz中通过Feign调用其他服务获取优惠券信息,项目中封装的方法获取的attributes 是空的。

ServletRequestAttributes attributes = (ServletRequestAttributes)
                RequestContextHolder.getRequestAttributes();

这时候就不用拦截器了,直接在方法入参上加上 @RequestHeader注解。

这里简单介绍下Feign调用的传参,实际在项目中,大家对Feign调用方法都有自己的封装,代码和上面的可能不一样,但是原理都是差不多的。

调用feign接口时,如何往header中添加参数

Controller接收到请求后,我们可以在service中通过feign直接调用其它服务的接口,但是,controller接收到的请求和通过feign调用其它服务,其它服务接收到的请求,是不一样的。例如我们往往习惯于在header中放入用户的token信息,在不做处理的情况下,其它服务接收到的请求,可能就是无用户信息状态,这种请求应该判定为无效状态。

在服务的提供方或者调用方定义一个拦截器,将当前请求的token信息手动添加到feign请求的header中。

@Configuration
public class FeignRequestInterceptorConfig implements RequestInterceptor {
	@Bean
	public RequestContextListener requestContextListener() {
		return new RequestContextListener();
	}

	@Override
	public void apply(RequestTemplate requestTemplate) {
		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		if (ObjectUtils.isEmpty(attributes)) {
			return;
		}
		HttpServletRequest request = attributes.getRequest();
		String token = request.getHeader("token");
		requestTemplate.header("token", token);
	}
}

在使用过程中,可能会涉及到在请求方获取自己的token信息都是为空的,查看一下是否是Hystrix策略导致的,如下配置可以解决该问题。

hystrix:
  command:
    default:
      execution:
        timeout:
          #如果enabled设置为false,则请求超时交给ribbon控制
          enabled: true
        isolation:
          # 隔离策略
          strategy: SEMAPHORE
          thread:
            timeoutInMilliseconds: 100000

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Feign调用中的两种Header传参方式小结

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Feign调用中的两种Header传参方式小结

这篇文章主要介绍了Feign调用中的两种Header传参方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-01

Python调用Jar包的两种方式小结

这篇文章主要介绍了Python调用Jar包的两种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-08

Vue中常见的几种传参方式小结

Vue组件的使用不管是在平常工作还是在面试面试中,都是频繁出现的,下面这篇文章主要给大家介绍了关于Vue中常见的几种传参方式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-05-19

Go中数组传参的几种方式小结

本文主要介绍了Go中数组传参的几种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-08

vue中兄弟组件传值的两种方式小结

这篇文章主要介绍了vue中兄弟组件传值的两种方式小结,具有很好的参考价值,希望对大家有所帮助。
2022-11-13

Vue路由传参props解耦的三种方式小结

这篇文章主要介绍了Vue路由传参props解耦的三种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-08

SpringBoot中处理日期的两种方式小结

本文主要介绍了SpringBoot中处理日期的两种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-16

详解shell中脚本参数传递的两种方式

方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${10},${11}....才能获
2022-06-04

vue父子组件之间的传参的几种方式小结

本文主要介绍了vue父子组件之间的传参的几种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-18

在vue中使用 jquery 的两种方法小结

这篇文章主要介绍了在vue中使用 jquery 的两种方法小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

pytest用例间参数传递的两种实现方式是怎样的

pytest用例间参数传递的两种实现方式是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前言我们在做接口自动化测试的时候,会经常遇到这种场景:接口A的返回结果中的某个字段
2023-06-22

Java中switch的三种用法方式小结

这篇文章主要介绍了Java中switch的三种用法方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录