当前位置: 首页 > 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.lryc.cn/news/592775.html

相关文章:

  • Postman/Apipost中使用Post URL编码发送含换行符参数的问题分析
  • vue2 面试题及详细答案150道(101 - 120)
  • 智慧后厨检测算法构建智能厨房防护网
  • Redis学习其三(订阅发布,主从复制,哨兵模式)
  • 【大模型:知识图谱】--6.Neo4j DeskTop安装+使用
  • RS485转PROFIBUS DP网关写入命令让JRT激光测距传感器开启慢速模式连续测量
  • CCF编程能力等级认证GESP—C++1级—20250628
  • FLTK UI窗口关闭时延时卡顿问题全流程分析与优化实战
  • C++算法竞赛篇:DevC++ 如何进行debug调试
  • 记录DataGrip 2025.1.3破解失败后,无法重启问题修复
  • 第16章 基于AB实验的增长实践——验证想法:AB实验实践
  • pom.xml文件中的${}变量从哪里传值
  • UniApp TabBar 用户头像方案:绕过原生限制的实践
  • React + Mermaid 图表渲染消失问题剖析及 4 种代码级修复方案
  • Java异步日志系统性能优化实践指南:基于Log4j2异步Appender与Disruptor
  • Camera相机人脸识别系列专题分析之十七:人脸特征检测FFD算法之libhci_face_camera_api.so 296点位人脸识别检测流程详解
  • CentOS 7 配置环境变量常见的4种方式
  • 虚拟机centos服务器安装
  • 机器人行业10年巨变从协作机器人到具身智能的萌芽、突破和成长——从 Automatic慕尼黑10 年看协作机器人到具身智能的发展
  • 低代码可视化工作流的系统设计与实现路径研究
  • Linux基础开发工具
  • 智合同丨当AI成为法律人的助手:合同审查效率变革观察
  • 代码随想录算法训练营第二十四天
  • Linux学习之认识Linux的基本指令
  • Linux 环境下 NTP 时间同步与 SSH 免密登录实战
  • 函数返回值问题,以及返回值的使用问题(c/c++)
  • RWA是什么意思?
  • 李天意考研数学精讲课学习笔记(课堂版)
  • elementui-admin构建
  • MBIST - Memory BIST会对memory进行清零吗?