在微服务架构中,随着用户服务、订单服务、支付服务等多个服务的启动和运行,管理这些服务的请求、确保安全性以及在高负载下保持系统的稳定性变得尤为重要。API网关作为微服务架构中的关键组件,能够很好地解决这些问题。
微服务架构是一种将应用构建为一组小型、自治服务的方法,每个服务都运行在其独立的进程中,服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式能够提高系统的可扩展性、灵活性和可靠性。
API网关是微服务架构中的前端,负责处理所有客户端请求。它的主要作用包括:
Spring Cloud Gateway是基于Spring Framework构建的API网关,提供了动态路由、监控、弹性、安全等功能。它使用Spring WebFlux项目中的Reactor模式进行异步非阻塞处理,具有高性能和可扩展性。
首先,我们需要在Spring Boot项目中添加Spring Cloud Gateway的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
这个依赖会导入Spring Cloud Gateway的核心功能,包括路由和过滤器。
API网关的核心工作是根据传入的请求将请求路由到正确的微服务。以下是一个配置示例:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/users/**
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/orders/**
- id: payment-service
uri: lb://PAYMENT-SERVICE
predicates:
- Path=/payments/**
在这个配置中,我们定义了三个路由规则,分别对应用户服务、订单服务和支付服务。uri
字段中的lb://
前缀表示使用Spring Cloud LoadBalancer进行负载平衡。predicates
字段定义了匹配传入请求路径的规则。
负载平衡是确保系统稳定性的关键。在Spring Cloud Gateway中,通过lb://
前缀可以自动激活Spring Cloud LoadBalancer,它会在服务的多个实例之间均匀分配请求。
如果你使用Eureka进行服务发现,负载平衡会默认启用,无需额外配置。
为了确保只有授权用户才能访问服务,我们需要在API网关中添加安全性配置。以下是一个基于JWT的安全配置示例:
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://your-authorization-server.com
这个配置告诉Spring我们正在使用OAuth2和JWT来保证安全。每个请求都必须包含有效的JWT令牌,否则它会在到达微服务之前被拒绝。
速率限制是控制请求流量的重要手段。以下是一个基于Redis的速率限制配置示例:
spring:
cloud:
gateway:
routes:
- id: payment-service
uri: lb://PAYMENT-SERVICE
predicates:
- Path=/payments/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter:
replenishRate: 10
burstCapacity: 20
在这个配置中,我们允许每秒10个请求,并设置突发请求容量为20。如果服务收到的请求超过这个数量,多余的请求将会得到“稍后再试”的提示。
有时,我们需要在将请求发送到微服务之前对其进行修改。以下是一个添加请求头的过滤器配置示例:
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/orders/**
filters:
- AddRequestHeader=X-Order-Source, Web
这个配置会向发往order-service
的每个请求添加自定义标头X-Order-Source: Web
。
虽然API网关在微服务架构中非常重要,但并不是所有情况下都需要它。以下是一些建议:
关注公众号[码到三十五]获取更多技术干货 !