在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等技术无缝集成,帮助构建健壮的微服务架构。
本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!
标签:网关,Spring,Boot,springframework,cloud,org,import,路由 From: https://www.cnblogs.com/szk123456/p/18317068