Skip to content

服务网关

作者:唐亚峰 | battcn
字数统计:819 字

基本介绍

Spring Cloud Gateway

Spring Cloud GatewaySpring Cloud团队为云服务生态系统构建的API网关。

Spring Cloud Gateway 旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注点,例如:安全性,监视/指标,限流等。

微服务的应用可能部署在不同机房,不同地区,不同域名下。此时客户端(浏览器/手机/软件工具)想 要请求对应的服务,都需要知道机器的具体 IP 或者域名 URL,当微服务实例众多时,这是非常难以记忆的,对 于客户端来说也太复杂难以维护。 此时就有了网关,客户端相关的请求直接发送到网关,由网关根据请求标识 解析判断出具体的微服务地址,再把请求转发到微服务实例。这其中的记忆功能就全部交由网关来操作了。

核心设计

路由(Route)

路由是网关最基础的部分,路由信息由 ID、目标 URI、一组断言和一组过滤器组成。如果断言 路由为真,则说明请求的 URI 和配置匹配。

断言(Predicate)

Spring Cloud Gateway 中的断言函数输入类型是 Spring 5.x 框架中的 ServerWebExchange

Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 Http Request 中的任 何信息,比如请求头和参数等。

过滤器(Filter)

Spring Cloud Gateway 中的 Filter 分为两种类型,分别是 Gateway FilterGlobal Filter。过滤器将会对请求和响应进行处理。

使用方式

本章主要是讲述 Spring Cloud Gateway 基础用法,详细以及进阶内容请参考官方文档

导入依赖

xml
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

路由配置

WARNING

StripPrefix=1 配置,表示网关转发到业务模块时候会自动截取前缀。

yaml
spring:
  application:
    name: wemirr-platform-gateway
  cloud:
    gateway:
      enabled: true
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true
      routes:
        - id: wemirr-platform-authority
          uri: lb://wemirr-platform-authority
          predicates:
            - Path=/authority/**
          filters:
            # 黑白名单过滤器
            - name: BlackWhiteList
              args:
                type: BLACK_LIST
                ip-list: 127.0.0.1,0:0:0:0:0:0:0:1
                ignore-intranet: true
            # 限流过滤器
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 100   # 允许用户每秒处理多少个请求
                redis-rate-limiter.burstCapacity: 100   # 令牌桶的容量,允许在一秒钟内完成的最大请求数
                # 使用 IP 限流策略(使用 SpEL 按名称引用 bean)
                key-resolver: "#{@ipKeyResolver}"
            - StripPrefix=1
            - PreserveHostHeader
            # 重试
            - name: Retry
              args:
                retries: 1
                statuses: BAD_GATEWAY
                backoff:
                  firstBackoff: 200ms
                  maxBackoff: 500ms
                  factor: 1
                  basedOnPreviousValue: false
                  exceptions: TimeoutException

提示

目前已经存在 wemirr-platform-gateway 网关服务,用于路由转发、异常处理、限流、降级、接口、鉴权等等。

路由规则

Spring Cloud Gateway 创建 Route 对象时, 使用RoutePredicateFactory创建Predicate对象,Predicate对象可以赋值给Route

  • Spring Cloud Gateway包含许多内置的Route Predicate Factories。
  • 所有这些断言都匹配 HTTP 请求的不同属性。
  • 多个Route Predicate Factories可以通过逻辑与(and)结合起来一起使用。

路由断言工厂RoutePredicateFactory包含的主要实现类如图所示,包括Datetime、请求的远端地址、路由权重、请求头、Host 地址、请求方法、请求路径和请求参数等类型的路由断言。