SpringCloud極簡入門|zuul 過濾器修改轉發的url,困擾很久的功能終於實現了 第6講
前情回顧
上一節(第5講),我們講解了zuul的基本配置,如下連結
SpringCloud極簡入門|zuul智慧路由回退、認證、轉發功能(五):https://www.toutiao.com/i6643405381466849800/
本章知識點很重要!很重要!很重要!,真的很重要,網上資料不是很多,所以建議收藏下轉發
動態路由設定使zuul變得很靈活,但是網上的資料大多是基於動態配置實現的,這樣導致如果需要配置的路由成千上萬的話,難免會有瓶頸(記憶體、或者同步實效性)。
業務場景:我們需要一種動態轉發機制實現一種動態改變url的場景,說白了
我們訪問的時候是: http://localhost:8002/hello?name=zs&token=1
可是需要路由動態的設定host或者url比如變成:http://localhost:8001/hello?name=zs&token=1(注埠已變化)
而這種變化我們不採用配置檔案配置的方式,那如何實現轉發呢(基於資料某種規則,此處只演示靜態的)
Demo開始
承接上篇用springcloud-02-getway-zuul模組
分別啟動:註冊中心spring-cloud-eureka-002(埠7001),生產者一 spring-cloud-producter1-002(埠8001),生產者2 spring-cloud-producter2-002(埠8002) ,路由spring-cloud-zuul-002(埠6001)
路由增加個路由配置,也就是訪問testforward規則的url時,會轉發給消費者2
也就是訪問http://localhost:6001/testforward/hello?name=zs&token=1 此時訪問是生產者2的controller
我們要做的是訪問時動態的設定url使之變成訪問 http://localhost:8001/hello?name=zs&token=1
如何做呢?很簡單,不過錯過了這篇需要查詢很多資料了
增加一個攔截器(注意裡面規則可以根據具體業務進行轉發,以下只是一個demo,判斷如果url含有testforward則轉發到
@Component
public class ForwardFilter extends ZuulFilter{
private Logger logger= LoggerFactory.getLogger(ForwardFilter.class);
private static Map<String,String> forwardUrlMap=new HashMap<>();
static {
forwardUrlMap.put("testforward","http://127.0.0.1:8001/");
}
@Override
public String filterType() {
//路由時進行轉發;此外還含有 pre post error等型別
return FilterConstants.ROUTE_TYPE;
}
@Override
public int filterOrder() {
// filter執行順序,通過數字指定 ,優先順序為0,數字越大,優先順序越低
return 0;
}
@Override
public boolean shouldFilter() {
// 是否執行該過濾器,此處為true,說明需要過濾
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
//獲取請求的URI //測試訪問:http://localhost:6001/testforward/hello?name=zs&token=1
String url=request.getRequestURI();//
if(url.indexOf("testforward")>-1){
try {
//[1]:設定RouteHost
URI uri1=new URI(forwardUrlMap.get("testforward"));
ctx.setRouteHost(uri1.toURL());
} catch (Exception e) {
e.printStackTrace();
}
//[2]:設定URI
url=url.substring(url.indexOf("testforward")+12,url.length());
ctx.put(FilterConstants.REQUEST_URI_KEY,url);
}
// url.split("/",3);
logger.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());
return null;
}
}
驗證結果:完成動態轉發
End:
功能實現了就很簡單,但是我們在尋找答案的時候總是那麼難,所以還是需要熱於分享的人出現,堅持寫作1個月了,每晚都在凌晨一點睡,總是覺得時間不夠用,不過還希望小夥伴們有所收穫。
話外篇
截至目前粉絲已經999個了,這是個吉利數字,打算現在申請原創,希望得到大家的祝福,歡迎轉發,真心希望能一次通過,雖然有點不現實,畢竟粉絲數比較少。不管結局如何在此感謝轉發的小夥伴....
文章數量82篇
原始碼下載:https://github.com/shinians/springcloud-demos