##部署微服务:Spring Cloud vs. Kubernetesgit
Spring Cloud vs. Kubernetes,谁才是部署微服务的最佳拍档?github
Spring Cloud和Kubernetes都声称本身是开发和运行微服务的最佳环境,但二者在特性上并不相同,解决的问题点也不同。本文将探讨这两种平台对于微服务架构的交付有何做用、二者在哪些方面表现更好以及如何利用这两种平台在微服务架构的路上取得成功。spring
我最近拜读了 A.Lukyanchikov关于如何利用Spring Cloud
和Docker
搭建微服务的文章,推荐你们也看一看。编程
想要搭建一个能够十倍、百倍扩展服务的弹性伸缩微服务系统,须要借助具备宽泛构建时间和运行时能力的工具集进行集中的管理和治理。服务器
Spring Cloud
包括了各类功能性服务(如统计服务,账户服务和通知服务)和支持基础设施服务(如日志分析,配置服务器,服务发现,受权服务)。架构
下图展现使用Spring Cloud
的微服务架构:负载均衡
运维
(Spring Cloud
微服务架构,by A. Lukyanchikov)分布式
该图展现了运行时的方方面面,但没有包括打包、持续集成、伸缩、高可用和自我修复等在微服务架构中重要点。本文假设大多数JAVA
开发者熟悉Spring Cloud
,采用类比的形式,经过解决以上要点问题,带你们了解Kubernetes
和Spring Cloud
之间的关系。ide
咱们在此不进行特性的逐个对比,而是从大面上看一看微服务的要点并聊一聊Spring Cloud
和Kubernetes
如何实现。
微服务架构的一大优点是易于理解的架构风格,可实现强大的模块边界,而且具备独立的部署和技术多样性,但须要付出的代价也是显而易见的——开发分布式系统的成本和运维开销。
而微服务架构可否成功实践,利用各类工具解决潜在问题是关键。把启动过程变得快速简单很重要,但通往生产环境的旅程是漫长的,你须要不断进步才能成功。

上图是须要在微服务架构中最多见的技术要点(在这里,咱们不涉及那些非技术要点,好比组织结构、公司文化等等)
Spring Cloud
和Kubernetes
有很大的不一样,并无直接可比的特性,若是对照微服务架构的要点,能够得出以下的技术对比图表:

从上表咱们能够得知:
Spring Cloud
有一套丰富且集成良好的JAVA
库,做为应用栈的一部分解决全部运行时问题。所以,微服务自己能够经过库和运行时代理解决客户端服务发现、负载均衡、配置更新、统计跟踪等。工做模式就像单实例服务集群
(译者注:集群中master节点工做,当master挂掉后,slave节点被选举顶替。)而且一批工做也是在JVM中被管理。
Kubernetes
是多语言的,不只仅针对Java
平台,而是以通用的方式为全部语言解决分布式计算问题。Kubernetes
提供了配置管理、服务发现、负载均衡、跟踪、统计、单实例、平台级和应用栈以外的调度工做。该应用不须要任何客户端逻辑的库或代理程序,能够用任何语言编写。
两个平台依靠类似的第三方工具,如ELK
和EFK stacks, tracing libraries
等。Hystrix
和Spring Boot
等库,在两个环境中都表现良好。不少状况下,Spring Cloud
和Kubernetes
能够造成互补,组建出更强大的解决方案(例如KubeFlix和Spring Cloud Kubernetes)。
想要进一步理解Spring Cloud
和Kubernetes
的适用范围,能够参考下图微服务架构需求。

有些需求,Spring Cloud
表现更好,有需求则是Kubernetes
,也有些需求,二者能够用不一样的方式知足。好消息是,Spring Cloud
和Kubernetes
在使用上并不冲突。例如,Spring Cloud
提供Maven
插件来建立单独JAR应用程序包。结合Docker、Kubernetes
的声明式部署和调度能力,轻松运行微服务。一样,Sring Cloud
以应用程序内的包装库的形式来支持弹性伸缩,微服务容错使用Hystrix
(bulkhead
和断路器模式)与Ribbon
(负载均衡)。但这些是不够的,当组合Kubernetes
健康检查、程序重启和自动伸缩能力,微服务才真正变成一个强壮的系统。
Spring Cloud
Spring Cloud
为开发者提供了快速构建分布式系统中的一些常见模式的工具,例如配置管理,服务发现,断路器,路由等。它是为Java开发人员使用,构建在Netflix OSS
库之上的。
优势
Spring Platform
提供的统一编程模型和Spring Boot
的快速应用程序建立能力,为开发人员提供了很好的微服务开发体验。使用不多的注解,就能够建立一个配置服务器或得到客户端库来配置您的服务。
丰富的库支持,覆盖大多数运行时需求。Spring Cloud
的全部库均由JAVA
编写,提供多特性、高控制和易配置。
不一样的Spring Cloud
库彼此彻底兼容。例如,Feign
客户端还将使用Hystrix
用于断路器、Ribbon
用于负载均衡请求。一切都是注解驱动的,易于Java
开发者开发。
缺点
仅使用JAVA
,既是Spring Cloud
的优势,也是一大缺陷。微服务架构之因此吸引人,在于按需交换各类技术栈、库,甚至语言的能力。这一点,Spring Cloud
作不到。若是你想使用Spring Cloud/Netflix OSS
基础设置服务,例如配置管理、服务发现或者负载均衡,解决方案是不优雅的。虽然Netflix Prana
项目实现了sidecar
模式,显示基于Java
客户类库越过HTTP
,使得用non-JVM
语言编写的应用程序存在于NetflixOSS
生态系统变得可能,但它仍然不是很优雅。
除了JAVA
应用程序,还有太多与开发无关的事情须要Java
开发人员处理。每一个微服务须要运行各类客户端以进行配置检索、服务发现和负载均衡。虽然很容易设置,但这并不会下降对环境的构建时间和运行的依赖性。例如,开发人员可使用@EnableConfigServer
建立一个配置服务器,但这只是开心的假象。每当开发人员想要运行单个微服务时,他们须要启动并运行Config Server
。对于受控环境,开发人员必须考虑使Config Server
高度可用,而且因为它能够由Git
或SVN
支持,所以它们须要一个共享文件系统。一样,对于服务发现,开发人员也是须要首先启动Eureka
服务器。为了建立一个受控的环境,他们须要在每一个AZ上使用多个实例实现集群。能够说,开发人员除了实现全部功能外,还须要额外管理一个复杂的微服务平台。
Spring Cloud
目前在微服务方面覆盖的面相对有限,开发人员还须要考虑自动化部署、调度、资源管理、过程隔离、自我修复、构建流水线等,以得到完整的微服务体验。对于这点,我认为拿Spring Cloud
和Kubernetes
比较是不公平的,应该比较Spring Cloud + Cloud Foundry (or Docker Swarm)
和Kubernetes
。但这也意味着对于一个完整的端到端微服务体验,Spring Cloud
必须补充一个像Kubernetes
这样的应用程序平台。
Kubernetes
Kubernetes
是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。支持多种语言而且提供用于支持、运行、扩展和管理分布式系统的操做系统。
优势
Kubernetes
是多语言且语言不敏感的容器管理平台,可以运行云原生和传统的容器化应用程序。Kubernetes
提供的服务(如配置管理、服务发现、负载均衡、测试指标收集和日志聚合)可供各类语言使用。这意味着一个平台能够被多个团队(包括使用Spring
的Java
开发人员)使用,并提供多种用途:应用程序开发、测试环境、构建环境(源码运行、构建服务、依赖仓库)等。
与Spring Cloud
相比,Kubernetes
解决了更广的微服务架构问题。除了提供运行时服务,Kubernetes
也可让你制定环境、设置资源限制、RBAC、管理应用程序生命周期、容许自动扩容和自我修复(几乎表现得像一个抗脆弱平台)。
Kubernetes
技术基于Google
十五年的研发和容器管理经验。此外,Kubernetes
有近1000个贡献者,是Github
上最活跃的开源社区之一。
缺点
Kubernetes
是多语言的,所以它的服务是通用的,并不针对不一样的平台(如Spring Cloud for JVM
)进行优化。例如,配置会做为环境变量传递给应用程序或挂载的文件系统。它没有像Spring Cloud Config
提供的配置更新功能。
Kubernetes
不是一个以开发者为中心的平台,更偏向于DevOps
的IT人员使用。所以,Java
开发人员须要学习一些新的概念,须要学习解决问题的新方法。尽管经过MiniKuber
开始一个Kubernetes
开发实例很简单,但手动安装一个高可用的Kubernetes
集群仍显得有些复杂。
Kubernetes
是一个相对较新的平台(2岁),仍然在发展和成长,每一个版本都添加了不少新功能,可能很难跟上。好消息是,这一点已经被考虑到了,Kubernetes
的API
将是可扩展和向后兼容的。
如你所见,Spring Cloud
和Kubernetes
在核心领域都很强,而且正在其余领域努力改进。Spring Cloud
能够快速使用,对开发者比较友好;而Kubernetes
是DevOps
的绝配,虽然学起来可能有点难,可是覆盖了更普遍的微服务技术要点。

Spring Cloud
和Kubernetes
处理了不一样范围的微服务架构技术点,并且是用了不一样的方法。Spring Cloud
方法是试图解决在JVM
中的微服务架构要点,而Kubernetes
方法是试图让问题消失,为开发者在平台层解决。Spring Cloud
在JVM
中很是强大,Kubernetes
管理那些JVM
很强大。看起来各取所长,充分利用这二者的优点是天然而然的趋势了。

结合使用Spring Cloud
和Kubernetes
,用Spring Cloud
提供应用程序打包,Docker
和Kubernetes
提供部署和调度;Spring
经过Hystrix
线程池提供应用程序内隔离,Kubernetes
经过资源、进程和命名空间隔离;Spring
为每一个微服务提供健康终端,Kubernetes
执行健康检查而且为健康服务的通讯提供路由;Spring
外部化且升级配置,Kubernetes
给每一个微服务分配配置......这样的例子还有不少。
做者:Bilgin Ibryam 原文:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes 搬运:好雨科技 为方便阅读原文略有删改