使用Fargate在AWS ECS中部署ASP.NET Core 微服务

目录

介绍

为何选择ECS Fargate?

先决条件

应用架构

AWS基础架构

ASP.NET Core WebAPI的准备情况

在ECS上运行Docker镜像容器

使用Cloudformation在ECS群集中部署服务镜像

使用AWS控制台在ECS群集中部署服务镜像

第1步:应用程序负载均衡器-ELB

第2步:ECS群集

第3步:ECS TaskDefination和ECS服务

结论

参考


介绍

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第1张图片

近年来,微服务受到了广泛的欢迎,大多数系统都采用这种新架构来开发业务线应用程序。但是,微服务可能不是针对每个人或每个问题的单一解决方案。假设您有一个独立的团队来构建和管理系统中的独立模块,那么它可能是一种理想的方法。尽管如此,对于单个团队项目来说,开发复杂的分布式应用程序并将其部署到任何云环境中都是更好的架构。

您可以在这里找到有关微服务的更多信息的良好资源。

在本系列中,我将带您了解如何使用ECS FargateAWS中部署dotnet核心微服务。

为何选择ECS Fargate

我喜欢AWS lambdaAzure功能等无服务框架。但是,它们在内存,超时和框架版本方面几乎没有限制。假设您有一个需要3 GB以上内存来处理其工作的组件和/或它可能需要10多分钟和/或它使用较旧的.NET Core FrameworkNode js框架。AWS fargate是一个无服务框架,用于在ECS容器上部署应用程序,而无需我们维护主机。我们可以自由选择这些容器的框架和内存分配。

先决条件

  • 我假设您已经使用过ASP.NET核心应用程序。
  • 您需要对AWS服务有一些基本的了解,例如EC2ECSELBECRIAMAWS配置。
  • 应在开发机器中安装Dotnet Core SDKAWS CLIDockerVisual Studio代码或任何IDE

应用架构

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第2张图片

  • 我为车辆保险用例创建了一个应用程序。任何客户都可以对元数据服务进行REST调用,以创建/更新客户,车辆信息和车辆保险报价请求。报价将在服务器上生成并发送回客户端。选择报价后,客户应调用策略服务来处理和创建策略。

  • 我为这些服务创建了两个简单的ASP.NET Core webapi项目,一个用于管理客户,车辆和报价等基本信息。另一个是管理政策。
  • 每个服务都将与自己的数据库进行交互,以使这些服务完全独立。
  • 可以使用事件模式同步或更改这些数据库之间的数据,这将超出此演示的范围。

AWS基础架构

我们将使用fargate将这些简单的微服务部署到AWS ECS集群。

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第3张图片

  • 来自客户端的每个请求都可以到达单个应用程序负载均衡器,然后通过匹配URL模式将请求转发到相应的目标组。
  • 我们的想法是为每个服务创建一个唯一的目标组,以便他们将请求转发给使用FargateECS集群中启动的服务容器。
  • ECS容器中运行的API应该能够在同一个VPC中与数据库服务(如SQL Server RDSElasticacheDynamoDB)进行通信。

ASP.NET Core WebAPI的准备情况

让我们首先了解ASP.NET Core webapi服务中能够在ECS集群中部署的必要部分。

  • 所有查找数据和会话相关数据应存储在单个实例redis缓存或一些公共数据库中,以便所有服务实例都能够从单个存储库访问数据。
services.AddStackExchangeRedisCache(options =>
{
   options.Configuration = Configuration["Cache:AWSRedisEndPoint"];
});
  • 每个服务都应该配置健康检查路由,以检查服务是否在ELB的容器中运行。我使用内置的中间件来配置它。
//this line in ConfigureServices method of Startup.cs
services.AddHealthChecks();
//this line in Configure method of Startup.cs
 app.UseHealthChecks("/health");
  • 服务中的所有路由都应具有公共基本路由路径,以便ELB的请求应该能够通过匹配基本路由路径发送到此服务目标组。
[Route("metadataapi/[controller]")]
public class CustomersController : ControllerBase
[Route("metadataapi/[controller]")]
public class VehiclesController : ControllerBase
  • 我在API发现文档中使用了swagger。这种招摇配置还应考虑使用基本路径。
app.UseSwagger(c =>
{
 c.RouteTemplate="policyapi/swagger/{documentName}/swagger.json";\
});
app.UseSwaggerUI(c =>
{ 
 c.SwaggerEndpoint("/policyapi/swagger/v1/swagger.json","APIdoc");
 c.RoutePrefix = "policyapi/swagger";
});

ECS上运行Docker镜像容器

  • Docker是一个在主机上创建和部署应用程序容器的平台。如果您之前没有使用过Docker,请考虑一些基础知识。我喜欢这个多元化课程
  • 我为每个服务创建了docker文件,其中包含构建API映像的基本指令。
  • 我还创建了一个docker-compose文件,用于在本地主机中构建和运行这些容器。
  • 您需要创建一个.env文件设置环境变量来进行服务
  • 在终端中使用此命令在容器中构建和运行映像:
docker-compose up -d --build
  • 通过导航到swagger URL确保API服务在容器中正常运行http://localhost:8080/metadataapi/swagger
  • 使用此命令为每个服务创建映像存储库:
aws ecr create-repository --repository-name metadata-api
  • 您还可以通过登录AWS ECR控制台来创建存储库。

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第4张图片

  • 标记使用ECR存储库URI运行服务映像:
docker tag metadataapi:latest
875373411184.dkr.ecr.us-west1.amazonaws.com/insurancemetadata:latest
  • 登录ECR将此镜像推送到云端。我们需要运行此命令来生成login命令。
aws ecr get-login --no-include-email --region us-west-2
  • 将上述命令的输出复制并粘贴到终端中,进行实际登录。
  • 成功登录后,将这些服务镜像推送到云端。
docker push 
875373411184.dkr.ecr.us-west-1.amazonaws.com/insurancemetadata

使用CloudformationECS群集中部署服务镜像

docker镜像推送到ECR存储库后,我们就可以使用以下两个cloud-formation 模板来部署服务。

  • 第一个创建公共资源,如负载均衡器,安全组和集群。
  • 第二个是使用Fargate在容器中配置服务,还创建必要的IAM角色,目标组,任务定义和ECS服务。

我们需要通过传递必要的参数为应用程序中的每个服务创建一个堆栈。

  • 您可以使用AWS控制台为这些cloud-formation 模板创建堆栈,也可以从命令行执行这些堆栈。

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第5张图片

aws cloudformation deploy 
   --template-file /path_to_template/microservice-cluster-elb.yaml 
--stack-name my-new-stack
--parameter-overrides EnvironmentName=mycluster vpcid= ...
  • 第一个堆栈成功完成后,我们需要为每个服务创建堆栈。这个时候,我们需要找到从第一组输出传递到服务栈,如elbruleidsecuritygroupnameclustername
  • 在创建服务之前,请确保在模板中定义了所有必需的环境变量。
  • 创建第二个堆栈后,您可以在AWS控制台中找到ELB负载均衡器DNS条目。
  • 浏览每个服务的swagger URL以确保成功部署API

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第6张图片

  • 这些cloud-formation 模板也可以重复用于CI / CD工具集成。
  • 部署这些微服务的其他选项是使用AWS Web控制台。

使用AWS控制台在ECS群集中部署服务镜像

我们学习了如何使用cloudformationAWS ECS Fargate中部署dotnet微服务。在本节中,我们将使用AWS控制台部署相同的应用程序,以了解每个AWS服务。

1步:应用程序负载均衡器-ELB

  • 我们使用ELBhttp请求平均分配给所有ECS容器。ELBAWS中的完全管理负载均衡器
  • API镜像推送到AWS ECR存储库后,只需验证它们是否存在于AWS控制台中。
  • 导航到EC2服务,单击Load balancers,选择“Create Load Balancer”并选择Application Load Balancer

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第7张图片

  • 输入选择VPC和子网的基本信息

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第8张图片

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第9张图片

  • 配置Securitygrooup,使用所需的IP地址以允许访问ELB

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第10张图片

  • 输入默认目标组名称和设置。也

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第11张图片

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第12张图片

  • 查看并单击创建并导航到ELB仪表板。
  • 导航到Listeners选项卡,然后单击查看/编辑规则链接。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第13张图片

  • 导航到编辑选项卡并编辑默认规则以返回固定响应503

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第14张图片

  • 单击更新按钮,找到ELBDNS名称并进行浏览。

2步:ECS群集

  • ECS是云中容器的AWS自定义编排。
  • 导航到“ECS”,选择“Cluster”并单击“Create Cluster”

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第15张图片

  • 选择Network Only选项作为群集模板。这告诉ECS使用Fargate

​​​​​​​​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第16张图片

  • 输入名称并单击创建

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第17张图片

3步:ECS TaskDefinationECS服务

  • TaskDefination:是一组指令,如镜像,环境变量和内存大小,在此集群中创建容器时使用的端口。
  • 导航到ECS下的Task Definations菜单,然后单击Create New Task defination按钮。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第18张图片

  • 在下一步中,选择Fargate作为Launch类型。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第19张图片

  • 输入名称和其他详细信息,如任务角色——如果任务执行角色不存在,请创建一个进入IAM控制台。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第20张图片

使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第21张图片

  • 单击底部的添加容器按钮,将容器添加到此任务。

Container弹出窗口中填写此服务的名称,镜像URL和端口等信息。您可以将其余设置保留为默认值,除非您有特定要求。使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第22张图片

  • 添加容器后,只需单击创建按钮,然后导航到任务详细信息页面进行确认。
  • ECS服务  ECS中的一种机制,用于在一个环境中使用所需数量的容器执行任务定义。此外,您还可以将这些容器的ELB目标组配置为负载均衡器。
  • 导航到Clusters仪表板并选择我们创建的集群。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第23张图片

  • 单击群集详细信息页面服务选项卡下的创建按钮。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第24张图片

  • 输入所有基本信息,如lauch类型,名称,任务定义和任务数量。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第25张图片

  • 选择VPC和至少两个子网(私有提供)和安全组。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第26张图片

  • 选择我们在步骤1中创建的应用程序负载均衡器。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第27张图片

  • 单击添加负载均衡器按钮,然后填写信息以为此服务创建单独的目标组。还要确保输入与API基本根路径/ metadataapi *和运行状况路径相同的路径模式。使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第28张图片
  • 取消选择Route 53,除非您需要设置Route 53 DNS并单击Next

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第29张图片

  • 查看并单击创建服务
  • 等待几分钟来运行此任务,并通过转到群集详细信息页面中的任务选项卡来验证任务状态。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第30张图片

  • 如果您看到任何错误或者任务从未返回运行状态,只需单击上一页中的第一个链接即可导航到执行任务页面。您应该能够看到错误和日志的详细信息。
  • 现在浏览ELB DNS名称以及swagger路由以验证服务是否成功运行。

​​​​​​​使用Fargate在AWS ECS中部署ASP.NET Core 微服务_第31张图片

结论

对您的微服务应用程序中的所有其他服务重复步骤3,它们应该在具有不同路由的相同ELB DNS URL上可用。

  • http://dnsurl/metadataapi/customers
  • http://dnsurl/policyapi/policies

使用此方法,您可以部署微服务而不会影响其他服务。显然,这种UI方法只是为了理解各种服务。大多数情况下,我们应该使用某种类型的基础架构作为代码技术,如Cloud-formationTerraformAWS Code Deploy,以与我们的CI / CD工具集成。

参考

  • https://aws.amazon.com/getting-started/projects/break-monolith-app-microservices-ecs-docker-ec2/
  • https://aws.amazon.com/blogs/compute/hosting-asp-net-core-applications-in-amazon-ecs-using-aws-fargate/

 

原文地址:https://www.codeproject.com/Articles/1416006/Deploying-ASP-NET-Core-Microservices-in-AWS-ECS-2

你可能感兴趣的:(微服务,ASP.NET,CORE,Fargate,AWS,ECS,微服务)