将 Spring Cloud 微服务应用程序迁移到亚马逊 EKS 的方法

在这篇博客中,我们将探讨企业如何将本地 Spring Cloud 微服务迁移到亚马逊 E lastic Kubernetes 服务( 亚马逊 EK S)。 借助 亚马逊云科技 提供的托管服务,开发人员无需运行和管理服务注册表、配置服务器和 API 网关等跨领域服务。通过使用 亚马逊云科技 服务,开发人员可以专注于构建业务代码,以加快发布速度并最大限度地提高业务价值。

问题陈述

许多在本地数据中心构建微服务的企业都利用 Spring Cloud 库。Spring Cloud 为开发人员提供工具,帮助他们快速构建分布式系统中的一些常见模式(例如,配置管理、服务发现、断路器、智能路由、微代理、领导力选举)。分布式系统的协调导致锅炉板模式。使用 Spring Cloud,开发人员可以快速启动实现这些模式的服务和应用程序。它们在分布式环境中运行良好,包括开发人员的笔记本电脑和裸机数据中心。

企业本地部署的问题是需要管理配置服务器、服务注册表、Spring Cloud Gateway 服务和微服务应用程序。这占用了开发人员交付业务成果的宝贵时间,并减慢了发布速度。Spring Cloud Services 部署模型对您注册、发现和优化服务的资源利用率的方式存在限制。

解决方案概述

该解决方案将涵盖如何使用亚马逊 EKS 和其他 亚马逊云科技 服务在微服务应用程序中替换 Spring Cloud 模块功能。该架构将使用 亚马逊云科技 App Mesh 实现弹性。将使用 亚马逊云科技 X- Ray 和 亚马逊 OpenSearch 服务进行监控。 亚马逊 API Gateway 将用作管理 API Gateway 的 API Gateway 解决方案。

基本的春季云架构

让我们来看一个虚构的宠物诊所应用程序,它由使用 Spring Cloud 的微服务组成。组件包括:

  • 客户服务-列出并管理所有客户及其详细信息
  • 兽医服务 — 列出和管理兽医
  • 探视服务 — 管理客户与兽医一起探视宠物的情况

所有传入的用户流量都通过 Spring Cloud API 网关进行路由,用于请求路由、限制和安全执行。为了便于发现,微服务在由 Spring Cloud Netflix 实施的服务注册表中注册。使用由 Git 存储库支持的 Spring Cloud Config 服务器对微服务配置进行外部化。服务调用遥测数据生成并导入到 Zipkin 分布式日志服务中。所有微服务和跨领域服务都部署在数据中心的服务器上。

图 1:这是使用 Spring Cloud 构建的微服务示例。Spring Cloud Gateway 用作 API 网关,Spring Cloud Config 用于外部化配置,Zipkin 用于追踪服务,Spring Cloud Netflix 用于发现服务...

This is a sample microservices built with Spring Cloud. Spring Cloud Gateway as an API Gateway, Spring Cloud Config to externalized the configurations, Zipkin for tracing services and Spring Cloud Netflix for discovering the services.

亚马逊 EKS 基础架构

为了让企业将微服务迁移到 亚马逊云科技 云,亚马逊云科技 提供的服务将为这一过程提供帮助。当应用程序迁移到 Amazon EKS 时,每个微服务都作为容器进行部署,在 Kubernetes 集群内的容器中运行。通过部署到亚马逊 EKS,亚马逊云科技 管理 Kubernetes 控制平面。传入流量通过负责 API 管理的亚马逊 API Gateway 进行路由。微服务在 Kubernetes 服务注册表中注册。微服务使用 亚马逊弹性负载均衡器 (ELB) 来平衡传入流量。亚马逊云科技 App Mesh 负责解决一些跨领域问题,例如断路器和故障转移。 Amazon CloudWatch 提供集中式记录,而 亚马逊云科技 X-Ray 则涵盖对请求的分布式跟踪,以识别性能问题。

图 2:示例应用程序部署在 Amazon EKS 上。Spring Cloud 组件已被 亚马逊云科技 服务所取代。

The sample application is deployed on Amazon EKS. Spring Cloud components are replaced with AWS Services.

迁移到亚马逊 EKS 的好处:

亚马逊 EKS 是一项完全托管的 Kubernetes 服务,可消除安装、配置和管理 Kubernetes 平台的操作负担。好处包括:

  • 配置管理和服务发现功能
  • 自我修复和自动扩展功能
  • 开箱即用支持多种编程语言
  • 弹性和高可用性可以通过应用程序部署配置进行配置。
  • 丰富的开放工具生态系统,可支持创新。
  • Amazon EKS 应用程序可以部署到任何符合条件的 Kubernetes 平台,从而提供可移植性。

接下来,让我们回顾一下 亚马逊云科技 服务如何以及哪些服务提供 Spring Cloud 服务提供的功能。

比较矩阵:

Capability Spring Cloud 亚马逊云科技
API Management Spring Cloud Gateway Amazon API Gateway
Externalize Configuration Spring Config Server

亚马逊 EKS 和

亚马逊云科技 Secrets Manager

Service Registry and Discovery Eureka External DNS with Amazon Route 53 , 亚马逊云科技 Cloud Map
Circuit Breaker for Resiliency Netflix 亚马逊云科技 App Mesh
Distributed Tracing Sleuth 亚马逊云科技 X-ray, Amazon OpenSearch Service

API 管理:

Amazon API Gateway 是一项完全托管的服务,可让开发人员轻松创建、发布、维护、监控和保护任何规模的 API。API Gateway 支持容器化和无服务器工作负载以及 Web 应用程序。

通过 API Gateway 控制台,您可以定义 REST API 及其相关的资源和方法、管理 API 生命周期、生成客户端 SDK 以及查看 API 指标。您还可以使用 API Gateway 控制台来定义您的 API 使用计划、管理开发者 API 密钥以及配置限制和配额限制。所有相同的操作都可通过 API 网关 API 执行。

当前的 Spring 应用程序 API 被定义为 Swagger API 定义。你可以使用开源 Swagger 导入器工具 将你的 Swagger API 定义导入 API 网关。使用 Swagger 导入器工具,您可以创建和部署新的 API 以及更新现有的 API。

API Gateway 将 API 调用、延迟和错误率记录到亚马逊 CloudWatch。这些指标也可以通过 API 网关控制台的 REST API 控制面板获得。API Gateway 可测量第三方开发人员的利用率;数据可在 API 网关控制台中通过 API 获得。您可以使用 CloudWatch 控制台来设置自定义警报。默认情况下,API 网关在 REST API 级别上监控流量。或者,您可以从部署配置 API 或控制台屏幕为 REST API 中的每种方法启用详细指标。详细指标也会记录到 CloudWatch,并按照 CloudWatch 费率收费。

外部化配置:

应用程序配置通过 API 密钥和数据库连接详细信息等名称/值对进行管理。应用程序通过 application.yaml 或源代码存储库中带有 Spring Cloud 配置服务的属性文件来引用配置。

Amazon EKS 提供了以配置 映射 和 密钥 形式管理配置 的功能。ConfigMaps 用于外部化任何名称-值对的配置。密钥用于保存敏感数据,例如数据库详细信息和 API 密钥。Amazon EKS 提供了将配置和密钥装载到容器文件系统的机制。这使应用程序能够在不知道其运行位置的情况下提取配置。

应用程序配置作为 YAML 文件定义和管理,位于所选源代码存储库中。出于安全性、合规性和审计目的,在将此配置应用于正在运行的集群之前,可以对其进行版本控制和审查。DevOps 实践是自动执行此过程以将最新配置应用于正在运行的集群的一种流行方式。Kubernetes 提供了一个命令行接口 (kubectl) 来连接集群。您可以使用以下命令应用配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: sample-app-config
  namespace: default
data:
  name: sample-app
  pool.size.core: 1
  pool.size.max: 16

kubectl 应用-f。 /sample-app-configmap.yaml

也可以使用现有的应用程序属性文件创建 ConfigMap。以下命令允许您从属性文件生成 ConfigMap:

kubectl 创建 configmap 示例应用程序配置环境文件\--from-env-file=configure-pod-container/configmap/sample-app-env-file.properties

从 Kubernetes v1.23 开始,kubectl 命令支持在使用多个数据源创建 ConfigMap 时多次指定 —from-env-file 参数。使用以下命令在一次执行中加载多个配置属性文件:

kubectl 创建 configmap 配置多环境文件\--from-env-file=configure-pod-container/configmap/sample-app-env-file.properties\--from-env-file.properties

Spring Cloud Kubernetes 库允许在对应用程序进行最少甚至不做任何更改的情况下加载配置。通过将 spring-cloud-starter-kubernetes-config 库添加到 pom.xml,可以从 ConfigMaps 和 Secrets 中加载配置。更改配置后,spring cloud Kubernetes 会重新加载更改后的配置。示例:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
</dependency>

有关更多实现细节,请参阅 Spring Kubernetes 文档。

服务注册和发现:

微服务发现是作为服务发现实现的,其中使用别名定义微服务,并通过在服务注册表中查找它们来调用。Spring Cloud 通过提供服务注册服务来提供此功能。

通过配置 DNS 服务器,Amazon EKS 可以根据创建期间定义的服务名称来查找和调用服务。亚马逊 EKS 提供了使用 Route 53 或 亚马逊云科技 Cloud Map 配置外部 DNS 服务器的选项。更多详情请参阅在 AW S 上为服务 设置外部域名 和使用 亚马逊云科技 Cloud Map API 设置外部域名 文档。

使用原生 Kubernetes 服务发现可确保与其他工具兼容,例如 亚马逊云科技 App Mesh。App Mesh 能够实现负载平衡、断路器、故障转移等。

然后,调用者服务只需要引用在特定 Kubernetes 集群中可解析的名称。一个简单的实现可能使用引用完全限定域名 (FQDN) 的 spring RestTemplate,例如 https://{service-name}。{命名空间} .svc。{集群} .local: {服务端口}。

用于弹性的断路器:

微服务具有支持服务,这些服务可以是数据库、消息服务或其他微服务。在调用后备服务以避免服务降级和级联故障时,通过断路器和重试实现提供弹性。

App Mesh 与 Amazon EKS 结合使用,允许开发人员在集群级别实现弹性。除了弹性之外,还有多个 App Mesh 功能 。在本节中,让我们重点关注断路器和重试实现。

App Mesh 支持断路器模式,以保护下游服务在部分或完全停机期间不被上游服务调用。App Mesh 提供 默认的连接池 配置,并利用 异常值检测 功能来实现断路器功能。使用断路器模式可创建能够抵御连接错误的应用程序。

通过使用服务网格的连接池配置,您可以限制对应用程序端点的并发连接或请求的数量。您可以使用以下代码在虚拟网关上应用连接池设置: 文档 中的其他详细信息

“connectionPool”: {
    “http”: {
        “maxConnections”: 100,
        “maxPendingRequests”: 10000
    }
}

异常值检测功能允许服务跟踪其每项上游服务中各个主机的运行状况。它将暂时停止将流量路由到出现严重错误的主机。

{
   "virtualNodeName": "sample-node",
   "spec": {
      "listeners": [
         {
            .....
            },
            "outlierDetection": {
               "maxServerErrors": 5,
               "maxEjectionPercent": 100,
               "interval": {
                  "value": 30,
                  "unit": "s"
               },
               "baseEjectionDuration": {
                  "value": 10,
                  "unit": "s"
               }
            }
         }
      ]
}

连接池配置和异常值检测相结合,可以限制应用程序中故障、延迟峰值和网络波动的影响。

重试机制提供了从暂时性问题中恢复的弹性。它有助于克服短暂的网络故障或服务器服务的短期中断。您可以添加使用基于 HTTP 错误代码的 App Mesh 重试服务间连接的功能。

"httpRoute": {
    "action": {
        "weightedTargets": [
                {
                    "virtualNode": “sample—node",
                    "weight": 1
                }
       ]
    },
    "match": {
        "prefix": "/"
   },
    "retryPolicy": {
        "maxRetries": 10,
        "perRetryTimeout": {
            "unit": "s",
            "value": 2
        },
        "httpRetryEvents": ["server-error"]
        } 
    },
 "priority": 1
 }

分布式跟踪:

微服务需要能够捕获日志和指标,以提供对服务性能的可见性并查明瓶颈。

亚马逊云科技 X-Ray 提供应用程序跟踪功能,可以深入了解部署的所有微服务。可以通过配置 X-Ray 守护程序启用 X -Ray 与 Amazon EKS 的集成。然后,应用程序可以利用 X-Ray SDK 向守护程序发送跟踪数据。跟踪数据包括有关应用程序处理的传入 HTTP 请求以及应用程序对下游服务的调用的信息。更多信息,请参阅《 使用 亚马逊云科技 X-Ray 在 Kubernetes 上进行应用程序跟踪》 博客。

或者,你可以继续利用 Spring Cloud Sleuth 或 Micrometer 追踪库从应用程序生成轨迹和跨度。

亚马逊 OpenSearch 服务用于执行日志分析和应用程序监控。你也可以使用 跟踪分析 ,它是 OpenSearch 可观察性插件的一部分,用于应用程序跟踪。

关键注意事项

微服务架构需要能够实现双向 TLS 并自动生成、轮换和续订证书。 亚马逊云科技 Certificate Manager (ACM) 可以轻松管理微服务应用程序的证书。

出于安全考虑,应在安全的保管库中管理带有后备服务访问密钥和密码的微服务。亚马逊云科技 Secrets Manager 集中管理所有密钥的生命周期,可以轻松地与部署到 Amazon EKS 集群的应用程序集成。某些企业应用程序的关键要求是定期轮换密钥以符合监管要求。Secrets Manger 根据定义的策略自动轮换密钥。

对于部署到 Amazon EKS 的 Spring Boot 应用程序,应将应用程序容器化以管理容器依赖关系的生命周期。

亚马逊云科技 App2Container (A2C) 是一款命令行工具,用于将 Java 和.NET Web 应用程序迁移到容器 格式并使其现代化。亚马逊云科技 A2C 分析并建立在裸金属、虚拟机、 亚马逊弹性计算云 (EC2) 实例或云中运行的应用程序清单。

App2Container 按照 亚马逊云科技 最佳实践为容器化应用程序生成 Kubernetes 资源文件。亚马逊云科技 A2C 为 亚马逊 DevOps 服务 创建 CI/CD 管道,您可以对其进行自定义 ,使其与现有的 CI/CD 工作流程集成。

Amazon 弹性容器注册表 (Amazon ECR) 是一个完全托管的容器注册表,提供高性能托管,因此您可以在任何地方可靠地部署应用程序映像和构件。 Amazon ECR 扫描 有助于识别图像中的软件漏洞,以符合您的安全要求。

结论

将微服务从 Spring Cloud 迁移到亚马逊 EKS 可以消除管理 Kubernetes 的运营负担,同时允许您利用 Kubernetes 丰富的开源工具。与 亚马逊云科技 App Mesh 集成有利于分阶段管理迁移。亚马逊云科技 X-Ray 可帮助您跟踪用户请求并识别瓶颈,从而提高应用程序性能。所有这些服务加在一起使开发人员有时间专注于提供业务功能,这反过来又提高了发布速度。

资源:

如何开始: 通过一系列动手练习 了解 Amazon EKS 以及与 亚马逊云科技 服务的集成。

浏览 EKS 最佳实践 指南,以有效管理 Amazon EKS 集群。


作者简介:

Krishna Gogineni

Krishna Gogineni 是总部位于费城的 亚马逊云科技 的首席解决方案架构师。Krishna 是云原生架构的传播者,帮助客户改变他们构建软件的方式。Krishna 与客户合作,了解他们独特的业务目标,然后利用行业最佳实践/工具(如 DevOps、数据湖、数据分析、微服务、容器和持续集成/持续交付),增强他们实现这些目标的能力。

Srinivasa Shaik Srinivasa Shaik

是位于波士顿的 亚马逊云科技 的高级解决方案架构师。他与企业客户合作,为他们的业务需求设计和设计解决方案。他的核心关注领域是容器、无服务器和机器学习。在业余时间,他喜欢与家人共度时光、烹饪和旅行。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。