利用Spring Cloud實(shí)現(xiàn)微服務(wù)(六)- 服務(wù)網(wǎng)關(guān)

1. Zuul介紹

在整個(gè)Spring Cloud微服務(wù)框架里,Zuul扮演著”智能網(wǎng)關(guān)“的角色沃暗。一方面坐搔,Zuul是接入網(wǎng)關(guān),起到反向代理的作用漠嵌,是外部消費(fèi)者請(qǐng)求內(nèi)部服務(wù)的唯一入口咐汞。另一方面盖呼,Zuul也具備過濾功能,通過在運(yùn)行時(shí)注入過濾規(guī)則可實(shí)現(xiàn)用戶鑒權(quán)化撕、動(dòng)態(tài)路由几晤、灰度發(fā)布、A/B測(cè)試植阴、負(fù)載限流等功能蟹瘾。

Zuul的大部分功能都是通過過濾功能來完成的,Zuul可以提供四種標(biāo)準(zhǔn)類型的過濾掠手,如下圖所示:

1) Pre: 過濾規(guī)則在路由之前起作用憾朴。可以利用“Pre”過濾器實(shí)現(xiàn)用戶鑒權(quán)惨撇,記錄請(qǐng)求日志等伊脓;

2) Routing:過濾規(guī)則在路由時(shí)發(fā)生作用府寒】茫可以利用“Routing”過濾器實(shí)現(xiàn)動(dòng)態(tài)路由、灰度發(fā)布株搔、A/B測(cè)試剖淀、負(fù)載限流等。

3) Post:過濾規(guī)則在路由之后發(fā)生作用纤房∽莞簦可以利用"Post"過濾器收集統(tǒng)計(jì)信息和指標(biāo),將微服務(wù)的相應(yīng)寫入Http響應(yīng)并返回給服務(wù)消費(fèi)者炮姨;

4) Error:過濾規(guī)則路由過程中發(fā)生錯(cuò)誤時(shí)發(fā)生作用捌刮。可以利用Error過濾器記錄錯(cuò)誤日志舒岸,并對(duì)錯(cuò)誤進(jìn)行二次處理等绅作。

在過濾器之間用RequestContext傳遞消息。RequestContext存儲(chǔ)的內(nèi)容包括路由目標(biāo)地址蛾派、錯(cuò)誤信息俄认、請(qǐng)求信息、響應(yīng)信息等洪乍。Zuul的過濾規(guī)則也可以用基于JVM的語言編寫眯杏,包括Java、Python壳澳、Groovy等岂贩。

2. 代碼實(shí)現(xiàn)及驗(yàn)證

本次代碼實(shí)現(xiàn)模擬兩個(gè)場(chǎng)景:對(duì)用戶進(jìn)行鑒權(quán);攔截請(qǐng)求巷波,并重導(dǎo)向到另一個(gè)網(wǎng)址

2.1新增一個(gè)zuul-service項(xiàng)目:過程同之前過程類似萎津,只不過在依賴項(xiàng)里增加對(duì)zuul的依賴科平。

2.2接入網(wǎng)關(guān)的實(shí)現(xiàn)

1) 在主程序添加@EnableZuulProxy注解,該注解會(huì)把外部調(diào)用路由到合適的服務(wù)姜性;

2) 配置網(wǎng)關(guān)項(xiàng)目的屬性瞪慧,端口設(shè)為2299。在配置文件里部念,如果不顯式指定負(fù)載均衡路由的url或serviceId弃酌,負(fù)載均衡會(huì)將路徑/{service}導(dǎo)向到Eureka上注冊(cè)為{service}的服務(wù),此時(shí)也需要使能zuul自身帶的load balancer(ribbon)功能儡炼。比如:http://.../loadbalance-service/... 會(huì)由負(fù)載均衡自動(dòng)到導(dǎo)向到Eureka上注冊(cè)為loadbalance-service的服務(wù)妓湘。

也可以用下列兩種方式的任何一種顯式路徑的方式指定負(fù)載均衡將導(dǎo)向的服務(wù),zuul將路徑自動(dòng)設(shè)為/cars乌询,2288為負(fù)載均衡器ribbon的端口, loadbalance-service為負(fù)載均衡的應(yīng)用名稱

#zuul.routes.cars.url=http://localhost:2288

#zuul.routes.cars.serviceId=loadbalance-service

當(dāng)指定url時(shí)榜贴,可以關(guān)閉zuul的load balancer功能;當(dāng)使用serviceId時(shí),需要使能zuul自身帶的load balancer(ribbon)功能

#ribbon.eureka.enabled=false

具體配置如下所示:

3) 驗(yàn)證

在啟動(dòng)網(wǎng)關(guān)服務(wù)之前妹田,先依次啟動(dòng)eureka server唬党,bookingcar-service,loadbalance-service鬼佣。其中bookingcar-service啟動(dòng)兩個(gè)實(shí)例驶拱,端口號(hào)分別為2227和2228。

啟動(dòng)網(wǎng)關(guān)服務(wù)后晶衷,我們?cè)贓ureka界面可以看到BOOKINGCAR-SERVICE, LOADBALANCE-SERVICE,GATEWAY-SERVICE都已經(jīng)啟動(dòng)蓝纲。注意:服務(wù)注冊(cè)到eureka上后,名稱都變成了大寫晌纫。

點(diǎn)擊GATEWAY-SERVICE后面的鏈接税迷,進(jìn)入網(wǎng)關(guān)服務(wù)界面,輸入“l(fā)oadbalance-service/v1/lb/testport?name=bookingcar-service“锹漱,我們發(fā)現(xiàn)同負(fù)載均衡時(shí)的結(jié)果一樣箭养,這說明網(wǎng)關(guān)服務(wù)已起作用,網(wǎng)關(guān)自動(dòng)連接到負(fù)載均衡服務(wù)loadbalance-service凌蔬。


我們也可以通過在配置文件里制定serviceid的方式來使用網(wǎng)關(guān)露懒。在配置文件里,取消對(duì)serviceId的注解砂心,關(guān)閉網(wǎng)關(guān)服務(wù)后再次啟動(dòng),我們發(fā)現(xiàn)“l(fā)oadbalance-service/v1/lb/testport?name=bookingcar-service“與“cars/v1/lb/testport?name=bookingcar-service“同樣起作用

Loadbalance-service:

Cars:

2.3 用戶鑒權(quán)的實(shí)現(xiàn)

如前所述懈词,用戶鑒權(quán)一般利用前置過濾器實(shí)現(xiàn)。

1)新增一個(gè)新的類BookingCarPreFilter辩诞,該類繼承自ZuulFilter坎弯。在BookingCarPreFilter的實(shí)現(xiàn)中,要重寫虛擬函數(shù)filterType, filterOrder, run,shouldFilter。

前置過濾器的filterType為PRE_TYPE,filterOrder本次演示使用DEBUG_FILTER_ORDER抠忘,在shouldFilter里要判斷是否要進(jìn)行過濾撩炊,本次演示直接返回true,要進(jìn)行過濾崎脉。

在run函數(shù)里進(jìn)行具體的過濾拧咳。本次演示主要對(duì)用戶進(jìn)行鑒權(quán)。Run函數(shù)的具體實(shí)現(xiàn)如下:

2)驗(yàn)證

繼續(xù)使用“http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2299/loadbalance-service/v1/lb/testport?name=bookingcar-service“囚灼,我們發(fā)現(xiàn)響應(yīng)已經(jīng)變?yōu)椋簎ser id cann't be null骆膝。

在后面添加userid的參數(shù),如http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2299/loadbalance-service/v1/lb/testport?name=bookingcar-service&userid=88灶体,響應(yīng)恢復(fù)為正常

2.4 攔截請(qǐng)求的實(shí)現(xiàn)

在routing過濾器里阅签,實(shí)現(xiàn)對(duì)請(qǐng)求的攔截,并重導(dǎo)向到一個(gè)新的網(wǎng)站蝎抽,比如:www.sina.com.cn

1)新增一個(gè)新的類BookingCarRoutingFilter政钟,該類繼承自ZuulFilter。在BookingCarRoutingFilter的實(shí)現(xiàn)中樟结,要重寫虛擬函數(shù)filterType, filterOrder, run,shouldFilter养交。

前置過濾器的filterType為ROUTE_TYPE,filterOrder本次演示使用DEBUG_FILTER_ORDER,在shouldFilter里要判斷是否要進(jìn)行過濾狭吼,本次演示直接返回true层坠,要進(jìn)行過濾殖妇。

在run函數(shù)里進(jìn)行具體的過濾刁笙。本次演示主要對(duì)請(qǐng)求進(jìn)行攔截,并導(dǎo)向到一個(gè)新的網(wǎng)站谦趣。Run函數(shù)的具體實(shí)現(xiàn)如下:

2) 驗(yàn)證,使用“http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2299/loadbalance-service/v1/lb/testport?name=bookingcar-service&userid=88“,頁面跳轉(zhuǎn)到外部網(wǎng)站疲吸,如下所示:

3. 總結(jié)

Zuul是智能網(wǎng)關(guān),除了是外部請(qǐng)求的入口前鹅,更重要的是可以起到過濾作用摘悴。Netflix也在用Zuul實(shí)現(xiàn)A/B測(cè)試和金絲雀發(fā)布。

Zuul現(xiàn)在版本是2.0舰绘,基于Netty蹂喻,對(duì)請(qǐng)求實(shí)現(xiàn)了異步處理與響應(yīng)。

代碼:https://github.com/shuxingliu/microservices

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(七)- 內(nèi)部調(diào)用

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(五)- 負(fù)載均衡

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(四)- 微服務(wù)實(shí)現(xiàn)與注冊(cè)

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(三)- 業(yè)務(wù)領(lǐng)域驅(qū)動(dòng)微服務(wù)設(shè)計(jì)

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(二)--領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)

利用Spring Cloud實(shí)現(xiàn)微服務(wù)(一):Eureka服務(wù)器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捂寿,一起剝皮案震驚了整個(gè)濱河市口四,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秦陋,老刑警劉巖蔓彩,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赤嚼,警方通過查閱死者的電腦和手機(jī)旷赖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來更卒,“玉大人等孵,你說我怎么就攤上這事□蹇眨” “怎么了流济?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)腌闯。 經(jīng)常有香客問我绳瘟,道長(zhǎng),這世上最難降的妖魔是什么姿骏? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任糖声,我火速辦了婚禮,結(jié)果婚禮上分瘦,老公的妹妹穿的比我還像新娘蘸泻。我一直安慰自己,他們只是感情好嘲玫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布悦施。 她就那樣靜靜地躺著,像睡著了一般去团。 火紅的嫁衣襯著肌膚如雪抡诞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天土陪,我揣著相機(jī)與錄音昼汗,去河邊找鬼。 笑死鬼雀,一個(gè)胖子當(dāng)著我的面吹牛顷窒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播源哩,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼鞋吉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了励烦?” 一聲冷哼從身側(cè)響起谓着,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崩侠,沒想到半個(gè)月后漆魔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坷檩,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年改抡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矢炼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阿纤,死狀恐怖句灌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欠拾,我是刑警寧澤胰锌,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站藐窄,受9級(jí)特大地震影響资昧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荆忍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一格带、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刹枉,春花似錦叽唱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蟋软,卻和暖如春镶摘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钟鸵。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工钉稍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棺耍。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像种樱,于是被迫代替她去往敵國(guó)和親蒙袍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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