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() 方法中,可以用
1
2
|
RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); |
獲取到 request,但是在 request 中只有 getParameter() 而沒有 setParameter() 方法,所以直接修改 url 參數不可行,另外在 reqeust 中可以雖然可以使用 setAttribute() ,但是可能由于作用域的不同,在這里設置的 attribute 在后續的微服務中是獲取不到的,因此必須考慮另外的方式。
三.具體做法
最后確定的可行的方法是,用
1
|
ctx.setRequest( new HttpServletRequestWrapper(request) {}) |
的方式,重新構造上下文中的 request ,代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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 中,可以用 形似
1
2
3
|
@RequestBody Map<String,Object> body ======= body.get( "userId" ); |
這樣的方式,去獲取在 zuulFilter 傳入的 userId
四.一些嘗試
在重寫 HttpServletRequestWrapper 的時候,我嘗試過 重寫 getParameterNames()
和 getParameterMap()
方法,希望重寫 url 參數,但是并沒有生效。
總結
以上所述是小編給大家介紹的springcloud 中 zuul 修改請求參數信息的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://blog.csdn.net/kysmkj/article/details/79092781