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