Spring Cloud Zuul學(xué)習(xí)筆記(一)

Zuul 屬于Netflix旗下一款產(chǎn)品,而Spring很好對(duì)其做了整合

Zuul是一個(gè)邊緣服務(wù)近弟,提供動(dòng)態(tài)路由缅糟、監(jiān)控、彈性祷愉、安全性等等窗宦。相關(guān)的用法赦颇、信息、操作方式等 請(qǐng)查看WIKI https://github.com/Netflix/zuul/wiki

Spring Cloud Netflix的文檔:
https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.1.0.M3/single/spring-cloud-netflix.html

一赴涵、Getting Start最簡(jiǎn)單的配置
java文件
@EnableZuulProxy
public class ZuulConfig {

}
yml文件
zuul:
  routes:
    pltf-client:
      path: /pltf/client/**
      service-id: pltf-client
二媒怯、對(duì)于yml的改進(jìn)
1、最傳統(tǒng)的路由
zuul.routes.client.path=/client/**
zuul.routes.client.url=http://localhost:1166/
2髓窜、面向服務(wù)的路由

如果每次都要寫(xiě)一串url的話感覺(jué)很繁瑣扇苞,所以用service-id來(lái)代替,這里的service-id就是注冊(cè)服務(wù)當(dāng)中的 service-id

zuul.routes.client.path=/client/**
zuul.routes.client.service-id=client
3寄纵、通配符路由

有這樣一個(gè)場(chǎng)景鳖敷,由于業(yè)務(wù)的擴(kuò)展,版本的升級(jí)程拭,服務(wù)存在不同的版本定踱。比如我們有這樣的命名:client-v1、client-v2恃鞋,默認(rèn)情況下崖媚,Zuul自動(dòng)為服務(wù)創(chuàng)建的路由表達(dá)式會(huì)采用服務(wù)名做前綴,針對(duì)client就會(huì)產(chǎn)生/client-v1,/client-v2兩個(gè)路徑來(lái)做映射恤浪,但這樣生成的表達(dá)式規(guī)則較為單一畅哑,不利于路徑規(guī)則的管理。通常,對(duì)于上面這種情況水由,我們希望是生成的路徑為/v1/client荠呐,/v2/client。我們可以通過(guò)自定義路由規(guī)則來(lái)實(shí)現(xiàn)绷杜,具體代碼如下:

@Bean
public PatternServiceRouteMapper serviceRouteMapper(){
  return new PatternServiceRouteMapper(
    "(?<name>^.+)-(?<version>v.+$)",
    "${version}/${name}");
}
4直秆、Zuul的過(guò)濾器

四種過(guò)濾器:

  • PRE:該類型的filters在Request routing到源web-service之前執(zhí)行”廾耍可以進(jìn)行一些權(quán)限認(rèn)證圾结,日志記錄,或者額外給Request增加一些屬性供后續(xù)的filter使用
  • ROUTING: 該類型的filters用于把Request routing到源web-service齿诉,源web-service是實(shí)現(xiàn)業(yè)務(wù)邏輯的服務(wù)筝野。這里使用HttpClient請(qǐng)求web-service
  • POST: 該類型的filters在ROUTING返回Response后執(zhí)行。用來(lái)實(shí)現(xiàn)對(duì)Response結(jié)果進(jìn)行修改粤剧,收集統(tǒng)計(jì)數(shù)據(jù)以及把Response傳輸會(huì)客戶端;
  • ERROR: 上面三個(gè)過(guò)程中任何一個(gè)出現(xiàn)錯(cuò)誤都交由ERROR類型的filters進(jìn)行處理歇竟。

Zuul過(guò)濾器具有以下關(guān)鍵特性:

  • Type(類型):Zuul過(guò)濾器的類型,這個(gè)類型決定過(guò)濾器在哪個(gè)階段執(zhí)行抵恋,例如:pre焕议,post等階段;
  • Execution Order(執(zhí)行順序):規(guī)定了過(guò)濾器的執(zhí)行順序弧关,Order的值越小盅安,越先執(zhí)行唤锉;
  • Criteria(標(biāo)準(zhǔn)):Filters執(zhí)行所需條件
  • Action(行動(dòng)):如果符合執(zhí)行條件,則執(zhí)行Action(具體邏輯代碼)
@Sl4j
public class MyPreFilter extends ZuulFilter {

    @Override
    public Object run() {
            RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

       log.info("{} AccessUserNameFilter request to {}", request.getMethod(), request.getRequestURL().toString());
        // 獲取請(qǐng)求的參數(shù)
        String username = request.getParameter("username");
        // 如果請(qǐng)求的參數(shù)不為空别瞭,且值為demo時(shí)窿祥,則通過(guò)
        if(null != username && username.equals("demo")) {
          // 對(duì)該請(qǐng)求進(jìn)行路由
            ctx.setSendZuulResponse(true);
            ctx.setResponseStatusCode(200);
            // 設(shè)值,讓下一個(gè)Filter看到上一個(gè)Filter的狀態(tài)
            ctx.set("isSuccess", true);
            return null;
        }else{
          // 過(guò)濾該請(qǐng)求蝙寨,不對(duì)其進(jìn)行路由
            ctx.setSendZuulResponse(false);
            // 返回錯(cuò)誤碼
            ctx.setResponseStatusCode(401);
            // 返回錯(cuò)誤內(nèi)容
            ctx.setResponseBody("{\"result\":\"username is not correct!\"}");
            ctx.set("isSuccess", false);
            return null;
        }
    }

    @Override
    public boolean shouldFilter() {
    // 是否執(zhí)行該過(guò)濾器晒衩,此處為true,說(shuō)明需要過(guò)濾
        return true;
    }

    /**
     * 指定該Filter執(zhí)行的順序(Filter從小到大執(zhí)行)
     * DEBUG_FILTER_ORDER = 1;
     * FORM_BODY_WRAPPER_FILTER_ORDER = -1;
     * PRE_DECORATION_FILTER_ORDER = 5;
     * RIBBON_ROUTING_FILTER_ORDER = 10;
     * SEND_ERROR_FILTER_ORDER = 0;
     * SEND_FORWARD_FILTER_ORDER = 500;
     * SEND_RESPONSE_FILTER_ORDER = 1000;
     * SIMPLE_HOST_ROUTING_FILTER_ORDER = 100;
     * SERVLET_30_WRAPPER_FILTER_ORDER = -2;
     * SERVLET_DETECTION_FILTER_ORDER = -3;
     */
    @Override
    public int filterOrder() {
    // 優(yōu)先級(jí)為0墙歪,數(shù)字越大听系,優(yōu)先級(jí)越低
        return org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
    }

    @Override
    public String filterType() {
    // 前置過(guò)濾器
        return org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
    }
}
三、Zuul請(qǐng)求生命周期圖:
生命周期圖
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虹菲,一起剝皮案震驚了整個(gè)濱河市跛锌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌届惋,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菠赚,死亡現(xiàn)場(chǎng)離奇詭異脑豹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)衡查,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)瘩欺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拌牲,你說(shuō)我怎么就攤上這事俱饿。” “怎么了塌忽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵拍埠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我土居,道長(zhǎng)枣购,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任擦耀,我火速辦了婚禮棉圈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眷蜓。我一直安慰自己分瘾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布吁系。 她就那樣靜靜地躺著德召,像睡著了一般白魂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氏捞,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天碧聪,我揣著相機(jī)與錄音,去河邊找鬼液茎。 笑死逞姿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捆等。 我是一名探鬼主播滞造,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼栋烤!你這毒婦竟也來(lái)了谒养?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤明郭,失蹤者是張志新(化名)和其女友劉穎买窟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體薯定,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡始绍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了话侄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亏推。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖年堆,靈堂內(nèi)的尸體忽然破棺而出吞杭,到底是詐尸還是另有隱情,我是刑警寧澤变丧,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布芽狗,位于F島的核電站,受9級(jí)特大地震影響痒蓬,放射性物質(zhì)發(fā)生泄漏译蒂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一谊却、第九天 我趴在偏房一處隱蔽的房頂上張望柔昼。 院中可真熱鬧,春花似錦炎辨、人聲如沸捕透。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乙嘀。三九已至末购,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虎谢,已是汗流浹背盟榴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婴噩,地道東北人擎场。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像几莽,于是被迫代替她去往敵國(guó)和親迅办。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容