微服务中服务间feign调用header传参

1.说明

现有二个服务,一个会员服务(member),一个微信服务(wechat)。现有浏览器访问member服务,member服务在调用wechat服务,并在wechat服务中获取请求头中传递的token,flag参数信息。该例子设置的固定的请求头信息,token、flag 做为演示。

2.member 新增过滤器类

 1 @Configuration
 2 public class FeignConfiguration implements RequestInterceptor {
 3 
 4     /**
 5      * 打印日志
 6      */
 7     private Logger logger = LoggerFactory.getLogger(getClass());
 8 
 9     @Override
10     public void apply(RequestTemplate template) {
11         template.header("token", UUID.randomUUID().toString());
12         template.header("flag", "3");
13         logger.info("headerInfo:{}", template);
14     }
15 }

feign客户端调用接口新增属性配置 configuration = FeignConfiguration.class

 1 @FeignClient(value = "sp-weixin",configuration = FeignConfiguration.class)
 2 public interface WeChatServiceFeign {
 3 
 4     /**
 5      * 如果不加@RequestParam( feign 客户端调用 可能会报405
 6      *
 7      * @param s
 8      * @return
 9      */
10     @GetMapping("/getWeChat")
11     String getWeChat(@RequestParam("s") String s);
12 
13 }

3.member服务配置文件新增(亲测:只有开启了Hystrix的时候需要新增,因为Hystrix的默认隔离策略是线程池隔离)

1 hystrix:
2   command:
3     default:
4       execution:
5         isolation:
6           strategy: SEMAPHORE

Feign集成Hystrix默认是关闭Hystrix的,只有在配置文件中设置feign.hystrix.enabled=true才会开启Hystrix。

execution.isolation.strategy
表示HystrixCommand.run()的执行时的隔离策略,有以下两种策略

hystrixCommand线程
   线程池隔离:
      1、调用线程和hystrixCommand线程不是同一个线程,并发请求数受到线程池(不是容器tomcat的线程池,而是hystrixCommand所属于线程组的线程池)中的线程数限制,默认是10。
      2、这个是默认的隔离机制
      3、hystrixCommand线程无法获取到调用线程中的ThreadLocal中的值
   信号量隔离:
      1、调用线程和hystrixCommand线程是同一个线程,默认最大并发请求数是10
      2、调用数度快,开销小,由于和调用线程是处于同一个线程,所以必须确保调用的微服务可用性足够高并且返回快才用

4.wechat 服务接口代码 获取浏览器传递header参数

 1 @RestController
 2 public class WeChatServiceImpl implements WeChatService {
 3 
 4     /**
 5      * 打印日志
 6      */
 7     private Logger logger = LoggerFactory.getLogger(getClass());
 8 
 9     @Override
10     public String getWeChat(String a) {
11         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
12         String token = request.getHeader("token");
13         String flag = request.getHeader("flag");
14         logger.info("token:{},flag:{}", token, flag);
15         return "微信服务,param:" + a + ",token:" + token + "," + "flag:" + flag;
16     }
17 }
posted @ 2021-03-30 11:33  明天,你好啊  阅读(1800)  评论(0编辑  收藏  举报