微服務(wù)如何通過feign.RequestInterceptor傳遞參數(shù)
微服務(wù)通過feign.RequestInterceptor傳遞參數(shù)
Feign 支持請求攔截器,在發(fā)送請求前,可以對發(fā)送的模板進(jìn)行操作,例如設(shè)置請求頭等屬性,自定請求攔截器需要實現(xiàn) feign.RequestInterceptor 接口,該接口的方法 apply 有參數(shù) template ,該參數(shù)類型為 RequestTemplate,我們可以根據(jù)實際情況對請求信息進(jìn)行調(diào)整,示例如下:
創(chuàng)建自定義請求攔截器
在發(fā)送請求前增加了一個請求頭信息,進(jìn)行身份校驗。
import feign.RequestInterceptor;? import feign.RequestTemplate; ? ? ? public class MyRequestInterceptor implements RequestInterceptor{ ? ? ? public void apply(RequestTemplatetemplate){? template.header("Authorization","123");? }? }
服務(wù)端可以通過HttpServletRequest獲取到前面?zhèn)鬟f的參數(shù)
具體獲取邏輯如下
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); if (requestAttributes != null) { ? ? ?HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); ? ? ?request.getHeader("Authorization"); ?}
feign的攔截器RequestInterceptor
SpringCloud的微服務(wù)使用Feign進(jìn)行服務(wù)間調(diào)用的時候可以使用RequestInterceptor統(tǒng)一攔截請求來完成設(shè)置header等相關(guān)請求,但RequestInterceptor和ClientHttpRequestInterceptor有點不同,它拿不到原本的請求,所以要通過其他方法來獲取原本的請求
首先創(chuàng)建自定義的RequestInterceptor
這里通過RequestContextHolder獲取到當(dāng)前的request
@Slf4j @Component public class MyFeignInterceptor implements RequestInterceptor { ? ? @Override ? ? public void apply(RequestTemplate template) { ? ? ? ? ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); ? ? ? ? log.info("===request: {}", template.url()); ? ? ? ? template.header("aaaa", "bbbb"); ? ? } }
然后定義一個feign的接口類
@FeignClient(name = "SPRING-CLOUD-CLIENT-DEMO") public interface ClientFeign { ? ? @GetMapping("/demo/get") ? ? String weight(@RequestParam String param); }
再創(chuàng)建一個controller
@Slf4j @RestController @RequestMapping("/interceptor") public class InterceptorController { ? ? @Autowired ? ? private ClientFeign clientFeign; ? ? @GetMapping("/feign") ? ? public String feign(@RequestParam String param) { ? ? ? ? return clientFeign.weight(param); ? ? } }
運(yùn)行程序測試一下接口
查看程序打印
可以看到進(jìn)入了我們自定義的RequestInterceptor
INFO 25936 --- [ctor-http-nio-3] c.m.d.g.interceptor.MyFeignInterceptor : ===request: /demo/weight?param=a
再查看feign調(diào)用的程序日志,可以看到設(shè)置的header信息
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : aaaa: a
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : websession: ECF4D97D02EEAFDDA3C15A7F1F050F61
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : header: aaaa, bbbb
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : header: accept, */*
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : header: user-agent, Java/1.8.0_191
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : header: host, 39.108.15.147:8801
INFO 1 --- [nio-8801-exec-6] c.m.d.client.controller.DemoController : header: connection, keep-alive
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring boot+beetl+i18n國際化處理的方法
這篇文章主要介紹了Spring boot+beetl+i18n國際化處理的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Java中構(gòu)造方法set/get和toString的使用詳解
這篇文章主要介紹了Java中構(gòu)造方法set/get和toString的使用詳解,構(gòu)造函數(shù)的最大作用就是創(chuàng)建對象時完成初始化,當(dāng)我們在new一個對象并傳入?yún)?shù)的時候,會自動調(diào)用構(gòu)造函數(shù)并完成參數(shù)的初始化,需要的朋友可以參考下2019-07-07