1. 程式人生 > >筆記:Spring Cloud Zuul 快速入門

筆記:Spring Cloud Zuul 快速入門

註解 app 一個 frame 1.0 業務邏輯 中心 sco ice

Spring Cloud Zuul 實現了路由規則與實例的維護問題,通過 Spring Cloud Eureka 進行整合,將自身註冊為 Eureka 服務治理下的應用,同時從 Eureka 中獲取了所有其他微服務的實例信息,這樣的設計非常巧妙的將服務治理體系中維護的實例信息利用起來,使得維護服務實例的工作交給了服務治理框架自動完成,而對路由規則的維護,默認會將通過以服務名作為 ContextPath 的方式來創建路由映射,也可以做一些特別的配置,對於簽名校驗、登錄校驗等在微服務架構中的冗余問題,邏輯上來說,本質上和微服務應用自身的業務並沒有多大的關系,所以他們完全可以獨立成一個單獨的服務存在,只是他們被剝離和獨立出來之後,是在

API 網關統一調用來對微服務接口做前置過濾,以實現對微服務接口的攔截和校驗。Spring Cloud Zuul 提供了一套過濾機制,可以很好的支持這樣的任務,開發者可以通過使用 Zuul 來創建各種校驗過濾器,然後指定哪些規則的請求需要執行校驗邏輯,只有通過校驗的才會被路由到具體的微服務接口,使得我們的微服務應用可以更專註與業務邏輯的開發,同時微服務的自動化測試也變得更容易實現。

快速入門

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

    <?xml version="1.0" encoding="UTF-8"?>

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>org.lixue</groupId>

    <artifactId>gateway-zuul</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <packaging>jar</packaging>

    <name>gateway-zuul</name>

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.5.6.RELEASE</version>

<relativePath/> <!-- lookup parent from repository -->

</parent>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

<spring-cloud.version>Dalston.SR3</spring-cloud.version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-zuul</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

</dependencies>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-dependencies</artifactId>

<version>${spring-cloud.version}</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

</project>

對於 Spring-Cloud-starter-zuul 依賴,可以通過查看他的依賴內容了解到,該模塊不僅包含了 zuul-core 核心依賴,還包括了一下重要依賴:

  • spring-cloud-starter-hystrix:該依賴用來在網關服務中實現對微服務轉發時候的保護機制,通過線程隔離和斷路器,防止微服務的故障引發 API 網關資源無法釋放,從而影響其他應用的對外服務
  • spring-cloud-starter-ribbon:該依賴用來實現在網關服務進行路由轉發時候,客戶端負載均衡以及請求重試。
  • spring-boot-starter-actuator:該依賴用來提供常規的微服務管理端點,在 Spring Cloud Zuul 中還提供了 /routes 端點來返回當前的所有路由規則
  • 創建應用主類 GatewayZuulApplication ,使用 @EnableZuulProxy 註解開啟Zuul的API網關服務功能,代碼如下:

    @EnableZuulProxy

    @SpringBootApplication

    public class GatewayZuulApplication {

    public static void main(String[] args) {

    SpringApplication.run(GatewayZuulApplication.class, args);

    }

    }

  • application.yml 中配置 Zuul 應用的基礎信息,比如應用名稱、端口號等,具體內容如下:

    server:

    port: 9300

    spring:

    application:

    name: gateway-zuul

    完成上面的步驟,基本的 Zuul 實現的 API 網關服務就構建完成了,下面將增加請求路由相關配置。

請求路由

傳統路由方式

使用 Spring Cloud Zuul 實現路由功能非常簡單,只需要增加一些關於路由的配置,就能實現傳統的路由轉發功能,比如:

zuul:

routes:

api:

path: /api/**

url: http://localhost:8080

該配置定義了發往 API 網關服務的請求中,所有符合 /api/** 規則的訪問都被路由轉發到 http://localhost:8080 地址上,配置屬性中的 api 部分為路由的名字,可以任意定義,但是一組 path url 映射關系的路由名要相同。

面向服務的路由

傳統的路由配置方式對於我們來說並不友好,需要運維人員花費大量的時間來維護各個路由 path url 的關系,為了解決這個問題 Spring Cloud Zuul 實現了與 Spring Cloud Eureka 的無縫整合,我們可以讓路由的 path 不是映射具體的url,而是讓映射到具體的服務,而具體的 url 則交給 Eureka 的服務發現機制去自動維護。

  • 為了與 Eureka 整合,我們需要增加 spring-cloud-starter-eureka 依賴,具體如下:

    <dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-eureka</artifactId>

    </dependency>

    調整在 application.yml 中配置,增加 eureka 的註冊中心的配置,並配置服務路由,具體如下:

    eureka:

    client:

    service-url:

    defaultZone: http://eurekaserver2:9002/eureka,http://eurekaserver1:9001/eureka

    zuul:

    routes:

    api:

    path: /api/**

    serviceId: org.lixue.helloworld

    consumer:

    path: /consumer/**

    serviceId: eureka-feign-consumer

    # 增加 zuul 超時相關

    host:

    connect-timeout-millis: 10000

    socket-timeout-millis: 5000

    # 增加斷路器超時時間

    hystrix:

    command:

    default:

    execution:

    isolation:

    thread:

    timeoutInMilliseconds: 60000

通過面向服務的路由配置方式,我們不需要再為各個路由維護微服務應用的具體實例的位置,而是通過簡單的path 與 serviceId 的映射組成,是的維護供桌變得非常簡單。

筆記:Spring Cloud Zuul 快速入門