springcloud 中 zuul 修改請(qǐng)求參數(shù)信息的方法
Zuul是Netflix出品的一個(gè)基于JVM路由和服務(wù)端的負(fù)載均衡器.
Zuul功能:
- 認(rèn)證
- 壓力測(cè)試
- 金絲雀測(cè)試
- 動(dòng)態(tài)路由
- 負(fù)載削減
- 安全
- 靜態(tài)響應(yīng)處理
- 主動(dòng)/主動(dòng)交換管理
Zuul的規(guī)則引擎允許通過(guò)任何JVM語(yǔ)言來(lái)編寫(xiě)規(guī)則和過(guò)濾器, 支持基于Java和Groovy的構(gòu)建。
配置屬性 zuul.max.host.connections 已經(jīng)被兩個(gè)新的配置屬性替代, zuul.host.maxTotalConnections (總連接數(shù))和 zuul.host.maxPerRouteConnections,(每個(gè)路由連接數(shù)) 默認(rèn)值分別是200和20.
一. 為什么要用到這個(gè)
在基于 springcloud 構(gòu)建的微服務(wù)系統(tǒng)中,通常使用網(wǎng)關(guān)zuul來(lái)進(jìn)行一些用戶(hù)驗(yàn)證等過(guò)濾的操作,比如 用戶(hù)在 header 或者 url 參數(shù)中存放了 token ,網(wǎng)關(guān)層需要 用該 token 查出用戶(hù) 的 userId ,并存放于 request 中,以便后續(xù)微服務(wù)可以直接使用而避免再去用 token 查詢(xún)。
二.基礎(chǔ)知識(shí)
在 zuul 中最大的用法的除了路由之外,就是過(guò)濾器了,自定義過(guò)濾器需實(shí)現(xiàn)接口 ZuulFilter ,在 run() 方法中,可以用
RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest();
獲取到 request,但是在 request 中只有 getParameter() 而沒(méi)有 setParameter() 方法,所以直接修改 url 參數(shù)不可行,另外在 reqeust 中可以雖然可以使用 setAttribute() ,但是可能由于作用域的不同,在這里設(shè)置的 attribute 在后續(xù)的微服務(wù)中是獲取不到的,因此必須考慮另外的方式。
三.具體做法
最后確定的可行的方法是,用
ctx.setRequest(new HttpServletRequestWrapper(request) {})
的方式,重新構(gòu)造上下文中的 request ,代碼如下:
import javax.servlet.http.HttpServletRequestWrapper; // 在json參數(shù)中添加 userId try { InputStream in = ctx.getRequest().getInputStream(); String body = StreamUtils.copyToString(in, Charset.forName("UTF-8")); System.out.println("body:" + body); JSONObject json = JSONObject.fromObject(body); json.put("userId", userId); String newBody = json.toString(); System.out.println("newBody:" + newBody); final byte[] reqBodyBytes = newBody.getBytes(); ctx.setRequest(new HttpServletRequestWrapper(request){ @Override public ServletInputStream getInputStream() throws IOException { return new ServletInputStreamWrapper(reqBodyBytes); } @Override public int getContentLength() { return reqBodyBytes.length; } @Override public long getContentLengthLong() { return reqBodyBytes.length; } }); } catch (IOException e) { e.printStackTrace(); }
思路就是,獲取請(qǐng)求的輸入流,并重寫(xiě),即重寫(xiě)json參數(shù)。
在后續(xù)的微服務(wù)的 controller 中,可以用 形似
@RequestBody Map<String,Object> body ======= body.get("userId");
這樣的方式,去獲取在 zuulFilter 傳入的 userId
四.一些嘗試
在重寫(xiě) HttpServletRequestWrapper 的時(shí)候,我嘗試過(guò) 重寫(xiě) getParameterNames()
和 getParameterMap()
方法,希望重寫(xiě) url 參數(shù),但是并沒(méi)有生效。
總結(jié)
以上所述是小編給大家介紹的springcloud 中 zuul 修改請(qǐng)求參數(shù)信息的方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot整合mybatis-plus實(shí)現(xiàn)分頁(yè)查詢(xún)功能
這篇文章主要介紹了SpringBoot整合mybatis-plus實(shí)現(xiàn)分頁(yè)查詢(xún)功能,pringBoot分頁(yè)查詢(xún)的兩種寫(xiě)法,一種是手動(dòng)實(shí)現(xiàn),另一種是使用框架實(shí)現(xiàn),現(xiàn)在我將具體的實(shí)現(xiàn)流程分享一下,需要的朋友可以參考下2023-11-11Java分頁(yè)查詢(xún)的幾種實(shí)現(xiàn)方法舉例
這篇文章主要給大家介紹了關(guān)于Java分頁(yè)查詢(xún)的幾種實(shí)現(xiàn)方法,分頁(yè)是系統(tǒng)中常用到的功能,只要涉及到查詢(xún)必定伴隨而來(lái)的就是分頁(yè),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06SpringBoot啟動(dòng)多數(shù)據(jù)源找不到合適的驅(qū)動(dòng)類(lèi)問(wèn)題
這篇文章主要介紹了SpringBoot啟動(dòng)多數(shù)據(jù)源找不到合適的驅(qū)動(dòng)類(lèi)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java實(shí)現(xiàn)LRU緩存的實(shí)例詳解
這篇文章主要介紹了Java實(shí)現(xiàn)LRU緩存的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-08-08java實(shí)現(xiàn)簡(jiǎn)單解析XML文件功能示例
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單解析XML文件功能,結(jié)合實(shí)例形式分析了java針對(duì)xml文件的讀取、遍歷節(jié)點(diǎn)及輸出等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10詳解Java中布隆過(guò)濾器(Bloom Filter)原理及其使用場(chǎng)景
布隆過(guò)濾器是1970年由布隆提出的,它實(shí)際上是一個(gè)很長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)映射函數(shù),它的作用是檢索一個(gè)元素是否存在我們的集合之中,本文給大家詳細(xì)的講解一下布隆過(guò)濾器,感興趣的同學(xué)可以參考閱讀2023-05-05java實(shí)現(xiàn)多線(xiàn)程文件的斷點(diǎn)續(xù)傳
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)多線(xiàn)程文件的斷點(diǎn)續(xù)傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06