feign在服務間傳遞header


場景:

  用戶登陸后,再次訪問網頁,將用戶信息loginToken放在request的header中,首先經過網關,然后到達A服務,然后A服務調用B服務時如何把loginToken傳遞給B服務

1.修改hytrix配置,配置hytrix的 strategy為 SEMAPHORE。

Hystrix 提供兩種執行隔離策略( ExecutionIsolationStrategy ) :SEMAPHORE 、THREAD

  • SEMAPHORE :信號量,命令在調用線程執行。
  • THREAD :線程池,命令在線程池執行。

 如果不修改配置,默認配置的為THREAD,因為不在同一個線程中,無法獲得請求的上下文對象,無法執行第二步操作

feign:
  httpclient:
    enabled: false
  okhttp:
    enabled: true
  hystrix:
    enabled: true
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          strategy: SEMAPHORE
          thread:
            timeoutInMilliseconds: 60000

2.增加攔截器

feign提供的 RequestInterceptor 接口會默認攔截feign發出去所有請求,所以在這里攔截服務A發送給服務B的請求,然后再請求頭中添加loginToken

如果再第一步沒有修改 hystrix 的 strategy,則這一步中 RequestContextHolder.getRequestAttributes()的結果無法獲取到,結果為null

package com.yuanian.example.feignA.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @author liujy
 * @date 2019/10/24 10:57
 **/
@Component
public class FeignTokenInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        HttpServletRequest request = getServletRequest();
        if (null == request){
            return;
        }
        template.header("loginToken", getHeaders(request));
    }

    private HttpServletRequest getServletRequest() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        return ((ServletRequestAttributes) requestAttributes).getRequest();
    }

    private String getHeaders(HttpServletRequest request){
        return request.getHeader("loginToken");
    }
}

 3.hytrix兩種策略的區別

 


免責聲明!

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



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