在請求攔截器中統(tǒng)一配置
適用于當(dāng)一個(gè)調(diào)用鏈涉及到多個(gè)微服務(wù)湾戳,一些參數(shù)需要在整個(gè)調(diào)用鏈中傳遞。比如為了安全每個(gè)服務(wù)都需要對請求頭中token的校驗(yàn)几蜻。
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
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;
import java.util.Enumeration;
/**
* 請求攔截器,將原始請求header中數(shù)據(jù)原樣通過feign傳輸
*
* @Author xiyang
* @Date 2022/10/21
*/
@Slf4j
@Configuration
public class FeignConfig implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes == null) {
// 從MQ收到消息時(shí)需要RPC
log.info("requestAttributes is null");
return;
}
ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
// 跳過 content-length, 防止RPC時(shí)參數(shù)長度與請求時(shí)不一致
if ("content-length".equalsIgnoreCase(name)) {
continue;
}
requestTemplate.header(name, values);
}
}
}
}
然后在feignClient中配置自定義的配置類姻锁,覆蓋默認(rèn)的配置
@FeignClient(value = "service-name", configuration = FeignConfig.class)
public interface FeignTest {
}
通過@RequestHeader注解
有時(shí)候我們需要傳一些自定義的header參數(shù),而不需要傳全部header參數(shù)渴析,只需要在調(diào)用的接口上添加@RequestHeader注解晚伙,F(xiàn)eign調(diào)用時(shí)吮龄,會(huì)自動(dòng)封裝成header參數(shù)
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
@FeignClient(value = "service-name")
public interface FeignTest {
/**
* 通過 @RequestHeader 將參數(shù)封裝到HTTP header中
*
* @param token
* @param msgId
*/
@GetMapping(value = "/test")
void test(@RequestHeader("x-token") String token, @RequestHeader("x-msgId") String msgId);
}