Spring Cloud Gateway可擴展的微服務網關使用教程
Spring Cloud Gateway 是一個基于 Spring Boot 2.x 的可擴展的微服務網關,它提供了一種簡單且靈活的方式來構建微服務架構中的 API 網關。Spring Cloud Gateway 專注于提供 API 網關所需的核心功能,如路由、斷路器、限流等,同時支持自定義擴展點,以便用戶能夠根據自身需求進行定制。
下面我們將通過一個簡單的示例來詳細介紹 Spring Cloud Gateway 的使用。
添加依賴
首先,在我們的項目中添加 Spring Cloud Gateway 的依賴。在 pom.xml 文件中添加如下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.1.3</version>
</dependency>
這里我們使用的是 Spring Cloud Gateway 的 3.1.3 版本。
配置路由規則
在 src/main/resources 目錄下創建一個 application.yml 文件,用于配置路由規則。例如,我們定義兩個服務 service-a 和 service-b,并設置相應的路由規則:
spring:
cloud:
gateway:
routes:
- id: route_a
uri: http://service-a/api
predicates:
- Path=/api/a/**
- id: route_b
uri: http://service-b/api
predicates:
- Path=/api/b/**
在這個例子中,我們定義了兩個路由規則。route_a 規則將 /api/a/** 路徑的請求轉發到 http://service-a/api,route_b 規則將 /api/b/** 路徑的請求轉發到 http://service-b/api。
自定義擴展點
Spring Cloud Gateway 提供了許多內置的擴展點,允許用戶根據需要進行定制。例如,我們可以實現org.springframework.cloud.gateway.handler.predicate.PredicateFactory 接口來定義新的路由規則條件。
這里我們創建一個自定義的路由規則條件 MyCustomPredicate,用于判斷請求是否滿足某些特定的條件:
package com.example.myservice.gateway;
import org.springframework.cloud.gateway.handler.predicate.PredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.RoutePredicate;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.cloud.gateway.route.builder.routes.RouteLocator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Configuration
public class MyGatewayConfig {
@Bean
public RoutePredicate myCustomPredicate(PredicateFactory predicateFactory) {
return predicateFactory.fromState(ServerWebExchange::getRequest, ServerHttpRequest::getURI)
::equals(ServerHttpRequest::getURI) // 這里簡單判斷請求的 URI 是否與目標 URI 相等
.then(Mono::just); // 如果相等,返回 Mono<Boolean> 類型的 true
}
}
在這個例子中,我們定義了一個 MyCustomPredicate 類,實現了 RoutePredicate 接口。在 myCustomPredicate 方法中,我們通過ServerWebExchange::getRequest 和 ServerHttpRequest::getURI 方法獲取請求的信息,并進行簡單的判斷。如果請求的 URI 與目標 URI 相等,返回 Mono<Boolean> 類型的 true。這樣,我們就可以將這個條件應用于路由規則中。
啟動網關
在完成上述配置后,我們可以啟動 Spring Cloud Gateway 網關。啟動方法與普通的 Spring Boot 應用類似,只需運行 mvn spring-boot:run 命令即可。
Spring Cloud Gateway 啟動后,會監聽默認的端口 8080。如果需要修改端口號,可以在 application.yml 文件中設置 server.port 屬性。
路由測試
我們可以通過發送 HTTP 請求來測試路由規則是否生效。例如,可以借助 Postman 或curl命令來進行測試。
對于上述示例中的路由規則,我們可以分別發送以下請求:
- 請求 route_a 路由規則:
curl -X GET http://localhost:8080/api/a/hello
- 請求 route_b 路由規則:
curl -X GET http://localhost:8080/api/b/hello
如果一切正常,你應該能夠分別獲得來自 service-a 和 service-b 的響應結果。
自定義擴展點使用
在上述示例中,我們創建了一個自定義的路由規則條件 MyCustomPredicate。要使用這個條件,我們需要在 application.yml 文件中添加以下配置:
spring:
cloud:
gateway:
routes:
- id: route_with_custom_predicate
uri: http://service-a/api
predicates:
- MyCustomPredicate=true
在這個例子中,我們創建了一個新的路由規則route_with_custom_predicate,并添加了 MyCustomPredicate=true 條件。這意味著只有當請求滿足 MyCustomPredicate 條件時,才會轉發請求到目標服務。
日志與監控
Spring Cloud Gateway 還提供了豐富的日志和監控功能。你可以通過配置 logging.level.* 和 management.endpoint.* 等屬性來啟用并定制日志和監控行為。例如,在 application.yml 文件中添加以下配置:
logging:
level:
root: INFO
management:
endpoint:
health:
show-details: always
這樣,你就能在日志中看到更詳細的路由、斷路器、限流等信息,并可以通過 /health 接口查看網關的健康狀態。