网关-微服务网关入门
在微服务架构中,网关(Gateway) 是一个非常重要的组件,它位于客户端与微服务之间,作为所有请求的统一入口。网关的主要作用是对请求进行路由、过滤、限流、鉴权、负载均衡等操作,从而简化客户端与微服务之间的交互逻辑。
一、网关的作用
功能 |
说明 |
路由转发(Routing) |
根据请求路径将请求转发到对应的微服务 |
统一入口(API Entry) |
所有请求都经过网关,避免客户端直接调用多个服务 |
身份认证(Authentication) |
在网关层做统一的鉴权,如 JWT 校验 |
权限控制(Authorization) |
控制不同用户或角色对 API 的访问权限 |
限流(Rate Limiting) |
限制单位时间内请求次数,防止系统过载 |
熔断与降级(Circuit Breaker) |
当服务不可用时,返回默认响应,提升系统稳定性 |
日志记录(Logging) |
记录请求日志,便于监控和审计 |
协议转换(Protocol Translation) |
如 HTTP 转 gRPC、WebSocket 等 |
负载均衡(Load Balancing) |
请求分发到多个服务实例,提高可用性 |
二、常见的网关实现方案
网关类型 |
说明 |
适用场景 |
Spring Cloud Gateway |
Spring 官方推荐的网关,基于 WebFlux |
Spring Cloud 微服务架构 |
Zuul(Netflix) |
Netflix 开源的同步网关(已过时) |
旧版 Spring Cloud 项目 |
Kong |
基于 Nginx 的高性能网关,支持插件扩展 |
企业级 API 管理、高并发场景 |
Envoy |
由 Lyft 开源,支持多种协议,适合云原生 |
服务网格(Service Mesh)环境 |
Nginx + Lua |
使用 Lua 脚本扩展 Nginx 实现网关功能 |
高性能、低延迟场景 |
Traefik |
支持自动服务发现,与 Kubernetes 集成良好 |
云原生、K8s 环境 |
三、Spring Cloud Gateway 的核心概念
1. Route(路由)
- 定义了请求如何转发到具体的服务。
- 包含:ID、目标 URI、断言(Predicate)、过滤器(Filter)等。
2. Predicate(断言)
- 用于匹配请求是否符合路由条件。
- 示例:路径、方法、Header、Query 参数等。
3. Filter(过滤器)
- 对请求和响应进行拦截处理。
- 可用于鉴权、限流、日志记录等。
四、Spring Cloud Gateway 示例配置(application.yml
)
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- StripPrefix=1
- AuthFilter
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- StripPrefix=1
id
:路由唯一标识
uri
:目标服务地址,lb
表示使用负载均衡
predicates
:路由匹配规则(如路径)
filters
:请求过滤器(如鉴权、限流)
五、自定义过滤器(Filter)
@Component
public class AuthFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
- 在请求进入具体服务前进行身份验证
- 可结合 JWT、OAuth2、Spring Security 等实现统一鉴权
六、网关在微服务架构中的位置
[客户端] → [网关(Gateway)] → [微服务A]、[微服务B]、[微服务C]
- 所有请求必须经过网关
- 网关负责将请求路由到正确的服务
- 网关可集中处理安全、限流、日志等通用逻辑
七、网关的部署方式
部署方式 |
说明 |
单实例部署 |
简单,适合小型项目 |
集群部署 |
提高可用性和性能 |
Kubernetes Ingress |
在 K8s 中使用 Ingress 作为网关 |
API 网关 + 服务网格 |
在 Istio 等服务网格中作为外部入口 |
八、总结:网关的核心价值
价值 |
说明 |
统一入口 |
所有请求都通过网关进入系统 |
安全控制 |
集中处理身份认证、权限控制 |
服务治理 |
限流、熔断、负载均衡 |
日志监控 |
统一记录请求日志,便于分析 |
协议兼容 |
支持多种协议转换 |
灵活扩展 |
可通过插件或自定义 Filter 扩展功能 |
九、推荐使用场景
- 微服务数量较多,需要集中管理 API
- 需要统一鉴权、限流、日志记录
- 使用 Spring Cloud 技术栈
- 需要支持动态路由和服务发现
- 需要高并发、高性能的 API 管理能力
如果使用 Spring Boot + Spring Cloud 构建微服务系统,Spring Cloud Gateway 是一个非常推荐的选择,它与 Spring 生态集成良好,支持响应式编程模型,具备高性能和可扩展性。