1. 程式人生 > >SpringCloud極簡入門|zuul 過濾器修改轉發的url,困擾很久的功能終於實現了 第6講

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則轉發到

http://127.0.0.1:8001/

@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