Spring Cloud Zuul 實現了路由規則與實例的維護問題,經過 Spring Cloud Eureka 進行整合,將自身註冊爲 Eureka 服務治理下的應用,同時從 Eureka 中獲取了全部其餘微服務的實例信息,這樣的設計很是巧妙的將服務治理體系中維護的實例信息利用起來,使得維護服務實例的工做交給了服務治理框架自動完成,而對路由規則的維護,默認會將經過以服務名做爲 ContextPath 的方式來建立路由映射,也能夠作一些特別的配置,對於簽名校驗、登陸校驗等在微服務架構中的冗餘問題,邏輯上來講,本質上和微服務應用自身的業務並無多大的關係,因此他們徹底能夠獨立成一個單獨的服務存在,只是他們被剝離和獨立出來以後,是在 API 網關統一調用來對微服務接口作前置過濾,以實現對微服務接口的攔截和校驗。Spring Cloud Zuul 提供了一套過濾機制,能夠很好的支持這樣的任務,開發者能夠經過使用 Zuul 來建立各類校驗過濾器,而後指定哪些規則的請求須要執行校驗邏輯,只有經過校驗的纔會被路由到具體的微服務接口,使得咱們的微服務應用能夠更專一與業務邏輯的開發,同時微服務的自動化測試也變得更容易實現。 java
快速入門 spring
<?xml version="1.0" encoding="UTF-8"?>apache
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"api
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>app
<groupId>org.lixue</groupId>負載均衡
<artifactId>gateway-zuul</artifactId>框架
<version>0.0.1-SNAPSHOT</version>運維
<packaging>jar</packaging>socket
<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 核心依賴,還包括了一下重要依賴:
@EnableZuulProxy
@SpringBootApplication
public class GatewayZuulApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayZuulApplication.class, args);
}
}
server:
port: 9300
spring:
application:
name: gateway-zuul
完成上面的步驟,基本的 Zuul 實現的 API 網關服務就構建完成了,下面將增長請求路由相關配置。
請求路由
傳統路由方式
使用 Spring Cloud Zuul 實現路由功能很是簡單,只須要增長一些關於路由的配置,就能實現傳統的路由轉發功能,好比:
zuul:
routes:
api:
path: /api/**
該配置定義了發往 API 網關服務的請求中,全部符合 /api/** 規則的訪問都被路由轉發到 http://localhost:8080 地址上,配置屬性中的 api 部分爲路由的名字,能夠任意定義,可是一組 path 和 url 映射關係的路由名要相同。
面向服務的路由
傳統的路由配置方式對於咱們來講並不友好,須要運維人員花費大量的時間來維護各個路由 path 與 url 的關係,爲了解決這個問題 Spring Cloud Zuul 實現了與 Spring Cloud Eureka 的無縫整合,咱們可讓路由的 path 不是映射具體的url,而是讓映射到具體的服務,而具體的 url 則交給 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 的映射組成,是的維護供桌變得很是簡單。