1. 程式人生 > >第七章 API閘道器服務:Spring Cloud Zuul

第七章 API閘道器服務:Spring Cloud Zuul

  API閘道器是一個更為智慧的應用伺服器, 它的定義類似於面向物件設計模式中的Facade模式, 它的存在就像是整個微服務架構系統的門面一樣,所有的外部客戶端訪問都需要經過它來進行排程和過濾。它除了要實現請求路由、 負載均衡、 校驗過濾等功能之外, 還需要更多能力, 比如與服務治理框架的結合、 請求轉發時的熔斷機制、 服務的聚合等一系列高階功能

  首先, 對千路由規則與服務例項的維護間題。 SpringCloud Zuul通過與SpringCloud Eureka進行整合, 將自身註冊為Eureka服務治理下的應用, 同時從Eureka中獲得了所有其他微服務的例項資訊;其次, 對千類似簽名校驗、 登入校驗在微服務架構中的冗餘問題。 理論上來說, 這些校驗邏輯在本質上與微服務應用自身的業務並沒有多大的關係, 所以 它們完全可以獨立成一個單獨的服務存在, 只是它們被剝離和獨立出來之後, 並不是給各個微服務呼叫, 而是在API閘道器服務上進行統一呼叫來對微服務介面做前置過濾, 以實現對微服務介面的攔截和校驗

構建閘道器

建立一個基礎的Spring Boot工程, 命名為api-gateway, 並在 pom.xml中引入spring-cloud-starter-zuul依賴, 具體如下

<parent> 
  <groupld>org.springframework.boo七</groupid>
  <artifactld>spring - boot - starter - paren七</artifact工d>
  <version>l.3.7.RELEASE</version> 
  <relativePath/> 
</parent> 
<dependencies> 
  <dependency> 
    <groupid>org.springframework.cloud</groupid> 
    <artifactld>spring - cloud - starter - zuul</artifactid> 
  </dependency> 
</dependencies> 
<dependencyManagement> 
  <dependencies> 
    <dependency> 
      <groupld>org.springframework.cloud</groupld> 
      <artifactid>spring - cloud - dependencies</artifactid> 
      <version>Brixton.SRS</version> 
      <type>pom</type> 
      <scope>impor七</scope>
    </dependency> 
  </dependencies> 
</dependencyManagement>

對於spring-cloud-starter-zuul依賴, 可以通過檢視它的依賴內容瞭解到:該模組中不僅包含了Netflix Zuul的核心依賴 zuul-core, 它還包含了下面這些閘道器服務需要的重要依賴:

  • spring-cloud-starter-hystrix: 該依賴用來在閘道器服務中實現對微服務轉發時候的保護機制, 通過執行緒隔離和斷路器,防止微服務的故障引發API閘道器資源無法釋放, 從而影響其他應用的對外服務
  • spring-cloud-starter-ribbon:該依賴用來實現在閘道器服務進行路由轉發時候的客戶端負載均衡以及請求重試
  • spring-boot-starter-actuator:該依賴用來提供常規的微服務管理端點。 另外, 在Spring Cloud Zuul中還特別提供了/routes端點來返回當前的所有路由規則

建立應用主類, 使用@EnableZuulProxy註解開啟Zuul的API閘道器服務功能

@EnableZuulProxy 
@SpringCloudApplication 
public class Applica七ion { 
public static void main(String[] args) { 
    new SpringApplicationBuilder(Application.class) .web(true) .run(args); 
    }
}

在application.properties中配置Zuul應用的基礎資訊, 如應用名、 服務埠號等, 具體內容如下:

spring.application.name=api-gateway 
server.port=5555