部署微服务的时候,Spring Cloud 和 Kubernetes 哪个更好?

【编者的话】本文比较了当下最火热的两大微服务开发平台:Spring Cloud和Kubernetes的优缺点,并指出结合二者的优点来组合使用,将在微服务旅程上获得更大成功。

当我们需要部署微服务的时候,哪个更好?Spring Cloud还是Kubernetes?答案是都可以,只是各自有其优势。

Spring Cloud 和 Kubernetes 都宣称自己是开发和运行微服务的最佳环境,但是它们的本质非常不一样,所追求的目标也不同。本文我们分析一下两个平台是如何在其擅长的、实现基于微服务的架构(MSA)上起到作用的,并判断如何利用两者的强项,来帮助我们在微服务旅程上获得成功。

背景故事

最近我读了A. Lukyanchikov写的一篇非常精彩的文章,讲的是用Spring Cloud和Docker来构建微服务架构。如果你还没读过,你应该读一下,因为它给出了一个关于如何利用Spring Cloud来创建一个简单的基于微服务的系统的综合视角。为了构建一个能扩展到数千个服务的可扩展且有弹性的微服务系统,它就必须有一套拥有广泛的构建时和运行时能力的工具集来帮助管理和控制。使用Spring Cloud,既能实现功能型服务(比如统计服务,账号服务以及通知服务),又能实现基础架构服务(比如日志分析,配置服务器,服务发现,认证服务等)。描述这样一个使用Spring Cloud构造的微服务架构(MSA)图如下所示:

365c0d94-eefa-11e5-90ad-9d74804ca412-2.png


MSA with Spring Cloud (by A. Lukyanchikov)

该图包含了运行时视角,但是它不包含打包,持续集成,扩展性,高可用,自愈等在MSA世界中同样重要的功能。本文假设大部分Java开发者都熟悉Spring Cloud,我们来做个对比,看看Kubernetes是如何提出这些额外的概念,以关联到Spring Cloud的。

微服务概念

我们不会针对两者一个一个概念的比对,而是根据更广阔的微服务概念,来看看Spring Cloud和Kubernetes分别是如何实现他们的。今天有关MSA的一个好事是,它是一个有着易于理解的优缺点评估的架构风格。微服务能加强模块边界,各模块可以有独立的部署和技术差异。但是同时也带来了代价,需要开发分布式系统以及明显增加操作成本。一个关键的成功因素是聚焦于使用一套能帮助你实现尽可能多的MSA概念的工具。能使得启动过程迅速且容易是很重要的,但是通向产品化的旅程是很漫长的,你需要达到这样的高度才能到达那里。

Screen_Shot_2016-12-03_at_09.32_.38_.png


Microservices concerns

如上图所示,我们可以看到MSA中必须实现的那些最普遍的技术概念(我们将不会关注非技术概念,比如组织结构,文化等)。

技术匹配

Sping Cloud和Kubernetes这两个平台非常不一样,并且它们之间也没有直接的等价特性。如果我们将每个MSA概念匹配到这两个平台使用的实现这些概念的技术/项目,我们能得出下表。

Screen_Shot_2016-11-30_at_08.45_.11_.png


Spring Cloud and Kubernetes technologies

从上表中能快速得出的结论是:

  • Spring Cloud有一个丰富的集合,完备整合了Java库,以实现各种运行时概念,作为应用栈的一部分。因此,这些微服务自身有库和运行时代理,来做客户端的服务发现,负载均衡,配置更新,度量跟踪等。各种模式,比如单集群服务和批量任务,也是由JVM来管理的。
  • Kubernetes兼容多种语言,目标不止Java平台,并且以一种通用方式为所有语言实现了分布式的计算挑战。它提供了平台级以及应用栈之外的服务,比如配置管理,服务发现,负载均衡,追踪,度量,单例,调度任务。应用不需要任何库或者代理来实现客户端逻辑,且可用任何语言来写。
  • 在某些领域,两个平台都依赖相似的第三方工具。比如,ELK和EFK栈,追踪库等。某些库,比如Hystric和Spring Boot,在两个环境上都非常有用。有些领域两个平台是互补的,整合到一起能创造出一个更强大的解决方案(KubeFlixSpring Cloud Kubernetes 就是这样的例子)。

 

微服务需求

为了画出每个项目的范围,这里有张表列出了几乎是端到端的MSA需求,从最底层的硬件,到最上层的DevOps和自服务经验,并且列出了如何关联到Spring Cloud和Kubernetes平台。

Screen_Shot_2016-12-03_at_14.09_.41_.png


Microservices requirements

在某些场景下,两个项目使用不同的方法达成了相同的需求,在某些领域,一个项目可能会强于另一个。但是在某些情况下,两个项目是互补的,可以组合起来达成高级的微服务经验。例如,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 项目实现了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 是一个针对容器应用的自动化部署,伸缩和管理的开源系统。它兼容多种语言且提供了创建,运行,伸缩以及管理分布式系统的原语。

优势

  • Kubernetes是语言不感知的容器管理平台,能兼容运行原生云应用和传统的容器化应用。它提供的服务,比如配置管理,服务发现,负载均衡,度量收集,以及日志聚合,能被各种语言使用。这使得组织可以只提供一个平台供多个项目组使用(包括使用Spring的Java开发者),并且提供多种目的:应用开发,测试环境,构建环境(运行资源控制系统,构建服务器,人工仓库)等。
  • 和Spring Cloud相比,Kubernetes实现了更广阔的MSA概念集合。除了提供运行时服务,Kubernetes也允许我们提供环境变量,设置资源限制,RBAC,管理应用生命周期,使能自动伸缩和自愈(表现为就像一个反脆弱平台)。
  • 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友好的,有着陡峭的学习曲线,但是包含了更广泛的微服务概念。这里是针对这几点的总结。

Screen_Shot_2016-12-03_at_15.45_.54_.png


Strengths and weaknesses

两个框架实现了不同范围的MSA概念,使用的是从根源上就有区别的方式。Spring Cloud方式是尽力在JVM范畴内来解决每个MSA的挑战,而Kubernetes的方式是尽力为开发者在平台层面消除这些问题。Spring Cloud在JVM内非常强大,Kubernetes在管理这些JVM上非常强大。因此,整合这两者取它们的最佳部分,是一个很自然的进步过程。

spring_cloud_and_kubernetes_mixed_-_Page_1(1).png


Spring Cloud backed by Kubernetes

有了这样一个整合,Spring提供应用的打包,Docker和Kubernetes提供部署和调度。Spring通过Hystrix线程池提供应用内的隔离,而Kubernetes通过资源,进程和命名空间来提供隔离。Spring为每个微服务提供健康终端,而Kubernetes执行健康检查,且把流量导到健康服务。Spring外部化配置并更新它们,而Kubernetes分发配置到每个微服务。这个列表将一直持续。

stack_-_Page_1.png


My favorite microservices stack

我最喜欢的微服务平台是哪个?我两个都喜欢。我喜欢Spring 框架提供的开发者经验。它是标签驱动的,并且拥有包含了各种功能需求的库。跟任何整合相关的,我喜欢Apache Camel(而不是Spring Integration),它能提供应用级别的连接器,消息,路由,可靠性和容错功能。而对跟集群和管理多应用实例相关的,我更喜欢魔法般的Kubernetes能力。不论何时,有重复功能,比如服务发现,负载均衡,配置管理,我尽量使用Kubernetes提供的跟语言无关的原语。

原文链接:Deploying Microservices: Spring Cloud vs. Kubernetes(翻译:池剑锋)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微服务是什么?微服务是用于构建应用程序的架构风格,一个大的系统可由一个或者多个微服务组成,微服务架构可将应用拆分成多个核心功能,每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作和出现故障的时候不会相互影响。为什么要用微服务?单体架构下的所有代码模块都耦合在一起,代码量大,维护困难,想要更新一个模块的代码,也可能会影响其他模块,不能很好的定制化代码。微服务中可以有java编写、有Python编写的,他们都是靠restful架构风格统一成一个系统的,所以微服务本身与具体技术无关、扩展性强。大型电商平台微服务功能图为什么要将SpringCloud项目部署到k8s平台?SpringCloud只能用在SpringBoot的java环境中,而kubernetes可以适用于任何开发语言,只要能被放进docker的应用,都可以在kubernetes上运行,而且更轻量,更简单。SpringCloud很多功能都跟kubernetes重合,比如服务发现,负载均衡,配置管理,所以如果把SpringCloud部署到k8s,那么很多功能可以直接使用k8s原生的,减少复杂度。Kubernetes作为成熟的容器编排工具,在国内外很多公司、世界500强等企业已经落地使用,很多中小型公司也开始把业务迁移到kubernetes中。kubernetes已经成为互联网行业急需的人才,很多企业都开始引进kubernetes技术人员,实现其内部的自动化容器云平台的建设。对于开发、测试、运维、架构师等技术人员来说k8s已经成为的一项重要的技能,下面列举了国内外在生产环境使用kubernetes的公司: 国内在用k8s的公司:阿里巴巴、百度、腾讯、京东、360、新浪、头条、知乎、华为、小米、富士康、移动、银行、电网、阿里云、青云、时速云、腾讯、优酷、抖音、快手、美团等国外在用k8s的公司:谷歌、IBM、丰田、iphone、微软、redhat等整个K8S体系涉及到的技术众多,包括存储、网络、安全、监控、日志、DevOps、微服务等,很多刚接触K8S的初学者,都会感到无从下手,为了能让大家系统地学习,克服这些技术难点,推出了这套K8S架构师课程。Kubernetes的发展前景 kubernetes作为炙手可热的技术,已经成为云计算领域获取高薪要掌握的重要技能,在招聘网站搜索k8s,薪资水平也非常可观,为了让大家能够了解k8s目前的薪资分布情况,下面列举一些K8S的招聘截图: 讲师介绍:  先超容器云架构师、IT技术架构师、DevOps工程师,曾就职于世界500强上市公司,拥有多年一线运维经验,主导过上亿流量的pv项目的架构设计和运维工作;具有丰富的在线教育经验,对课程一直在改进和提高、不断的更新和完善、开发更多的企业实战项目。所教学员遍布京东、阿里、百度、电网等大型企业和上市公司。课程学习计划 学习方式:视频录播+视频回放+全套源码笔记 教学服务:模拟面试、就业指导、岗位内推、一对一答疑、远程指导 VIP终身服务:一次购买,终身学习课程亮点:1. 学习方式灵活,不占用工作时间:可在电脑、手机观看,随时可以学习,不占用上班时间2.老师答疑及时:老师24小时在线答疑3. 知识点覆盖全、课程质量高4. 精益求精、不断改进根据学员要求、随时更新课程内容5. 适合范围广,不管你是0基础,还是拥有工作经验均可学习:0基础1-3年工作经验3-5年工作经验5年以上工作经验运维、开发、测试、产品、前端、架构师其他行业转行做技术人员均可学习课程部分项目截图   课程大纲 k8s+SpringCloud全栈技术:基于世界500强的企业实战课程-大纲第一章 开班仪式老师自我介绍、课程大纲介绍、行业背景、发展趋势、市场行情、课程优势、薪资水平、给大家的职业规划、课程学习计划、岗位内推第二章 kubernetes介绍Kubernetes简介kubernetes起源和发展kubernetes优点kubernetes功能kubernetes应用领域:在大数据、5G、区块链、DevOps、AI等领域的应用第三章  kubernetes中的资源对象最小调度单元Pod标签Label和标签选择器控制器Replicaset、Deployment、Statefulset、Daemonset等四层负载均衡器Service第四章 kubernetes架构和组件熟悉谷歌的Borg架构kubernetes单master节点架构kubernetes多master节点高可用架构kubernetes多层架构设计原理kubernetes API介绍master(控制)节点组件:apiserver、scheduler、controller-manager、etcdnode(工作)节点组件:kube-proxy、coredns、calico附加组件:prometheus、dashboard、metrics-server、efk、HPA、VPA、Descheduler、Flannel、cAdvisor、Ingress     Controller。第五章 部署多master节点的K8S高可用集群(kubeadm)第六章 带你体验kubernetes可视化界面dashboard在kubernetes部署dashboard通过token令牌登陆dashboard通过kubeconfig登陆dashboard限制dashboard的用户权限在dashboard界面部署Web服务在dashboard界面部署redis服务第七章 资源清单YAML文件编写技巧编写YAML文件常用字段,YAML文件编写技巧,kubectl explain查看帮助命令,手把手教你创建一个Pod的YAML文件第八章 通过资源清单YAML文件部署tomcat站点编写tomcat的资源清单YAML文件、创建service发布应用、通过HTTP、HTTPS访问tomcat第九章  kubernetes Ingress发布服务Ingress和Ingress Controller概述Ingress和Servcie关系安装Nginx Ingress Controller安装Traefik Ingress Controller使用Ingress发布k8s服务Ingress代理HTTP/HTTPS服务Ingress实现应用的灰度发布-可按百分比、按流量分发第十章 私有镜像仓库Harbor安装和配置Harbor简介安装HarborHarbor UI界面使用上传镜像到Harbor仓库从Harbor仓库下载镜像第十一章 微服务概述什么是微服务?为什么要用微服务微服务的特性什么样的项目适合微服务?使用微服务需要考虑的问题常见的微服务框架常见的微服务框架对比分析第十二章 SpringCloud概述SpringCloud是什么?SpringCloudSpringBoot什么关系?SpringCloud微服务框架的优缺点SpringCloud项目部署到k8s的流程第十三章 SpringCloud组件介绍服务注册与发现组件Eureka客户端负载均衡组件Ribbon服务网关Zuul熔断器HystrixAPI网关SpringCloud Gateway配置中心SpringCloud Config第十四章 将SpringCloud项目部署到k8s平台的注意事项如何进行服务发现?如何进行配置管理?如何进行负载均衡?如何对外发布服务?k8s部署SpringCloud项目的整体流程第十五章 部署MySQL数据库MySQL简介MySQL特点安装部署MySQL在MySQL数据库导入数据对MySQL数据库授权第十六章 将SpringCLoud项目部署到k8s平台SpringCloud微服务电商框架安装openjdk和maven修改源代码、更改数据库连接地址通过Maven编译、构建、打包源代码在k8s中部署Eureka组件在k8s中部署Gateway组件在k8s中部署前端服务在k8s中部署订单服务在k8s中部署产品服务在k8s中部署库存服务第十七章 微服务的扩容和缩容第十八章 微服务的全链路监控什么是全链路监控?为什么要进行全链路监控?全链路监控能解决哪些问题?常见的全链路监控工具:zipkin、skywalking、pinpoint全链路监控工具对比分析第十九章 部署pinpoint服务部署pinpoint部署pinpoint agent在k8s中重新部署带pinpoint agent的产品服务在k8s中重新部署带pinpoint agent的订单服务在k8s中重新部署带pinpoint agent的库存服务在k8s中重新部署带pinpoint agent的前端服务在k8s中重新部署带pinpoint agent的网关和eureka服务Pinpoint UI界面使用第二十章 基于Jenkins+k8s+harbor等构建企业级DevOps平台第二十一章 基于Promethues+Alert+Grafana搭建企业级监控系统第二十二章 部署智能化日志收集系统EFK 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值