亚马逊 EC2 和 HashiCorp Consul 进行微服务发现 架构博客

微服务发现:使用 Amazon EC2 及 HashiCorp Consul

作者:Marine Haddad, Tom Palmer, Tony Phan, 和 George Agiasoglou
发布于 2023年6月30日
类别: | | | |

重点摘要

在当今大型组织中,微服务环境通常跨越多个云平台、内部数据中心和托管设施。由于系统复杂,需要高效的服务发现和配置管理机制以支持大规模的操作。
本篇文章共享了为 Nomura 开发的解决方案,使用基于层级规则的算法构建服务发现机制,结合了 Amazon EC2 灵活性与第三方软件(如 SpringBoot 和 Consul)。文章详细介绍了如何实现服务的自动发现、连接及故障转移机制。


近年来,大型组织通常会拥有跨越多个云平台、内网数据中心及托管设施的微服务环境。造成这种现象的原因多种多样,通常包括延迟、当地支持结构和历史架构决策。然而,这些环境的复杂性使得必须实施高效的服务发现和配置管理机制,以支持大规模的运营。 Nomura 也面临着这一问题。

是一家全球性的金融服务集团,网络覆盖超过30个国家和地区。通过连接东西方市场,Nomura通过零售、投资管理和批发(全球市场和投资银行)三个业务部门,满足个人、机构、企业及政府的需求。其电子交易策略外汇部门隶属于全球市场,专注于电子外汇流动的所有定量分析和技术层面。该团队为客户构建了一系列创新解决方案,这些方案需在超低延迟的环境中运行以保持竞争力。其目标是构建高质量的工程平台,能够处理 Nomura 的 24 小时、每周 5.5 天的外汇业务的各个方面。

在本文中,我们将分享为 Nomura 开发的解决方案,以及如何利用层级规则算法构建服务发现机制。我们借助 (Amazon EC2)及第三方软件(如 SpringBoot 和 Consul)提供的灵活性,使得该算法支持服务名称的服务发现、域名系统(DNS)延迟及自定义标签等功能。通过自动发现与其他服务连接,客户能够借此实现自动化部署。基于提供的标签,客户可以实施环境边界,以防止服务连接到不应连接的其他服务。最后,我们构建了故障转移机制,以便在服务不可用时,能够按照指定标准提供备选服务。

阅读完本文后,您可以使用提供的资源在您的沙盒环境中部署该解决方案。文中附带的 Terraform 和 Java 代码可根据实际需求进行修改。

解决方案概述

该解决方案由分布在两个不同数据中心的微服务平台和每个数据中心的一个 Consul 集群组成。我们使用两个 (VPC)来模拟地理分布式的 Consul “数据中心”。这些 VPC 通过 连接。通过允许不同数据中心之间的通信,使得 Consul 集群形成广域网(WAN),并能够看到部署在其中的服务实例。SpringBoot 微服务使用 Spring Cloud Consul 插件连接到 Consul 集群。我们构建了一个自定义配置提供程序,使用 Amazon EC2 检索配置。该配置提供机制具有高度扩展性,因此任何人都可以构建自己的配置提供程序。

该解决方案的主要组成部分包括:

  • 使用 Java 和 SpringBoot 构建的示例微服务,部署在 Amazon EC2 上,每个 EC2 实例一个微服务实例
  • 每个区域一个 Consul 集群,每个 EC2 实例一个 Consul 代理
  • 一个自定义服务发现算法

![多 VPC基础设施架构](https://d2908q01vomqb2.cloudfront.net/fc074d501302eb2b93e2554793fcaf50b3bf7291/2023/06/28/Figure-1-multi- 删除)

图 1. 多 VPC 基础设施架构

微服务的典型流程是:1/ 启动;2/ 从 EC2 元数据服务检索相关信息(如标签);3/ 使用该信息向 Consul 注册自己。一旦服务向 Consul注册成功,就可以发现可与之集成的服务,也可以被其他服务发现。

该服务发现机制的一个重要组成部分是使用自定义算法进行服务发现,这一算法根据在向 Consul 注册服务时创建的标签进行服务发现。

![服务发现流程](https://d2908q01vomqb2.cloudfront.net/fc074d501302eb2b93e2554793fcaf50b3bf7291/2023/06/28/Figure-2-service- 删除)

图 2. 服务发现流程

图 2 展示的服务流程如下:

  1. 部署在实例上的 Consul 代理注册到本地的 Consul 集群,服务向其 Consul 代理注册。
  2. 交易服务通过 API 调用查找可用的定价服务。
  3. Consul 代理返回可用的定价服务列表,以便交易服务可以调用定价服务。

部署步骤

以下是部署该解决方案所需的步骤:

  • 使用 Terraform 配置基础设施。应用程序的 .jar 文件及 Consul 配置将作为此过程的一部分进行部署。
  • 测试解决方案。
  • 清理 AWS 资源。

具体步骤在下一节中详细说明,代码可在此 找到。

先决条件

  • 安装
  • 安装
  • 安装
  • 安装
  • 一个
  • – 如果您没有企业许可证,可以联系 请求试用许可证。

部署过程

注意:此部署中使用的默认 AWS 区域为 ap-southeast-1。如果您在不同的 AWS 区域工作,请确保更新这一设置。

克隆仓库

首先,克隆包含所有部署资产的仓库:

git clone https://github.com/aws-samples/geographical-hierarchical-service- lookup-with-consul-on-aws

构建 Amazon 机器映像 (AMIs)

  1. 在 AWS 中构建 Consul 服务器 AMI

进入 ~/deployment/scripts/amis/consul-server/ 目录并运行以下命令以构建 AMI:

packer build .

输出应类似于:

==> Builds finished. The artifacts of successful builds are: --> amazon- ebs.ubuntu20-ami: AMIs were created: ap-southeast-1: ami-12345678910

记下 AMI ID,这将在 Terraform 部署中使用。

  1. 在 AWS 中构建 Consul 客户端 AMI

进入 ~/deployment/scripts/amis/consul-client/ 目录并运行以下命令以构建 AMI:

packer build .

输出应类似于:

==> Builds finished. The artifacts of successful builds are: --> amazon- ebs.ubuntu20-ami: AMIs were created: ap-southeast-1: ami-12345678910

记下 AMI ID,这将在 Terraform 部署中使用。

准备部署

在应用 Terraform 配置前,还需完成以下几个步骤。

  1. 更新部署变量
  2. 在文本编辑器中,进入 ~/deployment/ 目录
  3. 编辑变量文件 template.var.tfvars.json ,添加这些变量的值,包括前面构建的 Consul 服务器和客户端的 AMI IDs

注意:密钥对名称应输入时不带“ .pem”后缀。

  1. 将应用程序文件 .jar 放入根目录 ~/deployment/

部署解决方案

要部署此解决方案,请从终端运行以下命令:


terraform init && terraform plan --var-file=$VAR_FILE -out plan.out

terraform apply plan.out ```

#### _验证部署_

所有 EC2 实例均已部署好并具备  访问权限,因此您可以使用  功能私密地连接到终端。

要连接到某个实例:

  1. 选择一个实例
  2. 点击连接
  3. 转到 Session Manager 选项卡

使用 Session Manager 连接到其中一台 Consul 服务器,并运行以下命令:

`bash consul members`

此命令显示与该集群连接的所有 Consul 服务器和客户端的列表。

`bash consul members -wan`

此命令显示所有连接到此 WAN 环境的 Consul 服务器的列表。

要查看 Consul 用户界面:

  1. 打开终端并运行:

`bash aws ssm start-session --target <instanceID> --document-name AWS-
StartPortForwardingSession --parameters
'{"portNumber": 功能,您可以通过浏览器私密地连接到实例。

  1. 打开浏览器并访问 <http://localhost:8500/ui>
  2. 在  的  中找到管理令牌 ID
  3. 使用管理令牌 ID 登录到 Consul UI

#### _测试解决方案_

连接到交易实例并查询不同服务:

`bash curl http://localhost:9090/v1/discover/service/pricer curlhttp://localhost:9090/v1/discover/service/static-data`

该部署假设交易服务查询定价和静态数据服务,并根据优先级顺序返回服务(见下表 1):

服务 | 优先级 | 客户 | 集群 | 位置 | 环境  
---|---|---|---|---|---  
**TRADING** | 1 | ACME | ALPHA | DC1 | DEV  
|  |  |  |  |   
**PRICER** | 1 | ACME | ALPHA | DC1 | DEV  
**PRICER** | 2 | ACME | ALPHA | DC2 | DEV  
**PRICER** | 3 | ACME | BETA | DC1 | DEV  
**PRICER** | 4 | ACME | BETA | DC2 | DEV  
**PRICER** | 5 | SHARED | ALPHA | DC1 | DEV  
**PRICER** | 6 | SHARED | ALPHA | DC2 | DEV  
|  |  |  |  |   
**STATIC-DATA** | 1 | SHARED | SHARED | DC1 | DEV  
**STATIC-DATA** | 2 | SHARED | SHARED | DC2 | DEV  
**STATIC-DATA** | 2 | SHARED | BETA | DC2 | DEV  
**STATIC-DATA** | 2 | SHARED | GAMMA | DC2 | DEV  
**STATIC-DATA** | -1 | STARK | ALPHA | DC1 | DEV  
**STATIC-DATA** | -1 | ACME | BETA | DC2 | PROD  
  
表 1. 服务优先级顺序

为测试解决方案,您可以在 AWS 管理控制台中切换服务的开关,并重复交易查询,以观察流量的重定向情况。

## 清理工作

为了避免将来的费用,您可以在终端中删除 `~/deployment/` 中的解决方案:

`bash terraform destroy --var-file=$VAR_FILE`

## 结论

在本文中,我们概述了复杂的全球分布式微服务架构所面临的普遍挑战。展示了客户如何结合 Amazon EC2 服务与第三方软件(如 SpringBoot 和
Consul)构建层级服务发现机制,以支持这样的环境。您可以在沙盒环境中测试该解决方案,以查看其能否解决您当前的挑战。

**附加资源:**

  * 
  * 
  * 
  * 
  * 

![MarineHaddad](https://d2908q01vomqb2.cloudfront.net/fc074d501302eb2b93e2554793fcaf50b3bf7291/2023/06/29/Marine-
删除)

### Marine Haddad

Marine 是一家全球金融服务行业(FSI)原型设计和云工程(PACE)团队的全球解决方案架构师,专注于为客户构建原型,并加速迁移到云。她主要关注
Terraform 脚本编写和基础设施相关主题。

![TomPalmer](https://d2908q01vomqb2.cloudfront.net/fc074d501302eb2b93e2554793fcaf50b3bf7291/2023/06/15/Tom-
删除)

### Tom Palmer

Tom Palmer 是 Nomura 外汇电子交易策略的全球负责人,领导一支位于伦敦和新加坡的量化分析师和技术专家团队,负责公司所有电子外汇流动。Tom具有超过 20 年的技术从业经验,曾在媒体和金融服务公司担任角色,并拥有伦敦大学的计算机学位。

![TonyPhan](https://d2908q01vomqb2.cloudfront.net/fc074d501302eb2b93e2554793fcaf50b3bf7291/2023/06/15/Tony-
删除)

### Tony Phan

Tony Phan 是 HashiCorp 的高级解决方案架构师。他与亚太地区和日本战略客户的产品与核心现场团队紧密合作,专注于推动新兴产品的采用,并讨论
Consul 和服务网格。Tony 目前居住在澳大利亚悉尼,业余时间喜欢与朋友和家人共度时光。

![GeorgeAgiasoglou](https://d2908q01vomqb2.cloudfront.net/fc074d501302eb2b93e2554793fcaf50b3bf7291/2023/06/15/George-
删除)

### George Agiasoglou

George 是新加坡 PACE团队的高级解决方案架构师。他帮助全球金融服务(GFS)客户在云迁移之旅中,解决各种阻碍问题,提供原型和概念验证(POC)服务,推动工作负载现代化和云迁移。

Leave a Reply

Required fields are marked *