使用 VMware Spring Cloud Gateway for Kubernetes 进行定制和观察

时间:2022-12-30 19:06:23

使用 VMware Spring Cloud Gateway for Kubernetes 进行定制和观察

VMware Spring Cloud Gateway for Kubernetes 是功能强大的分布式 API 网关,无论您使用哪种编程语言,都受到像您这样的应用程序开发人员的喜爱,它已通过一些全新的功能进行了改进。Spring Cloud Gateway for Kubernetes 现在支持加载您自己的扩展,因此您可以根据自己的特定需求自定义它们。将指标和跟踪数据捕获到您选择的可观测性工具中也比以往任何时候都容易。所有这些新功能都建立在您信任的开源 Spring 库之上!

在这篇文章中,我们将介绍如何利用它们。

自定义扩展

自从Spring Cloud Gateway开源项目于2017年发布以来,应用程序开发人员一直在利用其可扩展性。开发自定义谓词和过滤器是在Spring Cloud Gateway上构建的生产级API网关实现的关键部分。现在,您可以将这些相同的自定义扩展加载到 Spring Cloud Gateway for Kubernetes API 网关实例中。

首先,让我们看一下开发自己的扩展是多么容易。然后,我们将向您展示如何将它们加载到 API 网关实例中。

首先,您可以根据为 Java 虚拟机选择的编程语言创建新项目。我们将演示如何使用 Java 和 Gradle 来处理我们的项目构建。

首先,将以下依赖项添加到 Gradle 构建文件中:

​    implementation ​​platform(“org.springframework.boot:spring-boot-dependencies:${springBootVersion}”)

​    implementation platform("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")​

​    implementation 'org.springframework.cloud:spring-cloud-starter-gateway​

定义和使用您选择的开源版本。我们将分别使用 和 。可以在我们的 Acme 健身示例应用程序中找到一个工作示例。​​springCLoudVersion​​​​springBootVersion​​​​Hoxton.SR8​​​​2.5.4​

我们将首先创建一个过滤器,将名为 X-Reverse-Me 的特定标头的字符串值反转为名为 X-Reversed 的新标头。

package com.vmware.scg.extensions;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

@Component
public class ReverseMyHeaderGatewayFilterFactory
extends AbstractGatewayFilterFactory {

@Override
public GatewayFilter apply(Object config) {
return (exchange, chain) ->
{
ServerWebExchange updatedExchange = exchange.mutate()
.request(request -> request.headers(this::reverseHeader))
.build();
return chain.filter(updatedExchange);
};
}

private void reverseHeader(HttpHeaders headers) {
headers.getOrEmpty("X-Reverse-Me")
.stream()
.map(value -> new StringBuilder(value).reverse().toString())
.forEach(reversed -> headers.add("X-Reversed", reversed));
}
}

正如您在代码中看到的:

  • 通过@Component注释加载到 API 网关实例时,将自动检测过滤器
  • 我们希望标头 X-Reverse-Me 出现在每个请求上,并且它将始终附加新的标头 X-Reversed

运行生成以使用新的自定义筛选器 ReverseMyHeader 生成 jar 文件。现在,您可以通过从 jar 文件创建配置映射将筛选器加载到 API 网关实例中:

​$ kubectl create configmap reverse-my-header --from-file=path/to/reverse-my-header.jar -n gateway_namespace​

现在,将 API 网关实例配置为加载反向 my-header 扩展:

​apiVersion: "tanzu.vmware.com/v1"​

​kind: SpringCloudGateway​

​metadata:​

​  name: my-api-gateway​

​spec:​

​  extensions:​

​    custom:​

​      - reverse-my-header​

​...​

应用程序开发团队现在可以在其 API 路由配置自定义资源中添加筛选器:

​apiVersion: "tanzu.vmware.com/v1"​

​kind: SpringCloudGatewayRouteConfig​

​metadata:​

​  name: my-gateway-routes​

​spec:​

​  routes:​

​  - uri: https://httpbin.org​

​    predicates:​

​      - Path=/api/get​

​    filters:​

​      - ReverseMyHeader​

​...​

现在,您可以使用 curl 和将反转的标头访问 API 网关实例上的 /api/get 终端节点:

​$ curl http://my.gateway.domain.io/api/get -H "X-Reverse-Me: test"​

​{​

​...​

​  "headers": {​

​...​

​    "X-Reverse-Me": "test",​

​    "X-Reversed": "tset"​

​  },​

​  ...​

​}​

就是这样!这就是Spring Cloud Gateway for Kubernetes扩展以满足您所有自定义API用例需求所需的全部内容!

触手可及的 API 指标

Spring Cloud Gateway 开源库自首次发布以来一直通过 Spring Boot 指标执行器发出指标。Spring Cloud Gateway for Kubernetes 不仅利用了这种底层功能,而且现在添加了更多的 API 指标,从而可以轻松配置传输到您选择的可观测性工具:VMware Tanzu Observability by Wavefront 或 Prometheus and Grafana。

让我们看一下生成的 Tanzu 可观测性仪表板。

使用 VMware Spring Cloud Gateway for Kubernetes 进行定制和观察

仪表板提供有关 API 使用情况、性能和错误率数据的见解。所有这些都可以通过 API 网关实例上的一些简单的 Tanzu 可观测性配置来完成:

​apiVersion: "tanzu.vmware.com/v1"​

​kind: SpringCloudGateway​

​metadata:​

​  name: my-api-gateway​

​spec:​

​  observability​

​    metrics:​

​      wavefront:​

​        enabled: true​

​    wavefront:​

​      secret: tanzu-observability-credentials-secret​

​      application: my-business-domain​

引用的是具有以下配置内容的 Kubernetes Secret:​​tanzu-observability-credentials-secret​

​apiVersion: v1​

​kind: Secret​

​metadata:​

​  name: tanzu-observability-credentials-secret​

​data:​

​  wavefront.api-token: "***"​

​  wavefront.uri: "***"​

就是这样!您现在可以查看生成的 API 仪表板。

跟踪 API 调用

想象一下,你被要求对复杂的 API 调用和微服务交互网格中的问题进行故障排除。你如何找出问题出在哪里?Spring Cloud Gateway for Kubernetes 利用 Spring Cloud Sleuth 将 API 路由的跟踪数据传播到下游应用程序服务。与指标可观测性配置一样,它就像添加跟踪配置一样简单:

​apiVersion: "tanzu.vmware.com/v1"​

​kind: SpringCloudGateway​

​metadata:​

​  name: test-gateway-tracing​

​spec:​

​  observability:​

​    tracing:​

​      wavefront:​

​        enabled: true​

​    wavefront:​

​      secret: tanzu-observability-credentials-secret​

​      application: my-business-domain​

现在,您可以像专业人士一样对 API 调用进行故障排除!

使用 VMware Spring Cloud Gateway for Kubernetes 进行定制和观察

立即试用 Spring Cloud Gateway for Kubernetes!

那么在哪里可以使用Spring Cloud Gateway for Kubernetes呢?支持以下 Kubernetes 环境:

  • VMware Tanzu Kubernetes Grid
  • Microsoft Azure Kubernetes Service
  • Google Kubernetes Engine
  • Amazon Elastic Kubernetes Service
  • Kubernetes 版本 1.17+