当前位置: 首页 > news >正文

网关-微服务网关实现

网关-微服务网关实现

在 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 的微服务网关,实现服务路由、权限控制、限流熔断等核心功能。这个网关可以作为整个微服务架构的统一入口,提升系统的安全性、可维护性和扩展性。

http://www.dtcms.com/a/286755.html

相关文章:

  • AI大模型打造金融智能信审助手04.七大金融监管相关政策
  • 活动图描述场景
  • CityEngine自动化建模
  • 代理模式及优化
  • 代码随想录day38dp6
  • STM32-第七节-TIM定时器-3(输入捕获)
  • 全排列 II
  • C#通过HslCommunication连接西门子PLC1200,并防止数据跳动的通用方法
  • 反序列化漏洞2-魔术方法介绍与演示
  • 怎么自己搭建云手机
  • http与https的主要区别是什么?
  • java数据类型
  • 锂电池无线充电电路设计
  • 零碳园区势在必行!安科瑞EMS3.0助力园区低碳智慧升级
  • Excel导出实战:从入门到精通 - 构建专业级数据报表的完整指南
  • 如何使用 Jackson 处理 YAML
  • AE电源MDX 5K 10K 15K 20K 25K 30K手侧操作使用说明
  • 拉普拉斯方程傅里叶积分解法
  • @Primary 是做什么的?
  • CAD 约束求解:核心技术原理、流程及主流框架快速解析
  • A33-vstar笔记及资料分享:搭建交叉编译环境
  • 动态规划 + DFS + 记忆化!Swift 解 LeetCode 329 的实战笔记
  • 实战指南|智慧无人机安防系统搭建全流程解析
  • 记录DataGrip 2025.1.3破解失败后,无法重启问题修复
  • centos7安装MySQL8.4手册
  • Hive数据仓库工具
  • 甲状腺结节TI-RADS分类的多目标分类头任务深度学习模型评估报告
  • go语言学习之包
  • 新书推介 | 吉林大学出版教材《汽车智能辅助驾驶系统技术》,国产仿真工具链GCKontrol-GCAir教学应用
  • Python_2