核心内容摘要
STM32毕设开源项目实战:从需求分析到量产级代码架构
微服务架构中为什么需要API网关在微服务架构中一个系统通常会被拆分为多个独立的微服务。
如果客户端直接调用每个微服务的地址会面临以下问题客户端复杂性高需要维护多个微服务的地址和配置代码冗余且难以维护。
认证鉴权复杂每个微服务可能有不同的认证方式客户端需要适配多种认证逻辑。
跨域与协议问题存在跨域请求、防火墙限制、浏览器协议兼容性等问题。
系统难以重构微服务随着项目迭代可能需要重新划分直接调用会导致调用链重构困难。
API网关应运而生它作为系统的统一入口为微服务提供路由转发、认证鉴权、流量控制、监控日志等公共能力实现业务与非业务逻辑的解耦。
Spring Cloud Gateway 是什么Spring Cloud Gateway 是 Spring Cloud 官方推出的第二代网关框架旨在取代 Netflix Zuul。
它具有以下特点响应式编程基于 WebFlux Netty Reactor 实现不支持传统的 Servlet 容器。
高性能官方基准测试显示其性能显著优于 Zuul1 和 Zuul2。
灵活的路由与过滤机制支持动态路由、断言匹配、过滤器链等核心功能。
官方文档Spring Cloud Gateway Reference性能对比部分数据网关类型平均延迟每秒请求数/线程Spring Cloud Gateway
61ms
24kZuul
1
56ms
09kZuul
2
09ms
1
77k
Spring Cloud Gateway 核心概念
1 路由Route路由是网关中最基本的单元包含ID唯一标识URI目标服务地址Predicates断言条件Filters过滤器链
2 断言Predicates基于 Java 8 的PredicateServerWebExchange用于匹配 HTTP 请求的各个部分如路径、请求头、参数等。
匹配成功则路由生效。
3 过滤器Filter分为两类GatewayFilter作用于特定路由GlobalFilter全局生效作用于所有路由
Spring Cloud Gateway 工作原理text客户端请求 → 网关路由匹配 → 执行Pre过滤器链 → 转发至目标服务 → 执行Post过滤器链 → 返回响应过滤器分为pre和post两种pre过滤器在转发前执行如鉴权、添加请求头post过滤器在收到响应后执行如日志记录、修改响应
Spring Cloud Gateway 实战详解
1 快速接入1引入依赖xmldependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-gateway/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-loadbalancer/artifactId /dependency注意Gateway 与spring-webmvc冲突需排除后者。
2配置文件示例yamlspring: application: name: mall-gateway cloud: nacos: discovery: server-addr:
127.
0.
1:8848 gateway: routes: - id: order_route uri: lb://mall-order predicates: - Path/order/** - id: user_route uri: lb://mall-user predicates: - Path/user/**3测试访问texthttp://localhost:8888/order/findOrderByUserId/
1
2 路由断言工厂Predicate Factories
5.
1 路径匹配yamlpredicates: - Path/order/**
5.
2 Header 匹配yamlpredicates: - HeaderX-Request-Id, \d请求头X-Request-Id的值必须为数字。
3 过滤器工厂GatewayFilter Factories
5.
1 添加请求头yamlfilters: - AddRequestHeaderX-Request-color, red
5.
2 添加请求参数yamlfilters: - AddRequestParametercolor, blue
5.
3 自定义过滤器工厂javaComponent public class CheckAuthGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory { Override public GatewayFilter apply(NameValueConfig config) { return (exchange, chain) - { log.info(调用自定义过滤器{} {}, config.getName(), config.getValue()); return chain.filter(exchange); }; } }配置使用yamlfilters: - CheckAuthfox,男
4 全局过滤器Global Filters
5.
1 负载均衡过滤器ReactiveLoadBalancerClientFilter负责将lb://service转换为实际的服务地址。
5.
2 自定义全局过滤器实现鉴权javaComponent public class CheckAuthFilter implements GlobalFilter, Ordered { Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { String token exchange.getRequest().getHeaders().getFirst(token); if (token null) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } // TODO: 校验token return chain.filter(exchange); } Override public int getOrder() { return 2; } }
5 跨域配置CORSYAML 配置方式yamlspring: cloud: gateway: globalcors: cors-configurations: [/**]: allowed-origins: * allowed-methods: *Java 配置方式javaBean public CorsWebFilter corsFilter() { CorsConfiguration config new CorsConfiguration(); config.addAllowedOrigin(*); config.addAllowedMethod(*); config.addAllowedHeader(*); UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource(new PathPatternParser()); source.registerCorsConfiguration(/**, config); return new CorsWebFilter(source); }
6 基于 Redis Lua 的限流1引入依赖xmldependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis-reactive/artifactId /dependency2配置限流过滤器yamlfilters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 1 # 令牌桶每秒填充速率 redis-rate-limiter.burstCapacity: 2 # 令牌桶总容量 key-resolver: #{keyResolver} # 限流键解析器3定义 KeyResolverjavaBean KeyResolver keyResolver() { // URL 限流 return exchange - Mono.just(exchange.getRequest().getURI().getPath()); // 参数限流 // return exchange - Mono.just(exchange.getRequest().getQueryParams().getFirst(user)); }
7 整合 Sentinel 实现网关限流1引入依赖xmldependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-alibaba-sentinel-gateway/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependency2配置 Sentinel Dashboardyamlspring: cloud: sentinel: transport: dashboard:
127.
0.
1:80803Sentinel 网关流控原理Sentinel 将网关流控规则转换为热点参数规则通过GatewayFlowSlot进行规则检查支持路由维度限流基于 routeIdAPI 分组维度限流用户自定义分组注Spring Boot 3 Spring Cloud Gateway 与 Sentinel 的兼容性待官方更新。
六、
总结与建议Spring Cloud Gateway 作为 Spring Cloud 生态中的第二代网关具有响应式、高性能、易扩展等优点适合作为微服务架构的统一入口。
最佳实践建议路由配置集中管理结合配置中心如 Nacos实现动态路由。
过滤器链合理设计区分业务过滤器与通用过滤器保持职责单一。
限流与熔断结合使用搭配 Sentinel 或 Resilience4j 实现系统保护。
监控与日志完备集成 Micrometer Prometheus Grafana 实现全方位监控。