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