微服務中服務間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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM