前面學習了Eureka、Feign、Hystrix、Config,本篇來學習下API網關zuul。在微服務架構中,後端服務每每不直接開放給調用端,而是經過一個API網關根據請求的url,路由到相應的服務。當添加API網關後,在第三方調用端和服務提供方之間就建立了一面牆,這面牆直接與調用方通訊進行權限控制,後將請求均衡分發給後臺服務端。html
爲何須要API Gateway前端
一、簡化客戶端調用複雜度java
在微服務架構模式下後端服務的實例數通常是動態的,對於客戶端而言很難發現動態改變的服務實例的訪問地址信息。所以在基於微服務的項目中爲了簡化前端的調用邏輯,一般會引入API Gateway做爲輕量級網關,同時API Gateway中也會實現相關的認證邏輯從而簡化內部服務之間相互調用的複雜度。web
二、數據裁剪以及聚合spring
一般而言不一樣的客戶端對於顯示時對於數據的需求是不一致的,好比手機端或者Web端又或者在低延遲的網絡環境或者高延遲的網絡環境。apache
所以爲了優化客戶端的使用體驗,API Gateway能夠對通用性的響應數據進行裁剪以適應不一樣客戶端的使用需求。同時還能夠將多個API調用邏輯進行聚合,從而減小客戶端的請求數,優化客戶端用戶體驗後端
三、多渠道支持api
固然咱們還能夠針對不一樣的渠道和客戶端提供不一樣的API Gateway,對於該模式的使用由另一個你們熟知的方式叫Backend for front-end, 在Backend for front-end模式當中,咱們能夠針對不一樣的客戶端分別建立其BFF,進一步瞭解BFF能夠參考這篇文章:Pattern: Backends For Frontends瀏覽器
四、遺留系統的微服務化改造tomcat
對於系統而言進行微服務改造一般是因爲原有的系統存在或多或少的問題,好比技術債務,代碼質量,可維護性,可擴展性等等。API Gateway的模式一樣適用於這一類遺留系統的改造,經過微服務化的改造逐步實現對原有系統中的問題的修復,從而提高對於原有業務響應力的提高。經過引入抽象層,逐步使用新的實現替換舊的實現。
在Spring Cloud體系中, Spring Cloud Zuul就是提供負載均衡、反向代理、權限認證的一個API gateway。
zuul簡單使用
1、引入依賴
引入spring-cloud-starter-netflix-zuul,須要注意springboot的版本號和spring-cloud的版本號,這邊在實現的過程當中就出現因版本不一致致使的錯誤。下面的xml中也直接引入了後面要用的spring-cloud-starter-netflix-eureka-client。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>SpringColudZuulSimple</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>SpringColudZuulSimple</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2、使用@EnableZuulProxy
在main方法中添加@EnableZuulProxy註解。
3、設置配置文件
在application.properties中增長以下配置。
spring.application.name=gateway-service-zuul
server.port=8890
zuul.routes.baidu.path=/it/**
zuul.routes.baidu.url=https://www.cnblogs.com/
4、測試
在瀏覽器輸入http://localhost:8890/it/5ishare,瀏覽器會跳轉到以下頁面。
服務化
實際上在實現微服務架構時,服務名與服務實例地址的關係在eureka server中已經存在了,因此只須要將Zuul註冊到eureka server上去發現其餘服務,就能夠實現對serviceId的映射。
1、引入依賴
在上面的SpringColudZuulSimple中添加spring-cloud-starter-netflix-eureka-client依賴。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2、添加配置
spring.application.name=gateway-service-zuul
server.port=8890
zuul.routes.baidu.path=/it/**
zuul.routes.baidu.url=https://www.cnblogs.com/
zuul.routes.api-a.path=/producer/**
zuul.routes.api-a.serviceId=spring-cloud-producer
eureka.client.serviceUrl.defaultZone=http://localhost:8088/eureka/
3、測試
依次啓動EurekaServer、EurekaClient、SpringColudZuul。在瀏覽器輸入http://localhost:8890/producer/hello?name=cuiyw。
網關的默認路由規則
默認狀況下,Zuul會代理全部註冊到Eureka Server的微服務,而且Zuul的路由規則以下:http://ZUUL_HOST:ZUUL_PORT/微服務在Eureka上的serviceId/**會被轉發到serviceId對應的微服務。註銷掉gateway-service-zuul-eureka項目中關於路由的配置:
#zuul.routes.api-a.path=/producer/**
#zuul.routes.api-a.serviceId=spring-cloud-producer
重啓輸入http://localhost:8890/spring-cloud-producer/hello?name=cuiyw。
參考:http://www.ityouknow.com/springcloud/2017/06/01/gateway-service-zuul.html