微服务中服务间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 }