在Spring Boot中實現API閘道器與路由
大家好,我是微賺淘客系統3.0的小編,是個冬天不穿秋褲,天冷也要風度的程式猿!今天我們將探討如何在Spring Boot中實現API閘道器與路由。API閘道器是一種用於管理和路由請求的中間層,它可以集中處理認證、路由、負載均衡、快取等功能。Spring Cloud Gateway是Spring提供的一個功能強大的API閘道器解決方案。
一、Spring Cloud Gateway簡介
Spring Cloud Gateway是一個非阻塞的API閘道器,它基於Spring WebFlux構建,支援動態路由、負載均衡、斷路器等功能。它的核心功能包括:
- 路由:將請求路由到目標服務。
- 過濾器:在請求和響應過程中進行處理。
- 負載均衡:將請求均勻分配到多個例項。
- 斷路器:保護系統免受故障蔓延。
二、整合Spring Cloud Gateway
-
新增依賴
首先,在
pom.xml
中新增Spring Cloud Gateway的依賴:<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>
確保在
pom.xml
中新增了Spring Cloud的版本管理:<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2023.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
-
配置閘道器
在Spring Boot應用的配置檔案
application.yml
中定義路由規則。以下是一個簡單的配置示例:spring: cloud: gateway: routes: - id: service1 uri: http://localhost:8081 predicates: - Path=/service1/** filters: - StripPrefix=1 - id: service2 uri: http://localhost:8082 predicates: - Path=/service2/** filters: - StripPrefix=1
在這個配置中,我們定義了兩個路由:
service1
:將請求轉發到http://localhost:8081
,路徑字首/service1
將被移除。service2
:將請求轉發到http://localhost:8082
,路徑字首/service2
將被移除。
-
主應用類
在主應用類上新增
@EnableGateway
註解(通常,spring-boot-starter-gateway
自動啟用,無需額外註解):package cn.juwatech.gatewaydemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class GatewayDemoApplication { public static void main(String[] args) { SpringApplication.run(GatewayDemoApplication.class, args); } }
三、建立示例服務
為了測試API閘道器的路由功能,我們需要建立兩個簡單的服務應用。
-
Service1
package cn.juwatech.service1; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication public class Service1Application { public static void main(String[] args) { SpringApplication.run(Service1Application.class, args); } } @RestController class Service1Controller { @GetMapping("/greet") public String greet() { return "Hello from Service1!"; } }
-
Service2
package cn.juwatech.service2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication public class Service2Application { public static void main(String[] args) { SpringApplication.run(Service2Application.class, args); } } @RestController class Service2Controller { @GetMapping("/greet") public String greet() { return "Hello from Service2!"; } }
四、定義自定義過濾器
Spring Cloud Gateway允許我們定義自定義過濾器,用於在請求和響應過程中插入自定義邏輯。以下是一個自定義過濾器的示例:
-
建立過濾器
package cn.juwatech.gatewaydemo.filters; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.web.server.WebFilter; import reactor.core.publisher.Mono; @Component public class CustomFilter implements GatewayFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("Custom filter: Request Path - " + exchange.getRequest().getPath()); return chain.filter(exchange).then(Mono.fromRunnable(() -> { System.out.println("Custom filter: Response Status - " + exchange.getResponse().getStatusCode()); })); } }
註冊自定義過濾器:
package cn.juwatech.gatewaydemo; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.cloud.gateway.filter.GatewayFilter; import cn.juwatech.gatewaydemo.filters.CustomFilter; @Configuration public class GatewayConfig { @Bean public GatewayFilter customFilter() { return new CustomFilter(); } }
五、負載均衡
Spring Cloud Gateway可以與Spring Cloud LoadBalancer結合使用,以實現客戶端負載均衡。新增Spring Cloud LoadBalancer的依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
在閘道器配置中,使用服務名進行路由:
spring:
cloud:
gateway:
routes:
- id: loadBalancedService
uri: lb://SERVICE-NAME
predicates:
- Path=/service/**
filters:
- StripPrefix=1
在這裡,lb://SERVICE-NAME
表示負載均衡的服務名。
六、實現斷路器
Spring Cloud Gateway支援斷路器功能,透過Resilience4j
或Hystrix
庫實現。在pom.xml
中新增Resilience4j的依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
在配置檔案中啟用斷路器:
spring:
cloud:
gateway:
routes:
- id: serviceWithCircuitBreaker
uri: http://localhost:8081
predicates:
- Path=/service/**
filters:
- CircuitBreaker=cb
- StripPrefix=1
resilience4j:
circuitbreaker:
instances:
cb:
registerHealthIndicator: true
failureRateThreshold: 50
waitDurationInOpenState: 10000
slidingWindowSize: 100
七、總結
在Spring Boot中實現API閘道器與路由,可以有效地集中管理服務的請求路由、過濾、負載均衡及斷路器等功能。Spring Cloud Gateway提供了靈活的路由配置、豐富的過濾器機制,並且與Spring Cloud LoadBalancer、Resilience4j等技術無縫整合,幫助構建健壯的微服務架構。
本文著作權歸聚娃科技微賺淘客系統開發者團隊,轉載請註明出處!