目录
介绍
近年来,微服务受到了广泛的欢迎,大多数系统都采用这种新架构来开发业务线应用程序。但是,微服务可能不是针对每个人或每个问题的单一解决方案。假设您有一个独立的团队来构建和管理系统中的独立模块,那么它可能是一种理想的方法。尽管如此,对于单个团队项目来说,开发复杂的分布式应用程序并将其部署到任何云环境中都是更好的架构。
您可以在这里找到有关微服务的更多信息的良好资源。
在本系列中,我将带您了解如何使用ECS Fargate在AWS中部署dotnet核心微服务。
为何选择ECS Fargate?
我喜欢AWS lambda和Azure功能等无服务框架。但是,它们在内存,超时和框架版本方面几乎没有限制。假设您有一个需要3 GB以上内存来处理其工作的组件和/或它可能需要10多分钟和/或它使用较旧的.NET Core Framework或Node js框架。AWS fargate是一个无服务框架,用于在ECS容器上部署应用程序,而无需我们维护主机。我们可以自由选择这些容器的框架和内存分配。
先决条件
- 我假设您已经使用过ASP.NET核心应用程序。
- 您需要对AWS服务有一些基本的了解,例如EC2,ECS,ELB,ECR,IAM和AWS配置。
- 应在开发机器中安装Dotnet Core SDK,AWS CLI,Docker和Visual Studio代码或任何IDE。
应用架构
-
我为车辆保险用例创建了一个应用程序。任何客户都可以对元数据服务进行REST调用,以创建/更新客户,车辆信息和车辆保险报价请求。报价将在服务器上生成并发送回客户端。选择报价后,客户应调用策略服务来处理和创建策略。
- 我为这些服务创建了两个简单的ASP.NET Core webapi项目,一个用于管理客户,车辆和报价等基本信息。另一个是管理政策。
- 每个服务都将与自己的数据库进行交互,以使这些服务完全独立。
- 可以使用事件模式同步或更改这些数据库之间的数据,这将超出此演示的范围。
AWS基础架构
我们将使用fargate将这些简单的微服务部署到AWS ECS集群。
- 来自客户端的每个请求都可以到达单个应用程序负载均衡器,然后通过匹配URL模式将请求转发到相应的目标组。
- 我们的想法是为每个服务创建一个唯一的目标组,以便他们将请求转发给使用Fargate在ECS集群中启动的服务容器。
- 在ECS容器中运行的API应该能够在同一个VPC中与数据库服务(如SQL Server RDS,Elasticache和DynamoDB)进行通信。
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控制台来创建存储库。
- 标记使用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
使用Cloudformation在ECS群集中部署服务镜像
将docker镜像推送到ECR存储库后,我们就可以使用以下两个cloud-formation 模板来部署服务。
我们需要通过传递必要的参数为应用程序中的每个服务创建一个堆栈。
- 您可以使用AWS控制台为这些cloud-formation 模板创建堆栈,也可以从命令行执行这些堆栈。
aws cloudformation deploy
--template-file /path_to_template/microservice-cluster-elb.yaml
--stack-name my-new-stack
--parameter-overrides EnvironmentName=mycluster vpcid=<vpcid> ...
- 第一个堆栈成功完成后,我们需要为每个服务创建堆栈。这个时候,我们需要找到从第一组输出传递到服务栈,如elbruleid,securitygroupname和clustername。
- 在创建服务之前,请确保在模板中定义了所有必需的环境变量。
- 创建第二个堆栈后,您可以在AWS控制台中找到ELB负载均衡器DNS条目。
- 浏览每个服务的swagger URL以确保成功部署API。
- 这些cloud-formation 模板也可以重复用于CI / CD工具集成。
- 部署这些微服务的其他选项是使用AWS Web控制台。
使用AWS控制台在ECS群集中部署服务镜像
我们学习了如何使用cloudformation在AWS ECS Fargate中部署dotnet微服务。在本节中,我们将使用AWS控制台部署相同的应用程序,以了解每个AWS服务。
第1步:应用程序负载均衡器-ELB
- 我们使用ELB将http请求平均分配给所有ECS容器。ELB是AWS中的完全管理负载均衡器
- 将API镜像推送到AWS ECR存储库后,只需验证它们是否存在于AWS控制台中。
- 导航到EC2服务,单击Load balancers,选择“Create Load Balancer”并选择Application Load Balancer。
- 输入选择VPC和子网的基本信息
- 配置Securitygrooup,使用所需的IP地址以允许访问ELB。
- 输入默认目标组名称和设置。也
- 查看并单击“创建”并导航到ELB仪表板。
- 导航到Listeners选项卡,然后单击“查看/编辑规则”链接。
- 导航到“编辑”选项卡并编辑默认规则以返回固定响应503。
- 单击“更新”按钮,找到ELB的DNS名称并进行浏览。
第2步:ECS群集
- ECS是云中容器的AWS自定义编排。
- 导航到“ECS”,选择“Cluster”并单击“Create Cluster”。
- 选择“Network Only”选项作为群集模板。这告诉ECS使用Fargate。
- 输入名称并单击“创建”。
第3步:ECS TaskDefination和ECS服务
- TaskDefination:是一组指令,如镜像,环境变量和内存大小,在此集群中创建容器时使用的端口。
- 导航到ECS下的Task Definations菜单,然后单击Create New Task defination按钮。
- 在下一步中,选择Fargate作为Launch类型。
- 输入名称和其他详细信息,如任务角色——如果任务执行角色不存在,请创建一个进入IAM控制台。
- 单击底部的“添加容器”按钮,将容器添加到此任务。
在Container弹出窗口中填写此服务的名称,镜像URL和端口等信息。您可以将其余设置保留为默认值,除非您有特定要求。
- 添加容器后,只需单击“创建”按钮,然后导航到“任务详细信息”页面进行确认。
- ECS服务 是ECS中的一种机制,用于在一个环境中使用所需数量的容器执行任务定义。此外,您还可以将这些容器的ELB目标组配置为负载均衡器。
- 导航到Clusters仪表板并选择我们创建的集群。
- 单击群集详细信息页面“服务”选项卡下的“创建”按钮。
- 输入所有基本信息,如lauch类型,名称,任务定义和任务数量。
- 选择VPC和至少两个子网(私有提供)和安全组。
- 选择我们在步骤1中创建的应用程序负载均衡器。
- 单击“添加负载均衡器”按钮,然后填写信息以为此服务创建单独的“目标”组。还要确保输入与API基本根路径/ metadataapi *和运行状况路径相同的路径模式。
- 取消选择Route 53,除非您需要设置Route 53 DNS并单击Next。
- 查看并单击“创建服务”。
- 等待几分钟来运行此任务,并通过转到“群集详细信息”页面中的“任务”选项卡来验证任务状态。
- 如果您看到任何错误或者任务从未返回“运行”状态,只需单击上一页中的第一个链接即可导航到执行任务页面。您应该能够看到错误和日志的详细信息。
- 现在浏览ELB DNS名称以及swagger路由以验证服务是否成功运行。
结论
对您的微服务应用程序中的所有其他服务重复步骤3,它们应该在具有不同路由的相同ELB DNS URL上可用。
使用此方法,您可以部署微服务而不会影响其他服务。显然,这种UI方法只是为了理解各种服务。大多数情况下,我们应该使用某种类型的基础架构作为代码技术,如Cloud-formation或Terraform或AWS 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