Spring Cloud 7:Gateway
Zuul 網關
Zuul 是 Netfilx 開源的一個 API Gateway 服務器,本質是一個 Web Servlet 應用。其在微服務架構體系中提供動態路由、監控、彈性、安全等邊緣服務。
使用 Zuul 作為網關,其主要原因有以下幾點:
1、Zuul、Ribbon 以及 Consul 客戶端結合使用,能夠輕松實現智能路由、負載均衡功能;
2、在網關層統一對外提供 API 接口,保護了實際提供接口的微服務實現細節,同時也方便測試人員對微服務接口進行測試;
3、在網關層能夠統一添加身份認證、鑒權等功能,防止對微服務 API 接口的非法調用;
4、在網關層可以方便地對訪問請求進行記錄,實現監控相關功能;
5、在網關層實現流量監控,在流量比較大時,方便對服務實施降級。
Zuul 工作原理
Zuul 的核心是一系列的 Filters,其作用可以類比 Servlet 框架的 Filter,或者 AOP。Zuul 中定義了四種標準過濾器類型,分別是 pre、post、routing 以及 error 過濾器。
1、pre 過濾器:在請求路由到具體微服務之前執行,其主要用於身份驗證、鑒權等功能;
2、routing 過濾器:其主要功能是將請求路由到具體的微服務實例;
3、post 過濾器:在對具體微服務調用之後執行,其主要用於收集統計信息、指標以及對請求響應數據進行處理等;
4、error 過濾器:在以上三種過濾器執行出錯時執行。
yang-gateway
pom.xml
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.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>Greenwich.M3</spring-cloud.version> </properties> <dependencies> <!--Actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--Consul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <!--Zuul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>importView Code</scope> </dependency> </dependencies> </dependencyManagement>
bootstrap.yml
server: port: 1003 spring: application: name: yang-gateway cloud: consul: host: 127.0.0.1 port: 8500 discovery: register: true healthCheckPath: /server/consul/health healthCheckInterval: 10s instance-id: ${spring.application.name} zuul: routes: yang-service: path: /** serviceId: yang-diver
Application.java
@SpringBootApplication @EnableZuulProxy public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
訪問路徑:http://localhost:1003/user/list
此時Gateway訪問到了yang-diver服務的內容了。
路由配置
傳統的路由配置
在不依賴於服務發現機制的情況下,通過在配置文件中具體指定每個路由表達式與服務實例的映射關系來實現API網關對外部請求的路由。
單實例配置
通過一組zuul.routes.<route>.path與zuul.routes.<route>.url參數對的方式配置。
server: port: 1003 spring: application: name: yang-gateway zuul: routes: yang-service: path: /yang-diver/** url: http://localhost:1002/
凡是路徑為:http://localhost:1003/yang-diver/** 的請求,都會轉發請求到http://localhost:1002/** 地址
多實例配置
通過一組zuul.routes.<route>.path與zuul.routes.<route>.serviceId參數對的方式配置
zuul: routes: yang-service: path: /yang-diver/** serviceId: yang-diver ribbon: eureka: enabled: false # 沒有配置服務治理(Eureka)就需要關閉,否則會找不到服務 yang-service: ribbon: # 為serviceId去指定具體的服務實例地址 listOfServers: http://localhost:1001/,http://localhost:1002/
此時,凡是路徑為:http://localhost:1003/yang-diver/** 的請求,都會轉發請求到http://localhost:1001/** 和http://localhost:1002/** 地址
服務路由配置
整合服務治理後,只需要提供一組zuul.routes.<route>.path與zuul.routes.<route>.serviceId參數對的配置即可。
server: port: 1003 spring: application: name: yang-gateway cloud: consul: host: 127.0.0.1 port: 8500 discovery: register: true healthCheckPath: /server/consul/health healthCheckInterval: 10s instance-id: ${spring.application.name} zuul: routes: yang-service: path: /** serviceId: yang-diver
還可以通過zuul.routes.<serviceId>=<path>,直接進行路由轉。,其中<serviceId>用來指定路由的具體服務名,<path>用來配置匹配的請求表達式。
zuul: routes: yang-diver: path: /** # serviceId: yang-diver
實際上,服務註冊中心已經維護了serverId與實例地址的映射關系。當Gateway註冊到服務註冊中心後,就能從註冊中心獲取所有服務以及它們的實例清單。
Spring Cloud 7:Gateway