您好,登錄后才能下訂單哦!
Zuul是Netflix出品的一個基于JVM路由和服務端的負載均衡器.
Zuul功能:
Zuul的規則引擎允許通過任何JVM語言來編寫規則和過濾器, 支持基于Java和Groovy的構建。
配置屬性 zuul.max.host.connections 已經被兩個新的配置屬性替代, zuul.host.maxTotalConnections (總連接數)和 zuul.host.maxPerRouteConnections,(每個路由連接數) 默認值分別是200和20.
一. 為什么要用到這個
在基于 springcloud 構建的微服務系統中,通常使用網關zuul來進行一些用戶驗證等過濾的操作,比如 用戶在 header 或者 url 參數中存放了 token ,網關層需要 用該 token 查出用戶 的 userId ,并存放于 request 中,以便后續微服務可以直接使用而避免再去用 token 查詢。
二.基礎知識
在 zuul 中最大的用法的除了路由之外,就是過濾器了,自定義過濾器需實現接口 ZuulFilter ,在 run() 方法中,可以用
RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest();
獲取到 request,但是在 request 中只有 getParameter() 而沒有 setParameter() 方法,所以直接修改 url 參數不可行,另外在 reqeust 中可以雖然可以使用 setAttribute() ,但是可能由于作用域的不同,在這里設置的 attribute 在后續的微服務中是獲取不到的,因此必須考慮另外的方式。
三.具體做法
最后確定的可行的方法是,用
ctx.setRequest(new HttpServletRequestWrapper(request) {})
的方式,重新構造上下文中的 request ,代碼如下:
import javax.servlet.http.HttpServletRequestWrapper; // 在json參數中添加 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(); }
思路就是,獲取請求的輸入流,并重寫,即重寫json參數。
在后續的微服務的 controller 中,可以用 形似
@RequestBody Map<String,Object> body ======= body.get("userId");
這樣的方式,去獲取在 zuulFilter 傳入的 userId
四.一些嘗試
在重寫 HttpServletRequestWrapper 的時候,我嘗試過 重寫 getParameterNames()
和 getParameterMap()
方法,希望重寫 url 參數,但是并沒有生效。
總結
以上所述是小編給大家介紹的springcloud 中 zuul 修改請求參數信息的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。