服務(wù)網(wǎng)關(guān)是微服務(wù)架構(gòu)中一個(gè)不可或缺的部分。通過服務(wù)網(wǎng)關(guān)統(tǒng)一向外系統(tǒng)提供REST API
的過程中,除了具備服務(wù)路由、均衡負(fù)載功能之外,它還具備了權(quán)限控制等功能。Spring Cloud
Netflix
中的Zuul就擔(dān)任了這樣的一個(gè)角色,為微服務(wù)架構(gòu)提供了前門保護(hù)的作用,同時(shí)將權(quán)限控制這些較重的非業(yè)務(wù)邏輯內(nèi)容遷移到服務(wù)路由層面,使得服務(wù)集群主體能夠具備更高的可復(fù)用性和可測試性。
路由在微服務(wù)體系結(jié)構(gòu)的一個(gè)組成部分。例如,/可以映射到您的Web應(yīng)用程序,/api/users
映射到用戶服務(wù),并將/api/shop
映射到商店服務(wù)。Zuul
是Netflix
的基于JVM
的路由器和服務(wù)器端負(fù)載均衡器。
Netflix使用Zuul進(jìn)行以下操作:
Zuul
的規(guī)則引擎允許基本上寫任何JVM語言編寫規(guī)則和過濾器,內(nèi)置Java
和Groovy
。
服務(wù)網(wǎng)關(guān) = 路由轉(zhuǎn)發(fā) + 過濾器
1、路由轉(zhuǎn)發(fā):接收一切外界請求,轉(zhuǎn)發(fā)到后端的微服務(wù)上去;
2、過濾器:在服務(wù)網(wǎng)關(guān)中可以完成一系列的橫切功能,例如權(quán)限校驗(yàn)、限流以及監(jiān)控等,這些都可以通過過濾器完成(其實(shí)路由轉(zhuǎn)發(fā)也是通過過濾器實(shí)現(xiàn)的)。
上述所說的橫切功能(以權(quán)限校驗(yàn)為例)可以寫在三個(gè)位置:
第一種,缺點(diǎn)太明顯,基本不用; 第二種,相較于第一點(diǎn)好很多,代碼開發(fā)不會冗余,但是有兩個(gè)缺點(diǎn):
由于每個(gè)服務(wù)都引入了這個(gè)公共服務(wù),那么我們后續(xù)升級這個(gè)服務(wù)可能就比較困難,而且公共服務(wù)的功能越多,升級就越難,而且假設(shè)我們改變了公共服務(wù)中的權(quán)限校驗(yàn)的方式,想讓所有的服務(wù)都去使用新的權(quán)限校驗(yàn)方式,我們就需要將之前所有的服務(wù)都重新引包,編譯部署。
而服務(wù)網(wǎng)關(guān)恰好可以解決這樣的問題:
如果想修改權(quán)限校驗(yàn)的邏輯,只需要修改網(wǎng)關(guān)中的權(quán)限校驗(yàn)過濾器即可,而不需要升級所有已存在的微服務(wù)。
所以,需要服務(wù)網(wǎng)關(guān)!??!
引入服務(wù)網(wǎng)關(guān)后的微服務(wù)架構(gòu)如上,總體包含三部分:服務(wù)網(wǎng)關(guān)、open-service和service。
1、總體流程:
open-service聚合內(nèi)部service響應(yīng),返回給網(wǎng)關(guān),網(wǎng)關(guān)再返回給用戶
2、引入網(wǎng)關(guān)的注意點(diǎn)
網(wǎng)關(guān)要盡量輕。
3、服務(wù)網(wǎng)關(guān)基本功能
。。。后續(xù)補(bǔ)充
4、技術(shù)選型
筆者準(zhǔn)備自建一個(gè)輕量級的服務(wù)網(wǎng)關(guān),技術(shù)選型如下:
在后續(xù)的介紹中,會逐漸介紹各個(gè)知識點(diǎn),并完成一個(gè)輕量級的服務(wù)網(wǎng)關(guān)!??!
新建項(xiàng)目 spring-cloud-zuul-service
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
在程序的啟動類 ZuulApplication
通過 @EnableZuulProxy
開啟 Zuul 服務(wù)網(wǎng)關(guān)
package io.ymq.example.zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
配置文件 application.yml
spring:
application:
name: zuul-service
server:
port: 9000
zuul:
routes:
blog:
path: /ymq/**
url: http://www.ymq.io/about
配置說明:
瀏覽器訪問:http://127.0.0.1:9000/ymq 重定向到我的博客
我們先拿之前兩篇文章,構(gòu)建的兩個(gè)微服務(wù)代碼為基礎(chǔ),進(jìn)行下面的操作
建議先閱讀以下兩篇文章
Spring Cloud(四) 服務(wù)提供者 Eureka + 服務(wù)消費(fèi)者 Feign
Spring Cloud(三) 服務(wù)提供者 Eureka + 服務(wù)消費(fèi)者(rest + Ribbon)
http://www.ymq.io/2017/12/06/spring-cloud-feign/
http://www.ymq.io/2017/12/05/spring-cloud-ribbon-rest/
導(dǎo)入第三篇文章中的項(xiàng)目:作為服務(wù)注冊中心
spring-cloud-eureka-service
導(dǎo)入第三篇文章中的項(xiàng)目:作為服務(wù)的提供者
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
項(xiàng)目繼續(xù)改造,添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
配置文件 application.yml
spring:
application:
name: zuul-service
server:
port: 9000
#zuul:
## routes:
## blog:
## path: /ymq/**
## url: http://www.ymq.io/about
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
zuul:
routes:
api:
path: /**
serviceId: eureka-provider
配置說明:
瀏覽器訪問:http://127.0.0.1:9000/ ,Zuul 會去 Eureka 服務(wù)注冊中心,找到eureka-provider
服務(wù)以均衡負(fù)載的方式訪問
依次啟動項(xiàng)目:
spring-cloud-eureka-service
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
spring-cloud-zuul-service
啟動該工程后,訪問服務(wù)注冊中心,查看服務(wù)是否都已注冊成功:http://localhost:8761/
瀏覽器訪問
訪問:http://127.0.0.1:9000/ ,Zuul 會去 Eureka 服務(wù)注冊中心,找到eureka-provider
服務(wù)以均衡負(fù)載的方式訪問
在命令窗口curl http://localhost:9000/
,發(fā)現(xiàn)一切正常
或者瀏覽器get
請求http://localhost:9000/
F5 刷新
網(wǎng)關(guān)的默認(rèn)路由規(guī)則
Spring cloud zuul
默認(rèn)情況下,Zuul
會代理所有注冊到Eureka Server
的微服務(wù),并且Zuul
的路由規(guī)則如下:[http://ZUUL_HOST:ZUUL_PORT/]()
微服務(wù)在Eureka
上的serviceId/**
會被轉(zhuǎn)發(fā)到serviceId
對應(yīng)的微服務(wù)。
我們注釋 spring-cloud-zuul-service
項(xiàng)目中關(guān)于路由的配置:
#zuul:
## routes:
## api:
## path: /**
## serviceId: eureka-provider
瀏覽器訪問
訪問:http://127.0.0.1:9000/eureka-provider/ ,Zuul 會去 Eureka 服務(wù)注冊中心,找到eureka-provider
服務(wù)以均衡負(fù)載的方式訪問
在命令窗口curl http://127.0.0.1:9000/eureka-provider/
,發(fā)現(xiàn)一切正常
或者瀏覽器get
請求http://127.0.0.1:9000/eureka-provider/
F5 刷新
在下一章,會深入介紹 Zuul 高級功能使用,ZuulFilter
,支持下鵬磊,關(guān)注下屏幕下方的微信公眾號
GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-zuul
碼云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-zuul
Wechat:關(guān)注公眾號,搜云庫技術(shù)團(tuán)隊(duì),專注于開發(fā)技術(shù)的研究與知識分享
更多建議: