SpringCloud 之 Zuul 網(wǎng)關(guān)搭建及配置
點(diǎn)擊上方藍(lán)色“小哈學(xué)Java”,選擇“設(shè)為星標(biāo)”
回復(fù)“資源”獲取獨(dú)家整理的學(xué)習(xí)資料!


作者:Anakki
blog.csdn.net/qq_29519041/article/details/103654564
一.Zuul網(wǎng)關(guān)
網(wǎng)關(guān),是一種網(wǎng)絡(luò)關(guān)口,既然是關(guān)口,就需要知道哪些東西能通過哪些東西不能通過。
在微服務(wù)中,Zuul是SpringCloud眾多組件中的一個(gè),用于微服務(wù)的網(wǎng)關(guān)。在微服務(wù)中,各自服務(wù)之間的調(diào)用不可能都在各自服務(wù)中來實(shí)現(xiàn)安全與認(rèn)證功能,因此需要一個(gè)專門的微服務(wù)來提供這些功能。
當(dāng)請求從客服端發(fā)到服務(wù)器,如果經(jīng)過網(wǎng)關(guān)的一系列驗(yàn)證和過濾符合訪問要求,那么在之后訪問其他微服務(wù)或由網(wǎng)關(guān)路由轉(zhuǎn)發(fā)之后的訪問時(shí),不需要再做同樣的安全認(rèn)證。這是網(wǎng)關(guān)的主要功能。
實(shí)際上,Zuul給我們提供的網(wǎng)關(guān)服務(wù)種類是很多的。后面會(huì)介紹他的一些功能。
二.Zuul服務(wù)的前期準(zhǔn)備
2.1 注冊中心EurekaServer的搭建
為了搭建好網(wǎng)關(guān)后,能通過網(wǎng)關(guān)來訪問各模塊微服務(wù)來證明網(wǎng)關(guān)的搭建成功,因此這里需要提前搭建一些可用的微服務(wù)。第一步我們先新建一個(gè)Project

選擇Springboot作為啟動(dòng)器
,微服務(wù)的標(biāo)配。
當(dāng)然你用Maven
的骨架來搭建也完全可以,構(gòu)建項(xiàng)目并沒有非要用哪一種方式搭建。重要的是后面你知道pom里應(yīng)該引入那些依賴,application.yml怎么配置。這些才是搭建微服務(wù)需要主要的地方。這里我使用Spring Initializr

idea給你默認(rèn)的內(nèi)容如下:

Group和Artifact我們已經(jīng)見得太多了,當(dāng)我們指定這兩個(gè)參數(shù)時(shí),項(xiàng)目名和包名應(yīng)該與之適配。不過當(dāng)然可以不一樣。
比如默認(rèn)值 Group為com.example,Artifact為demo,那么項(xiàng)目名應(yīng)該為demo和Artifact一致,包名Package應(yīng)該為com.example.demo,為Group和Artifact的合體 。
當(dāng)然這里不強(qiáng)制,只是一種規(guī)范,比如別人看見你的包名為com.example.demo時(shí),立馬可以知道他屬于com.example組下的demo項(xiàng)目。一些使用語言,Java版本,項(xiàng)目類型啥的。
在這里因?yàn)槲沂亲鳛闇y試springcloud相關(guān)組件的目的,那么我這里設(shè)置如下:

細(xì)心的朋友會(huì)發(fā)現(xiàn),當(dāng)我們改完1和2,idea會(huì)自動(dòng)給我們修改3和4選項(xiàng),既然是規(guī)范idea當(dāng)然希望大家準(zhǔn)守。改完1和2,我們點(diǎn)擊Next。這一步相當(dāng)于選擇這個(gè)項(xiàng)目需要的一些組件,比如這個(gè)項(xiàng)目你需要用到springmvc?Mybatis?MySQL?那么在這里選擇后,idea會(huì)去加載這些相關(guān)的依賴并在pom里為大家自動(dòng)引入這些依賴。
這里我們要搭建一些測試的微服務(wù),首先搭建1個(gè)Eureka注冊中心。所有的微服務(wù)都需要在這里注冊。


如上圖選擇Eureka Server,點(diǎn)Next,如下圖,項(xiàng)目為zuul,而模組這里我們先搭建微服務(wù)的注冊中心Eureka Server,所以這里我把模組名命名為eurekaserver,繼續(xù)點(diǎn)Next。改了模組名,idea會(huì)默認(rèn)在項(xiàng)目目錄下建立模組的文件夾,因此可以看見第二個(gè)紅框自動(dòng)變化。繼續(xù)點(diǎn)下一步。

因?yàn)槲抑坝许?xiàng)目所以這里選擇開啟新的idea窗口。New Window

點(diǎn)擊import change之后等待idea加載依賴

查看項(xiàng)目結(jié)構(gòu):

此時(shí)我習(xí)慣把a(bǔ)pplication.properties后綴改為yml。這樣配置書寫的格式符合yml的風(fēng)格,比較好看。
現(xiàn)在需要做下面幾件事,由于我們開始構(gòu)建項(xiàng)目時(shí)選擇了Eureka Server,所以pom.xml中不需要手動(dòng)添加依賴了。
首先在啟動(dòng)類SpringcloudApplication中添加EurekaServer的注解:@EnableEurekaServer


然后在application.yml中添加相關(guān)配置:
server:
??port:?9000??#eureka注冊中心服務(wù)端口
?
eureka:
??instance:
????hostname:?localhost
??client:
????register-with-eureka:?false?#不向eureka注冊中心注冊。也就是為了關(guān)閉自己向自己注冊,eureka默認(rèn)要向自己注冊
????fetch-registry:?false
????service-url:
??????defaultZone:?http://${eureka.instance.hostname}:${server.port}/eureka/
就可以啟動(dòng)服務(wù)了:

訪問注冊中心:按照配置的端口號訪問。我這里配了9000,端口隨意,如下圖代表Eureka注冊中心部署成功了。
顯示沒有實(shí)例在此中心注冊。沒事接下來我們開始配置zuul網(wǎng)關(guān),它也是一個(gè)服務(wù)需要注冊到此注冊中心來。

2.2 EurekaService的搭建
有了注冊中心,我們現(xiàn)在需要搭建服務(wù)的真正提供者,EurekaService,第四節(jié)我們建四個(gè)。
eurekaservice01,eurekaservice02,eurekaservice03,eurekaservice04,第一個(gè)如下,第二三四個(gè)按著第一個(gè)的建,修改一下名字,端口號還有方法返回值。

需要用到mvc

服務(wù)提供者同樣需要注冊到注冊中心。

改名你懂得

完成:

接下來是同樣的套路,改yml,啟動(dòng)類添加注解:@EnableEurekaClient
yml配置如下(因?yàn)槭菧y試所有很簡陋):
server:
??port:?8900?#?服務(wù)提供方
?
#?指定當(dāng)前eureka客戶端的注冊地址,
eureka:
??client:
????service-url:
??????defaultZone:?http://${eureka.instance.hostname}:9000/eureka/
??instance:
????hostname:?localhost
?
#當(dāng)前服務(wù)名稱
spring:
??application:
????name:?eurekaservice1
注意當(dāng)前服務(wù)名稱。這里用于注冊到注冊中心的名字,還可以啟動(dòng)很多同樣為eurekaservice1的名字的微服務(wù)到注冊中心,zuul從注冊中心Eureka Server獲取所有服務(wù)名為eurekaservice01的服務(wù)列表后,會(huì)采用負(fù)載均衡策略訪問其中一臺(tái)服務(wù)提供者獲取資源。
下圖我們之前zuul中的配置serviceId就是指向這里的服務(wù)名稱,這是微服務(wù)調(diào)用的精髓,通過服務(wù)名調(diào)用。
既然是服務(wù)提供者 ,這里要編寫controller類了:新建controller包,新建Test01類,編寫REST的方法。返回服務(wù)1

按照服務(wù)提供者1的搭建方式,現(xiàn)在搭建服務(wù)提供者2:
同樣是新建模組,名字改為...02,yml配置文件中端口號與服務(wù)1要不同,服務(wù)名稱相同,為了測試負(fù)載均衡,REST方法返回值設(shè)為服務(wù)2。

yml:
server:
??port:?8901?#?服務(wù)提供方
?
#?指定當(dāng)前eureka客戶端的注冊地址,
eureka:
??client:
????service-url:
??????defaultZone:?http://${eureka.instance.hostname}:9000/eureka/
??instance:
????hostname:?localhost
?
#當(dāng)前服務(wù)名稱
spring:
??application:
????name:?eurekaservice1
同樣的方法再建兩個(gè)服務(wù)提供者3和4,服務(wù)名稱都為eurekaservice2,端口號分別為8902,和8903。REST方法返回值分別為,服務(wù)3和服務(wù)4。


三.Zuul服務(wù)搭建
有了第二節(jié)的準(zhǔn)備,搭建了注冊中心,和服務(wù)的提供者,我們現(xiàn)在開始搭建Zuul網(wǎng)關(guān)服務(wù),最后通過zuul訪問注冊中心獲取服務(wù)列表,然后訪問服務(wù)提供者。
新建模組:

這里模組名設(shè)為zuul。包名設(shè)置為zuul,等會(huì)生成的啟動(dòng)類就會(huì)是帶有zuul了。EurekaServer也可以這樣只是我開始搭的時(shí)候沒有注意到。

需要Eureka的客戶端組件,和zuul組件,點(diǎn)next


模組名設(shè)為zuul,不強(qiáng)制

項(xiàng)目結(jié)構(gòu):

在啟動(dòng)類配置注解?@EnableEurekaClient,@EnableZuulProxy,@EnableZuulProxy可以稱為@EnableZuulServer的增強(qiáng)版,當(dāng)Zuul與Eureka、Ribbon等組件配合使用時(shí),我們使用@EnableZuulProxy。

配置pom文件:
server:port:?9100spring:application:name:?zuuleureka:client:service-url:defaultZone:?http://localhost:9000/eureka/?#當(dāng)前zuul網(wǎng)關(guān)想要注冊到哪個(gè)注冊中心這里注冊到之前搭的9000上。#路由規(guī)則定義。這里定義兩種路由規(guī)則route1和route2#,代表訪問網(wǎng)關(guān)/test01/**或/test02/**時(shí)。#路由到服務(wù)名為 eurekaservice1或 eureka#service2中的服務(wù)集群去。zuul:routes:route1:path:?/test01/\*\*serviceId: eurekaservice1route2:path:?/test02/\*\*serviceId: eurekaservice2
啟動(dòng)項(xiàng)目:

聰明的你再去注冊中心看就能看見zuul服務(wù)已經(jīng)被注冊到注冊中心了

有了網(wǎng)關(guān),
五.Zuul的訪問
我們有一個(gè)網(wǎng)關(guān)服務(wù)zuul,一個(gè)注冊中心eurekaserver,4個(gè)服務(wù)提供者eurekaservice,4個(gè)服務(wù)提供者,其中兩個(gè)提供
服務(wù)名為eurekaservice1的服務(wù),另外兩個(gè)提供eurekaservice2的服務(wù),現(xiàn)在我們來啟動(dòng)4個(gè)服務(wù)提供者,在注冊中心查看,并通過網(wǎng)關(guān)訪問測試網(wǎng)關(guān)的服務(wù)是否正常。
總項(xiàng)目結(jié)構(gòu):

啟動(dòng)后注冊中心查看:

如之前所想,兩個(gè)服務(wù)名下各兩臺(tái)服務(wù)提供者。
現(xiàn)在回想之前zuul的路由配置:

那么我訪問zuul網(wǎng)關(guān)的test01/**下的任何服務(wù)都會(huì)給我轉(zhuǎn)發(fā)到服務(wù)名為eurekaservice1下的01和02服務(wù)下。我們來試試
第一次訪問:test01

第二次訪問:test01

可以看見zuul網(wǎng)關(guān)做了轉(zhuǎn)發(fā)和負(fù)載均衡,使用的是ribbon輪詢的方式負(fù)載均衡。
那么可以猜想到我們訪問test02,zuul網(wǎng)關(guān)會(huì)在服務(wù)名為eurekaservice2的服務(wù)3和服務(wù)4之間去訪問了。我們來看看:


至此我們已經(jīng)實(shí)踐完成zuul網(wǎng)關(guān)的基本功能轉(zhuǎn)發(fā)和負(fù)載均衡。
題外話: 目前小哈正在個(gè)人博客(新搭建的網(wǎng)站,域名就是犬小哈的拼音)?www.quanxiaoha.com?上更新《Go語言教程》,畢竟Go自帶天然的并發(fā)優(yōu)勢,后端的同學(xué)還是要學(xué)一下的,這個(gè)教程系列小哈會(huì)一直更新下去,目前已經(jīng)更新到 Go語言的基礎(chǔ)語法了,歡迎小伙伴們訪問哦~ END
有熱門推薦?
1.?2020 年 11 月編程語言排行榜,Python 超越 Java ?
2.?基于 token 的多平臺(tái)身份認(rèn)證架構(gòu)設(shè)計(jì)
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點(diǎn)“在看”,關(guān)注公眾號并回復(fù)?Java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。
謝謝支持喲 (*^__^*)

