spring-cloud應(yīng)用網(wǎng)關(guān)之zuul

前言
應(yīng)用網(wǎng)關(guān)這個組件,想必大家應(yīng)該都不陌生,特別是在當(dāng)下微服務(wù)盛行的互聯(lián)網(wǎng)時代,應(yīng)用網(wǎng)關(guān)有著非常重要的作用,也是微服務(wù)必不可少的組件之一。
通常我們將應(yīng)用網(wǎng)關(guān)放在企業(yè)應(yīng)用的最外層,作為企業(yè)應(yīng)用的第一道大門,所有服務(wù)都經(jīng)過應(yīng)用網(wǎng)關(guān)來訪問,這樣做有很多好處,比如更安全,所有應(yīng)用只對外暴漏應(yīng)用網(wǎng)關(guān)的服務(wù)映射地址,隱藏服務(wù)實際地址、部署節(jié)點等信息,確保服務(wù)系統(tǒng)安全性;更易于擴(kuò)展,通過應(yīng)用網(wǎng)關(guān),我們可以把集成很多其他功能,比如權(quán)限中心、用戶中心、服務(wù)負(fù)載中心等服務(wù),這樣其他服務(wù)只需要接入應(yīng)用網(wǎng)關(guān)即可使用相關(guān)公共服務(wù)提供的服務(wù),而不用單獨集成。好了,關(guān)于應(yīng)用網(wǎng)關(guān)我們暫時就說這么多,下面我們看下zuul網(wǎng)關(guān)的簡單應(yīng)用。
ZUUL
創(chuàng)建項目
首先,我們要先創(chuàng)建一個spring boot項目。然后引入zuul和eureka的相關(guān)依賴。
核心依賴
下面就是zuul的核心依賴,必須引入。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
引入zuul的依賴后,我發(fā)現(xiàn)zuul還依賴了ribbon、feign、hystrix等組件,說明zuul本身也為我們提供負(fù)載均衡的相關(guān)實現(xiàn),關(guān)于這一點,后面我們會展示。

eureka依賴
引入eureka的客戶端依賴是因為zuul應(yīng)用網(wǎng)關(guān)的核心實現(xiàn)其實是基于eureka實現(xiàn)的,沒有eureka的支持,zuul本身是無法發(fā)現(xiàn)服務(wù)具體地址的,關(guān)于這一點,有興趣的小伙伴可以親測下。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
基本配置
我們只需要在項目主類加上@EnableZuulProxy即可啟用zuul應(yīng)用網(wǎng)關(guān)
@SpringBootApplication
@EnableZuulProxy
public class SpirngCloudZuulDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpirngCloudZuulDemoApplication.class, args);
}
}
同時,點開@EnableZuulProxy注解,我們會發(fā)現(xiàn),其實它默認(rèn)為我們集成并啟用了熔斷器,當(dāng)然從最前面的依賴也可以看出這一點。
關(guān)于啟用Hystrix斷路器,從業(yè)務(wù)上也很好理解,應(yīng)用網(wǎng)關(guān)作為對外提供服務(wù)的窗口,在前后端交互方面是絕對的挑大梁角色,如果因為某個服務(wù)長時間未響應(yīng),導(dǎo)致請求阻塞,最后導(dǎo)致網(wǎng)關(guān)宕機(jī),這種情景是不敢想象的,網(wǎng)關(guān)一掛,意味著企業(yè)服務(wù)都涼涼了,所以集成斷路器就很有必要了。

這里就是應(yīng)用網(wǎng)關(guān)的配置文件了,配置內(nèi)容也很簡單,一個是指定端口,一個是設(shè)定eureka注冊中心的地址。用80端口的好處,就是可以省掉端口,就很方便了
server.port=80
eureka.client.service-url.defaultZone=http://localhost:8999/eureka/
訪問測試
下面我們來進(jìn)行一些簡單的測試,首先啟動我們的注冊中心,為了方便測試,這里我們就啟動一個注冊中心,同時我們啟動應(yīng)用網(wǎng)關(guān)服務(wù)spring-cloud-zuul和產(chǎn)品服務(wù)product-service。

在產(chǎn)品服務(wù)中,我們有一個簡單的controller接口,這個接口就是上次我們測試feign負(fù)載均衡組件的時候用的,這里就直接用了。

下面我們通過應(yīng)用網(wǎng)關(guān)訪問下我們的產(chǎn)品服務(wù),地址如下:
http://localhost/product-service/feign
這里解釋下我們上面的地址,localhost是應(yīng)用網(wǎng)關(guān)的服務(wù)地址,product-service是我們要訪問的服務(wù)id,這個id是我們eureka中注冊的服務(wù)id,也就是我們服務(wù)中配置的spring.application.name的值,/feign就是我們接口的地址了。這里再啰嗦一下,通過zuul網(wǎng)關(guān)訪問的服務(wù),必須在eureka中心注冊,否則無法發(fā)現(xiàn)服務(wù)。
下面就是我們訪問結(jié)果:

和我們直接訪問服務(wù)實際地址返回的結(jié)果也是一致的:

同時在后端控制臺,我們會發(fā)現(xiàn)zuul的負(fù)載均衡默認(rèn)是通過ribbon實現(xiàn)的:
內(nèi)容擴(kuò)展
服務(wù)配置
下面是zuul應(yīng)用網(wǎng)關(guān)的一些特殊配置:
# 微服務(wù)映射規(guī)則
# 配置訪問規(guī)則
zuul.routes.product-service.path=/p/**
# 配置服務(wù)地址
#zuul.routes.product-service.url=http://baidu.com/
zuul.routes.product-service.url=http://localhost:9001/
# 指定服務(wù)id
zuul.routes.product-service.service-id=product-service
上面這些配置是一些特殊的訪問規(guī)則,下面簡單解釋下:
第一行配置是設(shè)定product-service的訪問規(guī)則,也就是說只要我們的訪問地址符合/p/**的匹配規(guī)則,也就是說我們可以通過/p來訪問我們的服務(wù),而不必再指定serviceId;
第二行配置設(shè)置的是product-service的服務(wù)地址;
第三行配置設(shè)定的是服務(wù)的service-id;
只是上面這種配置式的訪問規(guī)則,并不會觸發(fā)負(fù)載均衡,只是單純的請求轉(zhuǎn)發(fā)。關(guān)于這一點,各位小伙伴可以訪問同一個服務(wù)試下,配置式的訪問規(guī)則,服務(wù)訪問的時候只會訪問我們設(shè)定的url,而通過serviceId的方式訪問,則會默認(rèn)走負(fù)載均衡:

總結(jié)
好了,zuul應(yīng)用網(wǎng)關(guān)的相關(guān)知識點暫時就先分享到這里,我們目前就先分享一些簡單的應(yīng)用,后期有機(jī)會的話,我們再進(jìn)一步挖掘。
最近一段時間,分享知識節(jié)奏有點快
,到今天差不多一周的時間,我們已經(jīng)分享了eureka、feign、fibbon、hystrix、zuul等組件,雖然節(jié)奏快,但是內(nèi)容方面我覺得應(yīng)該算是盡可能詳實了吧,當(dāng)然很多內(nèi)容的深度可能還不夠,但是現(xiàn)階段我們的目標(biāo)只是了解和應(yīng)用這些常用組件,至于各個組件的實現(xiàn)原理和高級用法,那是我的下階段目標(biāo),所以暫時就先這樣。
項目源碼還是在老地方獲取,不清楚的小伙伴可以留言!
