执行器 API

/gateway 执行器端点允许您监控 Spring Cloud Gateway 应用程序并与之交互。为了远程访问,该端点必须在应用程序属性中被启用通过 HTTP 或 JMX 暴露。以下列表显示了如何配置:

application.properties
management.endpoint.gateway.enabled=true # default value
management.endpoints.web.exposure.include=gateway

此端点提供子执行器端点上可用内容以及每个引用的可用方法的概述。生成的响应类似于以下内容:

[
   {
      "href":"/actuator/gateway/",
      "methods":[ "GET" ]
   },
   {
      "href":"/actuator/gateway/routedefinitions",
      "methods":[ "GET" ]
   },
   {
      "href":"/actuator/gateway/globalfilters",
      "methods":[ "GET" ]
   },
   {
      "href":"/actuator/gateway/routefilters",
      "methods":[ "GET" ]
   },
   {
      "href":"/actuator/gateway/routes",
      "methods":[ "POST", "GET" ]
   },
   {
      "href":"/actuator/gateway/routepredicates",
      "methods":[ "GET" ]
   },
   {
      "href":"/actuator/gateway/refresh",
      "methods":[ "POST" ]
   },
   {
      "href":"/actuator/gateway/routes/route-id-1/combinedfilters",
      "methods":[ "GET" ]
   },
   {
      "href":"/actuator/gateway/routes/route-id-1",
      "methods":[ "POST", "DELETE", "GET" ]
   }
]

详细执行器格式

Spring Cloud Gateway 中添加了一种新的、更详细的格式。它为每个路由添加了更多细节,让您可以查看与每个路由关联的谓词和过滤器以及任何可用配置。以下示例配置 /actuator/gateway/routes

[
  {
    "predicate": "(Hosts: [**.addrequestheader.org] && Paths: [/headers], match trailing slash: true)",
    "route_id": "add_request_header_test",
    "filters": [
      "[[AddResponseHeader X-Response-Default-Foo = 'Default-Bar'], order = 1]",
      "[[AddRequestHeader X-Request-Foo = 'Bar'], order = 1]",
      "[[PrefixPath prefix = '/httpbin'], order = 2]"
    ],
    "uri": "lb://testservice",
    "order": 0
  }
]

此功能默认启用。要禁用它,请设置以下属性:

application.properties
spring.cloud.gateway.actuator.verbose.enabled=false

在未来的版本中,此设置将默认为 true

获取路由过滤器

本节详细介绍如何获取路由过滤器,包括:

全局过滤器

要获取应用于所有路由的全局过滤器,请向 /actuator/gateway/globalfilters 发送 GET 请求。生成的响应类似于以下内容:

{
  "org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter@77856cc5": 10100,
  "org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter@4f6fd101": 10000,
  "org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@32d22650": -1,
  "org.springframework.cloud.gateway.filter.ForwardRoutingFilter@106459d9": 2147483647,
  "org.springframework.cloud.gateway.filter.NettyRoutingFilter@1fbd5e0": 2147483647,
  "org.springframework.cloud.gateway.filter.ForwardPathFilter@33a71d23": 0,
  "org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter@135064ea": 2147483637,
  "org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@23c05889": 2147483646
}

响应包含已生效的全局过滤器的详细信息。对于每个全局过滤器,都有一个过滤器对象的字符串表示(例如,org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter@77856cc5)以及在过滤器链中的对应顺序

路由过滤器

要获取应用于路由的GatewayFilter 工厂,请向 /actuator/gateway/routefilters 发送 GET 请求。生成的响应类似于以下内容:

{
  "[AddRequestHeaderGatewayFilterFactory@570ed9c configClass = AbstractNameValueGatewayFilterFactory.NameValueConfig]": null,
  "[SecureHeadersGatewayFilterFactory@fceab5d configClass = Object]": null,
  "[SaveSessionGatewayFilterFactory@4449b273 configClass = Object]": null
}

响应包含应用于任何特定路由的 GatewayFilter 工厂的详细信息。对于每个工厂,都有相应对象的字符串表示(例如,[SecureHeadersGatewayFilterFactory@fceab5d configClass = Object])。请注意,null 值是由于端点控制器实现不完整造成的,因为它试图设置对象在过滤器链中的顺序,但这不适用于 GatewayFilter 工厂对象。

刷新路由缓存

要清除路由缓存,请向 /actuator/gateway/refresh 发送 POST 请求。请求将返回 200 状态码,但不带响应体。

要清除具有特定元数据值的路由,请添加查询参数 metadata,指定要清除的路由应匹配的 key:value 对。如果在异步刷新期间发生错误,刷新将不会修改现有路由。

/actuator/gateway/refresh?metadata=group:group-1 发送 POST 请求将只刷新其 group 元数据为 group-1 的路由:first_routethird_route

[{
  "route_id": "first_route",
  "route_object": {
    "predicate": "...",
  },
  "metadata": { "group": "group-1" }
},
{
  "route_id": "second_route",
  "route_object": {
    "predicate": "...",
  },
  "metadata": { "group": "group-2" }
},
{
  "route_id": "third_route",
  "route_object": {
    "predicate": "...",
  },
  "metadata": { "group": "group-1" }
}]

获取网关中定义的路由

要获取网关中定义的路由,请向 /actuator/gateway/routes 发送 GET 请求。生成的响应类似于以下内容:

[{
  "route_id": "first_route",
  "route_object": {
    "predicate": "org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory$$Lambda$432/1736826640@1e9d7e7d",
    "filters": [
      "OrderedGatewayFilter{delegate=org.springframework.cloud.gateway.filter.factory.PreserveHostHeaderGatewayFilterFactory$$Lambda$436/674480275@6631ef72, order=0}"
    ]
  },
  "order": 0
},
{
  "route_id": "second_route",
  "route_object": {
    "predicate": "org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory$$Lambda$432/1736826640@cd8d298",
    "filters": []
  },
  "order": 0
}]

响应包含网关中定义的所有路由的详细信息。下表描述了响应中每个元素(每个元素都是一个路由)的结构:

路径 类型 描述

route_id

String

路由 ID。

route_object.predicate

Object

路由谓词。

route_object.filters

Array

应用于路由的GatewayFilter 工厂

order

Number

路由顺序。

获取特定路由的信息

要获取单个路由的信息,请向 /actuator/gateway/routes/{id} 发送 GET 请求(例如,/actuator/gateway/routes/first_route)。生成的响应类似于以下内容:

{
  "id": "first_route",
  "predicates": [{
    "name": "Path",
    "args": {"_genkey_0":"/first"}
  }],
  "filters": [],
  "uri": "https://www.uri-destination.org",
  "order": 0
}

下表描述了响应的结构:

路径 类型 描述

id

String

路由 ID。

predicates

Array

路由谓词的集合。每个项定义给定谓词的名称和参数。

filters

Array

应用于路由的过滤器集合。

uri

String

路由的目标 URI。

order

Number

路由顺序。

创建和删除特定的路由定义

要创建路由定义,请向 /gateway/routes/{id_route_to_create} 发送带 JSON 请求体的 POST 请求,该请求体指定路由的字段(参见获取特定路由的信息)。

要删除路由定义,请向 /gateway/routes/{id_route_to_delete} 发送 DELETE 请求。

创建多个路由定义

要在单个请求中创建多个路由定义,请向 /gateway/routes 发送带 JSON 请求体的 POST 请求,该请求体指定路由的字段,包括路由 ID(参见获取特定路由的信息)。

如果在路由创建过程中发生任何错误,路由定义将被丢弃。

总结:所有端点列表

下表总结了 Spring Cloud Gateway 执行器端点(请注意,每个端点的基本路径都是 /actuator/gateway):

ID HTTP 方法 描述

globalfilters

GET

显示应用于路由的全局过滤器列表。

routefilters

GET

显示应用于特定路由的 GatewayFilter 工厂列表。

refresh

POST

清除路由缓存。

routes

GET

显示网关中定义的路由列表。

routes/{id}

GET

显示特定路由的信息。

routes/{id}

POST

向网关添加新路由。

routes/{id}

DELETE

从网关中移除现有路由。