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 }