Spring Cloud系列教程 | 第六篇:Spring Cloud Zuul作為API閘道器實現請求路由轉發教程
推薦 Spring Cloud 視訊:
Spring Cloud Zuul作為API閘道器實現請求路由轉發教程
當我們的架構實現前後端分離以後,前端和後端之間互動就是通過API閘道器進行,API閘道器兩個職責:
1.設計上的適配層,或稱Facade模式,後端微服務可能過於細粒度,通過API閘道器進行內外適配,前後端轉換,如果220v轉換成110v一樣。
2.執行階段:將外部請求路由分發到內部各個微服務,負載平衡和路由策略是需要的。
API閘道器,即邊緣服務,為一組微服務提供統一的介面,以便客戶無需瞭解微服務內部的所有細節。但是,在微服務架構中使用API閘道器模式有一些優缺點。
優點:
- 為客戶提供更簡單的介面
- 可用於防止將內部微服務結構暴露給客戶端
- 允許重構微服務而不強制客戶端重構消耗邏輯
- 可以集中安全,監控,速率限制等交叉問題
缺點:
- 如果不採取適當措施使其具有高可用性,它可能會成為單點故障
- 各種微服務API的知識可能會滲透到API閘道器中
Spring Cloud提供類似於Nginx的代理 Zuul,可用於建立API閘道器。最新版本已經使用非堵塞的Spring Cloud Gateway替代了Zuul,當然我們還是能通過Zuul方便使用瞭解學習API閘道器。本文看看Zuul如何將前端請求轉發到後端的微服務。
現在我們已經掌握了一個規律,建立一個Springcloud專案,一般主要首先是Maven的配置,然後就是元註解,第三就是application.properties,按照這個開發步驟:
第一步, pom.xml配置如下,也可以使用idea的新模組導航,選擇Spring.io進行一步步設定,生成如下配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
這裡引入zuul庫包是不奇怪的,那麼為什麼引入註冊伺服器呢?這個問題很好,本文我們將展示通過或不通過註冊伺服器兩種應用場景:
- 如果我們在application.properties配置
zuul.routes.producer.url=http://localhost:2111
這是將前端請求/producer/****都轉發到埠2111上,這個功能就非常類似Nginx了,這種情況當然不需要服務註冊伺服器,因為沒有有關服務資訊,只是純url資訊。
2.如果我們在application.properties配置:
zuul.routes.peng.path=/producer/**
zuul.routes.peng.serviceId=PengProducerService
application.properties中Zuul路由的配置遵循以下模式:zuul.routes.+服務名稱.+path或serviceId。這裡我們隨便取了服務名稱peng,主要是為了辨識這個伺服器名稱在執行時是否起作用,當然實際中最好與服務名稱一致,zuul.routes.peng.path=/producer/**就是將前端請求/producer/****都轉發到zuul.routes.peng.serviceId=中定義的PengProducerService,這個服務在哪裡呢?就需要服務註冊器了,那麼我們需要在pom.xml中配置eureka。
好了,除了以上兩種情況的不同配置,我們在application.properties中還要配置:
spring.application.name=zuulrouter
server.port=8080
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
這是常例配置,如果不需要eurake就去除,埠是開在8080,這裡直接面對前端的埠,正式環境可以是80埠,這類似Nginx作用。
第三步看看元註解:
@SpringBootApplication
@EnableZuulProxy
public class ZuulrouterApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulrouterApplication.class, args);
}
}
@EnableZuulProxy是需要的。
好了我們完成開發配置,下面可以執行測試,我們也分兩種情況:
- 先啟動模組producer,測試第一種情況純粹url轉發:
這個請求將被Zuul路由轉發到2111埠的producer,訪問其中/articles。
2.再啟動eureka註冊伺服器,再啟動producer,測試第二種情況:
這是根據服務Id進行轉發的。
為了測試兩種情況對應註冊伺服器是否啟動,可以對application.properties裡面配置錯配,比如使用服務Id轉發,如果不啟動註冊伺服器,則無法訪問成功。
附:API閘道器能夠實現Nginx +Lua複雜的路由分發邏輯,包括動靜網頁分離,許可權檢查等,下面是application.yml格式的配置案例,學完以上教程以後應該能看懂:
logging:
level:
org.springframework.security: DEBUG
org.springframework.cloud: DEBUG
org.springframework.web: WARN
server:
port: 8080
spring:
aop:
proxy-target-class: true
zuul:
routes:
startpage:
path: /**
url: http://localhost:8081
resource:
path: /resource/**
url: http://localhost:9001/resource
user:
path: /user/**
url: http://localhost:9999/uaa/user
security:
oauth2:
client:
accessTokenUri: http://localhost:9999/uaa/oauth/token
userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
clientId: ui1
clientSecret: ui1-secret
resource:
userInfoUri: http://localhost:9999/uaa/user
preferTokenInfo: false
sessions: ALWAYS
專家推薦
“隨著微服務架構的發展,Spring Cloud 使用得越來越廣泛。馳狼課堂http://www.chilangedu.com (QQ群:348039381) Spring Boot 快速入門,Spring Boot 與Spring Cloud 整合,docker+k8s,大型電商商城等多套免費實戰教程可以幫您真正做到快速上手,將技術點切實運用到微服務專案中。”
關注公眾號,每天精彩內容,第一時間送達!