网关-微服务网关实现
网关-微服务网关实现
在 Spring Boot 中使用 Spring Cloud Gateway 实现微服务网关,是构建微服务架构中非常常见的做法。它提供了强大的路由、过滤、限流、熔断等功能,且与 Spring Cloud 生态(如 Nacos、Eureka、Sentinel 等)集成良好。
一、开发步骤总览
步骤 | 内容 |
---|---|
1️⃣ | 创建 Spring Boot 项目并引入依赖 |
2️⃣ | 配置服务注册中心(如 Nacos) |
3️⃣ | 配置网关路由规则(YAML) |
4️⃣ | 自定义全局过滤器(如鉴权) |
5️⃣ | 配置限流、熔断等高级功能(可选) |
6️⃣ | 启动网关并测试路由功能 |
二、具体代码实现
1️⃣ 创建 Spring Boot 项目并引入依赖(pom.xml
)
<dependencies><!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 服务注册发现(以 Nacos 为例) --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- WebFlux(网关基于 WebFlux) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><!-- 日志、工具类 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
</dependencies>
2️⃣ 配置服务注册中心(如 Nacos)
# application.yml
server:port: 8080spring:application:name: gateway-servicecloud:nacos:discovery:server-addr: 127.0.0.1:8848 # Nacos 地址gateway:discovery:locator:enabled: true # 开启服务发现自动路由routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/api/user/**filters:- StripPrefix=1- AuthFilter- id: order-serviceuri: lb://order-servicepredicates:- Path=/api/order/**filters:- StripPrefix=1
gateway.discovery.locator.enabled: true
:自动将服务名作为路径前缀。routes
:手动配置路由规则,更灵活。
3️⃣ 自定义全局过滤器(鉴权示例)
@Component
public class AuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();String token = request.getHeaders().getFirst("Authorization");if (token == null || !token.startsWith("Bearer ")) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}// 可以在这里验证 token(如 JWT 解析)String userId = parseToken(token);// 将用户信息放入请求头,供下游服务使用ServerHttpRequest newRequest = request.mutate().header("X-User-ID", userId).build();return chain.filter(exchange.mutate().request(newRequest).build());}private String parseToken(String token) {// 简化处理,实际应使用 JWT 解析return "user123";}@Overridepublic int getOrder() {return 0; // 过滤器顺序}
}
- 实现
GlobalFilter
接口,定义全局过滤逻辑。 - 可用于鉴权、日志、请求头处理等。
4️⃣ 配置限流(可选)
使用 Redis + RequestRateLimiter 实现限流:
spring:cloud:gateway:routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/api/user/**filters:- StripPrefix=1- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10 # 每秒补充 10 个令牌redis-rate-limiter.burstCapacity: 20 # 最大突发请求 20 个key-resolver: "#{@userKeyResolver}" # 使用自定义 Key 解析器
@Bean
public KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getHeaders().getFirst("X-User-ID"));
}
- 使用 Redis 实现分布式限流。
- 可防止恶意刷接口、保护后端服务。
5️⃣ 配置熔断(可选)
spring:cloud:gateway:routes:- id: order-serviceuri: lb://order-servicepredicates:- Path=/api/order/**filters:- StripPrefix=1- name: Hystrixargs:name: fallbackCommandfallbackUri: forward:/fallback
@RestController
public class FallbackController {@GetMapping("/fallback")public Mono<String> fallback() {return Mono.just("服务暂时不可用,请稍后再试");}
}
- 当服务不可用时,返回默认响应。
- 提高系统容错能力。
三、启动网关并测试
1. 启动网关服务
mvn spring-boot:run
2. 测试请求
curl -H "Authorization: Bearer abc123" http://localhost:8080/api/user/info
- 请求将被网关路由到
user-service
- 经过
AuthFilter
鉴权 - 如果服务正常,返回用户信息
- 如果服务异常,触发熔断机制
四、完整流程图
[客户端请求] → [网关]↓
[鉴权过滤器 AuthFilter]↓
[限流过滤器 RequestRateLimiter]↓
[熔断过滤器 Hystrix]↓
[路由到对应微服务(user-service / order-service)]
五、总结:Spring Cloud Gateway 的核心功能
功能 | 示例 |
---|---|
路由转发 | Path=/api/user/** → user-service |
鉴权过滤 | 自定义 AuthFilter 校验 Token |
限流控制 | RequestRateLimiter + Redis |
熔断降级 | Hystrix + fallback |
日志记录 | 可通过 Filter 实现 |
负载均衡 | 默认集成 Ribbon,支持多个实例 |
服务发现 | 支持 Nacos、Eureka、Consul 等 |
六、推荐使用场景
- 微服务数量较多,需要统一入口管理
- 需要统一鉴权、限流、熔断
- 使用 Spring Cloud 技术栈
- 需要高并发、高性能的 API 管理能力
通过以上步骤,可以快速搭建一个基于 Spring Boot + Spring Cloud Gateway 的微服务网关,实现服务路由、权限控制、限流熔断等核心功能。这个网关可以作为整个微服务架构的统一入口,提升系统的安全性、可维护性和扩展性。