AWS是亚马逊托管的云服务,其中ECS是亚马逊的EC2实例在容器方面的优化,自带docker,而且每个机器都有个亚马逊实现的容器"ECS agent"来负责容器的治理,另外Spring Cloud本身也有对AWS的支持,封装了AWS的服务,叫做spring-cloud-aws。我们在上一篇文章实现了微服务的docker化,下一步可以把我们的服务发布到ECS上对外提供服务。
ECS层级结构
创建一个集群 Cluster
集群是ECS最大的一个层级,集群的选择通常考虑地理因素,比如国内访问多的话就考虑在东京建立集群,目前AWS中国还没和其他AWS互连,而且只能使用部分功能,韩国区没有ECS服务。创建过程中特别注意Key pair一定要预先定义好,然后在这里选择一个Key pair,笔者就试过没有设置Key pari导致无法ssh到创建的实例上。Number of Instances代表我们想要开的实例数。
这里的VPS是设置一个虚拟的内网,有了这个才能更好地构建一个内网微服务。
Security Group其实定义的是防火墙相关的端口开关,这个在后面会用到。
整个创建过程需要几分钟,创建完就能看在面板上看到我们刚创建的微服务了,集群页面会展示运行的服务数,任务数,CPU和内存。
创建一个服务 Service
一个集群可以运行很多服务,Number of tasks定义了预期要运行多少个task,如果目前运行的task低于这个值,ECS会自动发起task满足这个值。
Task Placement 定义了当给定数量task要启动时,ECS会优先把task按照一定的算法启动到某个实例上,比如spread代表平均地放置task,random代表随机。下面的ELB和Auto scaling分别是负载均衡和自动扩展功能。
Service创建出来的时候的面板:
创建一个任务 Task
创建任务时候可以选择docker的联网方式,分别是bridge和host,默认的docker都是bridge方式。
Task可以添加docker container,并且为每个container配置不同属性。这里定义使用的镜像,待会我们会创建一个镜像。为了防止突然升高的内存导致的高昂费用,可以设置内存最大值。这里说一个笔者遇到的坑,128兆内存其实是不够运行Spring Boot应用的,我在创建过程中使用了默认的128兆内存,导致微服务刚起来没多久就因为超出内存导致Task被干掉,同时Service里定义了最小存活Task为1,所以每次被干掉之后又会重新启动一个Task,导致了服务一只在不断循环重启,所以对于网络应用这里的推荐内存值是300-500兆内存。
Port mappings实现的是docker端口的映射。
Essential代表它是这个任务的主要容器,如果这个容器失去联系了,Task将被Kill掉,这个也是导致上诉死循环的一个重要原因。
创建Container Registory(docker镜像仓库)
创建镜像很简单,只要把上面显示的命令行在本地镜像上执行一下就可以了,具体操作类似GIT把本地仓库push到远程仓库。
把Eureka Server和我们的微服务推到远程的docker仓库之后,如图所示可以看到这两个Image。
在ECS上部署我们的微服务
按照上面的任务创建方式创建一个任务,任务里面运行两个docker,分别是我们的Eureka Server和一个简单的服务
这时候update我们的Service
等一段时间后就能看到我们的服务正运行在ECS集群上了
这时候还有最后一步,因为我们设置了防火墙,所以要去防火墙开启8081端口和8870端口,因为我们的服务运行在这两个端口上。
到这里,我们就可以用ECS实例的公网地址访问我们在AWS上创立的第一个微服务了。
最后附上官网文档上ECS的一个结构图
上一篇:Spring Cloud 微服务(四) Docker化
下一篇:Spring Cloud 微服务(六) 服务消费Feign
(1) http://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html