部署微服务:Spring Cloud vs. Kubernetes

##部署微服务:Spring Cloud vs. Kubernetesgit

Spring Cloud vs. Kubernetes,谁才是部署微服务的最佳拍档?github

Spring Cloud和Kubernetes都声称本身是开发和运行微服务的最佳环境,但二者在特性上并不相同,解决的问题点也不同。本文将探讨这两种平台对于微服务架构的交付有何做用、二者在哪些方面表现更好以及如何利用这两种平台在微服务架构的路上取得成功。spring

背景故事

我最近拜读了 A.Lukyanchikov关于如何利用Spring CloudDocker搭建微服务的文章,推荐你们也看一看。编程

想要搭建一个能够十倍、百倍扩展服务的弹性伸缩微服务系统,须要借助具备宽泛构建时间和运行时能力的工具集进行集中的管理和治理。服务器

Spring Cloud包括了各类功能性服务(如统计服务,账户服务和通知服务)和支持基础设施服务(如日志分析,配置服务器,服务发现,受权服务)。架构

下图展现使用Spring Cloud的微服务架构:负载均衡

![](http://7xihe6.com1.z0.glb.clouddn.com/MSA with Spring Cloud -by A. Lukyanchikov-.png)运维

Spring Cloud微服务架构,by A. Lukyanchikov)分布式

该图展现了运行时的方方面面,但没有包括打包、持续集成、伸缩、高可用和自我修复等在微服务架构中重要点。本文假设大多数JAVA开发者熟悉Spring Cloud,采用类比的形式,经过解决以上要点问题,带你们了解KubernetesSpring Cloud之间的关系。ide

微服务要点

咱们在此不进行特性的逐个对比,而是从大面上看一看微服务的要点并聊一聊Spring CloudKubernetes如何实现。

微服务架构的一大优点是易于理解的架构风格,可实现强大的模块边界,而且具备独立的部署和技术多样性,但须要付出的代价也是显而易见的——开发分布式系统的成本和运维开销。

而微服务架构可否成功实践,利用各类工具解决潜在问题是关键。把启动过程变得快速简单很重要,但通往生产环境的旅程是漫长的,你须要不断进步才能成功。

![](http://7xihe6.com1.z0.glb.clouddn.com/Microservices concerns .png)

上图是须要在微服务架构中最多见的技术要点(在这里,咱们不涉及那些非技术要点,好比组织结构、公司文化等等)

技术对比

Spring CloudKubernetes有很大的不一样,并无直接可比的特性,若是对照微服务架构的要点,能够得出以下的技术对比图表:

![](http://7xihe6.com1.z0.glb.clouddn.com/Spring Cloud and Kubernetes technologies .png)

从上表咱们能够得知:

  • Spring Cloud有一套丰富且集成良好的JAVA库,做为应用栈的一部分解决全部运行时问题。所以,微服务自己能够经过库和运行时代理解决客户端服务发现、负载均衡、配置更新、统计跟踪等。工做模式就像单实例服务集群译者注:集群中master节点工做,当master挂掉后,slave节点被选举顶替。)而且一批工做也是在JVM中被管理。

  • Kubernetes是多语言的,不只仅针对Java平台,而是以通用的方式为全部语言解决分布式计算问题。Kubernetes提供了配置管理、服务发现、负载均衡、跟踪、统计、单实例、平台级和应用栈以外的调度工做。该应用不须要任何客户端逻辑的库或代理程序,能够用任何语言编写。

  • 两个平台依靠类似的第三方工具,如ELKEFK stacks, tracing libraries等。HystrixSpring Boot等库,在两个环境中都表现良好。不少状况下,Spring CloudKubernetes能够造成互补,组建出更强大的解决方案(例如KubeFlixSpring Cloud Kubernetes)。

微服务需求

想要进一步理解Spring CloudKubernetes的适用范围,能够参考下图微服务架构需求。

![](http://7xihe6.com1.z0.glb.clouddn.com/Microservices requirements .png)

有些需求,Spring Cloud表现更好,有需求则是Kubernetes,也有些需求,二者能够用不一样的方式知足。好消息是,Spring CloudKubernetes在使用上并不冲突。例如,Spring Cloud提供Maven插件来建立单独JAR应用程序包。结合Docker、Kubernetes的声明式部署和调度能力,轻松运行微服务。一样,Sring Cloud以应用程序内的包装库的形式来支持弹性伸缩,微服务容错使用Hystrixbulkhead和断路器模式)与Ribbon(负载均衡)。但这些是不够的,当组合Kubernetes健康检查、程序重启和自动伸缩能力,微服务才真正变成一个强壮的系统。

优缺点

Spring Cloud

Spring Cloud为开发者提供了快速构建分布式系统中的一些常见模式的工具,例如配置管理,服务发现,断路器,路由等。它是为Java开发人员使用,构建在Netflix OSS库之上的。

优势

  1. Spring Platform提供的统一编程模型和Spring Boot的快速应用程序建立能力,为开发人员提供了很好的微服务开发体验。使用不多的注解,就能够建立一个配置服务器或得到客户端库来配置您的服务。

  2. 丰富的库支持,覆盖大多数运行时需求。Spring Cloud的全部库均由JAVA编写,提供多特性、高控制和易配置。

  3. 不一样的Spring Cloud库彼此彻底兼容。例如,Feign客户端还将使用Hystrix用于断路器、Ribbon用于负载均衡请求。一切都是注解驱动的,易于Java开发者开发。

缺点

  1. 仅使用JAVA,既是Spring Cloud的优势,也是一大缺陷。微服务架构之因此吸引人,在于按需交换各类技术栈、库,甚至语言的能力。这一点,Spring Cloud作不到。若是你想使用Spring Cloud/Netflix OSS基础设置服务,例如配置管理、服务发现或者负载均衡,解决方案是不优雅的。虽然Netflix Prana项目实现了sidecar模式,显示基于Java客户类库越过HTTP,使得用non-JVM语言编写的应用程序存在于NetflixOSS生态系统变得可能,但它仍然不是很优雅。

  2. 除了JAVA应用程序,还有太多与开发无关的事情须要Java开发人员处理。每一个微服务须要运行各类客户端以进行配置检索、服务发现和负载均衡。虽然很容易设置,但这并不会下降对环境的构建时间和运行的依赖性。例如,开发人员可使用@EnableConfigServer建立一个配置服务器,但这只是开心的假象。每当开发人员想要运行单个微服务时,他们须要启动并运行Config Server。对于受控环境,开发人员必须考虑使Config Server高度可用,而且因为它能够由GitSVN支持,所以它们须要一个共享文件系统。一样,对于服务发现,开发人员也是须要首先启动Eureka服务器。为了建立一个受控的环境,他们须要在每一个AZ上使用多个实例实现集群。能够说,开发人员除了实现全部功能外,还须要额外管理一个复杂的微服务平台。

  3. Spring Cloud目前在微服务方面覆盖的面相对有限,开发人员还须要考虑自动化部署、调度、资源管理、过程隔离、自我修复、构建流水线等,以得到完整的微服务体验。对于这点,我认为拿Spring CloudKubernetes比较是不公平的,应该比较Spring Cloud + Cloud Foundry (or Docker Swarm)Kubernetes。但这也意味着对于一个完整的端到端微服务体验,Spring Cloud必须补充一个像Kubernetes这样的应用程序平台。

Kubernetes

Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。支持多种语言而且提供用于支持、运行、扩展和管理分布式系统的操做系统。

优势

  1. Kubernetes是多语言且语言不敏感的容器管理平台,可以运行云原生和传统的容器化应用程序。Kubernetes提供的服务(如配置管理、服务发现、负载均衡、测试指标收集和日志聚合)可供各类语言使用。这意味着一个平台能够被多个团队(包括使用SpringJava开发人员)使用,并提供多种用途:应​​用程序开发、测试环境、构建环境(源码运行、构建服务、依赖仓库)等。

  2. Spring Cloud相比,Kubernetes解决了更广的微服务架构问题。除了提供运行时服务,Kubernetes也可让你制定环境、设置资源限制、RBAC、管理应用程序生命周期、容许自动扩容和自我修复(几乎表现得像一个抗脆弱平台)。

  3. Kubernetes技术基于Google十五年的研发和容器管理经验。此外,Kubernetes有近1000个贡献者,是Github上最活跃的开源社区之一。

缺点

  1. Kubernetes是多语言的,所以它的服务是通用的,并不针对不一样的平台(如Spring Cloud for JVM)进行优化。例如,配置会做为环境变量传递给应用程序或挂载的文件系统。它没有像Spring Cloud Config提供的配置更新功能。

  2. Kubernetes不是一个以开发者为中心的平台,更偏向于DevOps的IT人员使用。所以,Java开发人员须要学习一些新的概念,须要学习解决问题的新方法。尽管经过MiniKuber开始一个Kubernetes开发实例很简单,但手动安装一个高可用的Kubernetes集群仍显得有些复杂。

  3. Kubernetes是一个相对较新的平台(2岁),仍然在发展和成长,每一个版本都添加了不少新功能,可能很难跟上。好消息是,这一点已经被考虑到了,KubernetesAPI将是可扩展和向后兼容的。

Spring Cloud和Kubernetes的最佳实践

如你所见,Spring CloudKubernetes在核心领域都很强,而且正在其余领域努力改进。Spring Cloud能够快速使用,对开发者比较友好;而KubernetesDevOps的绝配,虽然学起来可能有点难,可是覆盖了更普遍的微服务技术要点。

![](http://7xihe6.com1.z0.glb.clouddn.com/Strengths and weaknesses.png)

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

![](http://7xihe6.com1.z0.glb.clouddn.com/Spring Cloud backed by Kubernetes .png)

结合使用Spring CloudKubernetes,用Spring Cloud提供应用程序打包,DockerKubernetes提供部署和调度;Spring经过Hystrix线程池提供应用程序内隔离,Kubernetes经过资源、进程和命名空间隔离;Spring为每一个微服务提供健康终端,Kubernetes执行健康检查而且为健康服务的通讯提供路由;Spring外部化且升级配置,Kubernetes给每一个微服务分配配置......这样的例子还有不少。

做者:Bilgin Ibryam 原文:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes 搬运:好雨科技 为方便阅读原文略有删改

相关文章
相关标签/搜索