Spring Cloud 微服务(五) 部署到AWS ECS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud 微服务(五) 部署到AWS ECS相关的知识,希望对你有一定的参考价值。
参考技术A AWS是亚马逊托管的云服务,其中ECS是亚马逊的EC2实例在容器方面的优化,自带docker,而且每个机器都有个亚马逊实现的容器"ECS agent"来负责容器的治理,另外Spring Cloud本身也有对AWS的支持,封装了AWS的服务,叫做spring-cloud-aws。我们在 上一篇 文章实现了微服务的docker化,下一步可以把我们的服务发布到ECS上对外提供服务。集群是ECS最大的一个层级,集群的选择通常考虑地理因素,比如国内访问多的话就考虑在东京建立集群,目前AWS中国还没和其他AWS互连,而且只能使用部分功能,韩国区没有ECS服务。创建过程中特别注意Key pair一定要预先定义好,然后在这里选择一个Key pair,笔者就试过没有设置Key pari导致无法ssh到创建的实例上。Number of Instances代表我们想要开的实例数。
这里的VPS是设置一个虚拟的内网,有了这个才能更好地构建一个内网微服务。
Security Group其实定义的是防火墙相关的端口开关,这个在后面会用到。
一个集群可以运行很多服务,Number of tasks定义了预期要运行多少个task,如果目前运行的task低于这个值,ECS会自动发起task满足这个值。
Task Placement 定义了当给定数量task要启动时,ECS会优先把task按照一定的算法启动到某个实例上,比如spread代表平均地放置task,random代表随机。下面的ELB和Auto scaling分别是负载均衡和自动扩展功能。
Service创建出来的时候的面板:
创建任务时候可以选择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掉,这个也是导致上诉死循环的一个重要原因。
创建镜像很简单,只要把上面显示的命令行在本地镜像上执行一下就可以了,具体操作类似GIT把本地仓库push到远程仓库。
把Eureka Server和我们的微服务推到远程的docker仓库之后,如图所示可以看到这两个Image。
按照上面的任务创建方式创建一个任务,任务里面运行两个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
部署微服务的时候,Spring Cloud 和 Kubernetes 哪个更好?
当我们需要部署微服务的时候,哪个更好?Spring Cloud还是Kubernetes?答案是都可以,只是各自有其优势。
最近我读了A. Lukyanchikov写的一篇非常精彩的文章[1],讲的是用 Spring Cloud 和 Docker 来构建微服务架构。如果你还没读过,你应该读一下,因为它给出了一个关于如何利用 Spring Cloud 来创建一个简单的基于微服务的系统的综合视角。为了构建一个能扩展到数千个服务的可扩展且有弹性的微服务系统,它就必须有一套拥有广泛的构建时和运行时能力的工具集来帮助管理和控制。使用 Spring Cloud,既能实现功能型服务(比如统计服务,账号服务以及通知服务),又能实现基础架构服务(比如日志分析,配置服务器,服务发现,认证服务等)。描述这样一个使用 Spring Cloud 构造的微服务架构(MSA)图如下所示:
该图包含了运行时视角,但是它不包含打包,持续集成,扩展性,高可用,自愈等在MSA世界中同样重要的功能。本文假设大部分 Java开 发者都熟悉 Spring Cloud,我们来做个对比,看看 Kubernetes 是如何提出这些额外的概念,以关联到 Spring Cloud 的。
我们不会针对两者一个一个概念的比对,而是根据更广阔的微服务概念,来看看 Spring Cloud 和 Kubernetes 分别是如何实现他们的。今天有关 MSA 的一个好事是,它是一个有着易于理解的优缺点评估的架构风格。微服务能加强模块边界,各模块可以有独立的部署和技术差异。但是同时也带来了代价,需要开发分布式系统以及明显增加操作成本。一个关键的成功因素是聚焦于使用一套能帮助你实现尽可能多的 MSA 概念的工具。能使得启动过程迅速且容易是很重要的,但是通向产品化的旅程是很漫长的,你需要达到这样的高度[2]才能到达那里。
如上图所示,我们可以看到 MSA 中必须实现的那些最普遍的技术概念(我们将不会关注非技术概念,比如组织结构,文化等)。
Sping Cloud 和 Kubernetes 这两个平台非常不一样,并且它们之间也没有直接的等价特性。如果我们将每个 MSA 概念匹配到这两个平台使用的实现这些概念的技术/项目,我们能得出下表。
从上表中能快速得出的结论是:
Spring Cloud 有一个丰富的集合,完备整合了 Java 库,以实现各种运行时概念,作为应用栈的一部分。因此,这些微服务自身有库和运行时代理,来做客户端的服务发现,负载均衡,配置更新,度量跟踪等。各种模式,比如单集群服务和批量任务,也是由 JVM 来管理的。
Kubernetes 兼容多种语言,目标不止 Java 平台,并且以一种通用方式为所有语言实现了分布式的计算挑战。它提供了平台级以及应用栈之外的服务,比如配置管理,服务发现,负载均衡,追踪,度量,单例,调度任务。应用不需要任何库或者代理来实现客户端逻辑,且可用任何语言来写。
在某些领域,两个平台都依赖相似的第三方工具。比如,ELK和EFK栈,追踪库等。某些库,比如 Hystric 和 Spring Boot,在两个环境上都非常有用。有些领域两个平台是互补的,整合到一起能创造出一个更强大的解决方案(KubeFlix[3] 和Spring Cloud Kubernetes[4] 就是这样的例子)。
为了画出每个项目的范围,这里有张表列出了几乎是端到端的MSA需求,从最底层的硬件,到最上层的 DevOps 和自服务经验,并且列出了如何关联到 Spring Cloud 和 Kubernetes 平台。
在某些场景下,两个项目使用不同的方法达成了相同的需求,在某些领域,一个项目可能会强于另一个。但是在某些情况下,两个项目是互补的,可以组合起来达成高级的微服务经验。例如,Spring Boot 提供了 Maven 插件来构建单个 JAR 应用包。这样就可以结合 Docker 和 Kubernetes 的声明式部署和调度能力,使得运行微服务变得轻而易举。同样的,Spring Cloud 有个内嵌的应用库,可以利用 Hystric(自带隔离和熔断模式)和Ribbon(用来负载均衡)来创建有弹性的,容错的微服务。但是光靠这个还不够,当这个能力和 Kubernetes 的健康检查,进程重启,以及自动伸缩能力结合在一起时,微服务才能成为一个反脆弱系统。
Spring Cloud
Spring Cloud 给开发者提供了一个工具,能在分布式系统中快速构建例如配置管理,服务发现,熔断,路由等通用模式。这是基于 Netflix 的 OSS 库,它们是用 Java 写的,面向Java开发者。
优势
由 Spring 平台自身来提供统一的编程模型,加上 Spring Boot 的快速创建应用的能力,可以给开发者大量的微服务开发经验。例如,只要极少量的标签,你就可以创建一个配置服务器,再加一些标签,你就可以得到一个客户端库来配置你的服务。
有大量的覆盖了大多数运行时概念的库可供选择。因为所有的库都是用Java写的,它能提供更多的特性,更强的控制,以及更好的一致性选项。
不同的 Spring Cloud 库都可以很好的整合在一起。例如,Feign 客户端也可以使用 Hystrix 作为熔断器,以及 Ribbon 作为请求负载均衡器。每一个都是标签驱动的,这样对 Java 开发者来说就很容易开发。
缺点
Spring Cloud 其中一个最主要的优点也是它的缺点,即它只针对 Java。MSA 的强烈的目标是具备互换技术栈,库,必要的时候甚至是语言的能力。而这对Spring Cloud来说不可能。如果你想要消费 Spring Cloud/Netflix OSS 基础服务,比如配置管理,服务发现,或者负载均衡,解决方案不是很优雅。Netflix Prana[5] 项目实现了 sidecar 模式,让 Java 客户端库基于 HTTP 协议,使得那些非 JVM 语言写的应用也可以存在于 NetflixOSS 系统中,但是这种方式不是很优雅。
Java 开发者需要关注非常多的事情,Java 应用需要处理非常多的事情。每个微服务都需要运行各种客户端来获得配置恢复、服务发现、负载均衡等功能。这些客户端很容易建立,但是它们没有隐藏环境的构建时和运行时依赖。例如,开发者可以用 @EnableConfigServer 标签创建一个配置服务器,但是这也是唯一路径。每次开发者想要运行一个单一的微服务,他们需要使配置服务器正常运行。对一个受控环境,开发者不得不考虑让配置服务器高可用,且因为它可以由 Git 或者 Svn 来支持,他们还需要一个共享的文件系统。同样的,对服务发现来说,开发者首先需要启动一个Eureka服务器。对一个受控环境,他们需要在每个 AZ 上都用多个实例来实现集群。这有点类似于,除了实现所有的功能性服务外,Java开发者还需要构建和管理一个非试用型的微服务平台。
单独使用 Spring Cloud 在微服务旅程上无法走得很长远,在一个完整的微服务经历中,开发者还需要考虑自动化部署,调度,资源管理,进程隔离,自愈,构建流水线等功能。在这点上,我觉得单独拿 Spring Cloud 和 Kubernetes 来比较不太公平,更公正的比较应该是 Spring Cloud + Cloud Foundry(或者 Docker Swarm)和 Kubernetes 来比较。但是那也说明,对一个完整的端到端的微服务经历,Spring Cloud 还需要补充一个应用平台,就像 Kubernetes 那样。
Kubernetes
优势
Kubernetes 是语言不感知的容器管理平台,能兼容运行原生云应用和传统的容器化应用。它提供的服务,比如配置管理,服务发现,负载均衡,度量收集,以及日志聚合,能被各种语言使用。这使得组织可以只提供一个平台供多个项目组使用(包括使用 Spring 的 Java 开发者),并且提供多种目的:应用开发,测试环境,构建环境(运行资源控制系统,构建服务器,人工仓库)等。
和 Spring Cloud 相比,Kubernetes 实现了更广阔的 MSA 概念集合。除了提供运行时服务,Kubernetes 也允许我们提供环境变量,设置资源限制,RBAC,管理应用生命周期,使能自动伸缩和自愈(表现为就像一个反脆弱[6]平台)。
Kubernetes 的技术是基于 Google 15年的管理容器的研究和开发经验。除此以外,还有将近 1000 个 committer,它几乎是 GitHub 上开源社区最活跃的项目。
缺点
Kubernetes 是兼容多种语言的,因此它的服务和原语是通用的,不像 Spring Cloud 对 JVM 那样,没有针对不同的平台做优化。例如,配置是通过环境变量或者挂载文件系统传递给应用的。它没有 Spring Cloud 配置提供的那样精妙的配置更新能力。
Kubernetes 不是一个针对开发者的平台。它的目的是供有 DevOps 思想的IT人员使用。因此,Java 开发者需要学习一些新的概念,并更开放得学习新的解决问题的方式。不管使用 MiniKube 来部署一个 Kubernetes 开发实例是多么得容易,手工安装一个高可用的 Kubernetes 集群是有明显的操作成本的。
Kubernetes 仍是一个相对较新的平台(2年),它也还在活跃得开发和生长中。因此每个版本都会有许多新的特性,使得我们很难去一直跟踪。好消息是这个问题已经被正视,API 做成了可扩展且是后向兼容的。
正如你所看到的,两个平台都有各自的强项,也有需要提高的地方。Spring Cloud 是一个容易上手的,开发者友好的平台。而 Kubernetes 是 DevOps 友好的,有着陡峭的学习曲线,但是包含了更广泛的微服务概念。这里是针对这几点的总结。
两个框架实现了不同范围的 MSA 概念,使用的是从根源上就有区别的方式。Spring Cloud 方式是尽力在 JVM 范畴内来解决每个 MSA 的挑战,而 Kubernetes 的方式是尽力为开发者在平台层面消除这些问题。Spring Cloud 在 JVM 内非常强大,Kubernetes 在管理这些 JVM 上非常强大。因此,整合这两者取它们的最佳部分,是一个很自然的进步过程。
有了这样一个整合,Spring 提供应用的打包,Docker 和 Kubernetes 提供部署和调度。Spring 通过 Hystrix 线程池提供应用内的隔离,而 Kubernetes 通过资源,进程和命名空间来提供隔离。Spring 为每个微服务提供健康终端,而 Kubernetes 执行健康检查,且把流量导到健康服务。Spring 外部化配置并更新它们,而 Kubernetes 分发配置到每个微服务。这个列表将一直持续。
我最喜欢的微服务平台是哪个?我两个都喜欢。我喜欢 Spring 框架提供的开发者经验。它是标签驱动的,并且拥有包含了各种功能需求的库。跟任何整合相关的,我喜欢 Apache Camel(而不是 Spring Integration),它能提供应用级别的连接器,消息,路由,可靠性和容错功能。而对跟集群和管理多应用实例相关的,我更喜欢魔法般的 Kubernetes 能力。不论何时,有重复功能,比如服务发现,负载均衡,配置管理,我尽量使用 Kubernetes 提供的跟语言无关的原语。
相关链接:
https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do
https://news.ycombinator.com/item?id=12509533
https://github.com/fabric8io/kubeflix
https://github.com/fabric8io/spring-cloud-kubernetes
https://github.com/Netflix/Prana
http://www.ofbizian.com/2016/07/from-fragile-to-antifragile-software.html
原文链接:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes
以上是关于Spring Cloud 微服务(五) 部署到AWS ECS的主要内容,如果未能解决你的问题,请参考以下文章
springcloud 微服务Spring Cloud Alibaba 整合Nacos实战
部署微服务的时候,Spring Cloud 和 Kubernetes 哪个更好?
打包微服务前后端分离项目并部署到服务器 --- 分布式 Spring Cloud + 页面渲染 Nuxt.js