云原生时代,微服务到底应该怎么玩儿?

在微服务诞生之初,并没有太多方案的选择:选一个注册中心用来做服务注册和发现,通过客户端SDK进行负载均衡和容错,再搭配上日志、监控、调用链全套观测手段,一套微服务架构便建立起来了。

作为最流行的业务开发语言,Java体系里诞生了很多微服务架构,例如Spring Cloud。使用Spring Cloud,Spring技术栈的开发人员可以快速的开发和管理微服务,丰富的功能让其他语言体系的开发者们羡慕不已。

在云原生时代,Kubernetes快速普及,除了解决微服务所需要的应用编排、伸缩、保活等功能外,Kubernetes里本身还带了服务发现、配置管理、负载均衡和网关。既然这样,那么是否就可以不再注重注册中心和服务治理框架,只基于Kubernetes构建微服务系统呢?

很多公司进行了这方面的尝试,尝试后发现从治理功能丰富度、大规模集群效率等方面,还是有不太满意的地方。于是,后来又诞生了治理功能更为丰富的服务网格架构,让Kubernetes的服务治理能力极大增强,这些项目很快便得到了大范围的关注,例如Istio。

那么,在云原生时代,我们的微服务体系到底应该怎么建设和维护呢?

Kubernetes良好的应用编排能力,使其成为微服务部署、伸缩、管理的最佳工具。假如是为新增业务做技术选型,建议都直接使用Kubernetes和容器来部署和管理应用,而不是还使用物理服务器或者虚拟机。而关于服务治理,目前会有如下选择:

只使用Kubernetes:

Kubernetes里本身具备服务发现、配置管理、负载均衡和网关,这使得看起来只使用Kubernetes就可以把微服务系统搭建起来。不过,这种方式存在问题。例如:

  • 流量治理能力不足——缺乏熔断能力,没有灰度控制能力;
  • 大规模使用时的性能问题——基于Kubernetes Service的服务发现过程需要经过Iptables或IPVS的查找过程,集群规模大时性能影响会比较明显。

另外,很多观测功能也都需要一定的代码集成才可以发挥作用。

使用Kubernetes部署+Spring Cloud(或Dubbo等)服务治理:

这种方式是笔者认为目前最成熟的一种方式,可以充分利用Kubernetes和Spring Cloud(或Dubbo等)自身的优点。这种方式性能好、功能完备,也已经有大量稳定的线上案例。不过这里面也会涉及到一个问题:语言和框架的依赖——Java以外的其他语言都缺乏完备的服务治理框架。

使用Kubernetes部署+Istio(或Linkerd等)服务治理:

服务网格是这两年赢得最多关注的方式,彻底把业务和服务治理逻辑切分开。这种方式没有语言和框架依赖,应用不用修改代码逻辑,只要接入网格就可以使用网格提供的全套流量管理、策略管理、观测能力和安全能力。京东云内部已经有上百个线上服务运行在服务网格里,利用网格技术减少了这些服务接入安全、观测、流量管理等功能的接入成本,通过此过程也积累了很多优化和运维经验。不过,网格架构的复杂性,和经过两层网络代理引入的延迟,仍然是不可回避的问题。

下面让我们再详细看一下后两种方式。

Kubernetes部署+Spring Cloud服务治理

对于Java业务研发工程师而言,采用这种方式的感觉是Spring Cloud太“简单”了,而Kubernetes太“难”了。

Spring Cloud很“简单”。标准的Spring Boot开发方式,引入几个包,服务发现、负载均衡、熔断就都有了。业务研发工程师便开开心心拆分服务去了。等拆完服务真上线跑一段时间,才发现Spring Cloud太难了。监控线上系统是否存在异常这个工作,比之前监控单体服务复杂好几个量级。一旦线上有点问题,想查一查,都不知道该上哪个服务去查。调用链看起来很强大,用起来又不那么容易。还可能出现过这样的尴尬:老板听说上完了微服务:老板听说上完了微服务,问以后上线是不是可以像互联网公司那样灰度发布了,结果才发现Spring Cloud官方竟然没提供这个能力。

Kubernetes很“难”。一堆概念,什么Pod、CNI、Replication Controller、Persistent Volume…而且,随便搞个事情都需要写一长串yaml,各种事情还都用命令行操作。但实际上,Kubernetes使应用交付大大简化了。以前最复杂的服务依赖管理、弹性伸缩、故障恢复等能力,Kubernetes都提供了支持。而且是你只用声明你期望达到什么目标,Kubernetes就能自动帮你完成这背后的各种具体操作步骤。

因此,如果要采用这种方案,这里会有一些建议:

  • 先把整套部署、治理、观测系统建设完善之后再去做微服务拆分;
  • 利用专门的团队或者直接利用云服务完成整套系统的建设和运维;
  • 系统建设完善后,业务运维尽量交给业务研发自己进行。

为了使业务研发工程师能更容易地使用Kubernetes和Spring Cloud构建微服务系统。京东云微服务平台产品做了下面这些改进:

  • 一个平台,全界面操作,可以完成整套部署、治理、观测等线上运维工作;
  • 具备日志、监控、调用链、依赖图谱等全角度观测能力;
  • 屏蔽Kubernetes底层技术细节,托管注册中心、配置中心、调用链分析等后端服务,让研发工程师的关注点可以回归业务本身;
  • 扩展标准Spring Cloud能力,增加路由治理和服务鉴权功能,可以更精确的控制调用。

点击【阅读】可查看微服务平台上如何通过K8S管理Spring Cloud应用。

Kubernetes部署+Istio服务治理

对于业务研发工程师而言,如果Kubernetes已经很难,那么Istio就更难了。Istio的难主要体现在如下方面。

  • 概念复杂:又是很多新概念,Virtual Service、Destination Rule、Subset、Service Entry… …
  • 架构复杂:包含太多的系统组件,Pilot、Mixer、Galley、Security、Gateways、Kiali…
    …组件之间的关系又很复杂。
  • 保证稳定性困难:社区版本发布频率快,每个版本都有不少稳定性问题。如果线上出现问题,等下一版解决吧等不起,自己改吧又太复杂不知道该怎么改。

如果要采用服务网格方案,这里会有一些建议:

  • 先做完微服务化和容器化之后再考虑引入服务网格技术。不要因为网格没有架构依赖,想通过网格解决十几年前的大型单体应用的服务治理问题;
  • 利用专门的团队或者直接利用云服务完成整套系统的建设和运维;
  • 先从访问量不大的边缘系统尝试网格,延迟敏感的应用慎用网格。

为了使Istio服务网格技术能更容易落地,京东云的云服务网格产品做了如下改进:

  • 建立完备的测试系统,可以通过长时间实际业务的压测及时发现版本问题并及时优化和回归,保证Istio版本的稳定性。
  • 界面上可以通过几个简单配置后自动完成安装、升级等复杂操作。
  • 对Istio的复杂概念和使用过程进行了简化,可以更容易的使用网格的各种功能。

点击https://docs.jdcloud.com/cn/mesh/basic-example了解如何快速的建立服务网格系统并快速体验。

欢迎点击“京东云”了解更多精彩内容

原文地址:https://www.cnblogs.com/jdclouddeveloper/p/12142858.html

时间: 2024-08-30 06:59:38

云原生时代,微服务到底应该怎么玩儿?的相关文章

开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门

点击下载<Knative 云原生应用开发指南> 自 2018 年 Knative 项目开源后,就得到了广大开发者的密切关注.Knative 在 Kubernetes 之上提供了一套完整的应用 Serverless 编排服务,让应用开发者可以不用为底层的基础设施分心,把更多的精力投入到业务逻辑上. Knative 的一个很重要的目标就是制定云原生.跨平台的 Serverless 编排标准.它的优势在于: 基于 Kubernetes 实现 Serverless 编排: 基于 Istio 实现服务的

双11 背后的全链路可观测性:阿里巴巴鹰眼在“云原生时代”的全面升级

点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者: 周小帆(承嗣)? 阿里云中间件技术部高级技术专家 王华锋(水彧)??阿里云中间件技术部技术专家 徐彤(绍宽)??阿里云中间件技术部技术专家 夏明(涯海)??阿里云中间件技术部技术专家 导读:作为一支深耕多年链路追踪技术 (Tracing) 与性能管理服务 (APM) 的团队,阿里巴巴中间件鹰眼团队的工程师们见证了阿里巴巴基

架构师成长系列 | 云原生时代的 DevOps 之道

作者 | 郝树伟(花名:流生)??阿里云高级研发工程师 本文整理自架构师成长系列 2 月17 日直播课程. 关注"阿里巴巴云原生"公众号,回复?"217",即可获取对应直播回放链接及 PPT 下载链接. 导读:DevOps 是一种软件开发人员和 IT人员之间的合作过程,目标是高效地自动执行软件交付和基础架构更改流程.在云原生时代,企业又如何借助 DevOps 实现产品快速.稳定.高效和安全地迭代,释放业务价值呢? 什么是云原生 为了解决传统应用升级缓慢.架构臃肿.不

应用量化时代 | 微服务架构的服务治理之路

技术随业务而生,业务载技术而行. 近些年来,伴随数字经济的发展,在众多企业的数字化转型之路上,云原生.DevOps.微服务.服务治理等成为行业内不断被探讨的新话题.人们在理解和接受这些新型概念的同时,也不断地思考其可能的落地形态.需求是创造发生的原动力,于是一批代表性的开源技术或者框架涌现而出:Kubernetes,Spring Cloud,Service Mesh,Serverless-- 它们炙手可热,大放异彩.然而在具体落地过程中却步履维艰,磕磕绊绊. 本文试图结合企业业务的核心诉求,以应

华为云容器和微服务是什么?

近期华为云围绕容器和微服务,号召行业分析师,应用上云实践者围绕容器和微服务进行深入讨论. 华为云全栈容器与微服务,业务创新快人一步 敏捷.高效.智能是Cloud 2.0时代企业数字化转型核心诉求,华为云全栈容器和微服务全面拥抱云原生,提供全栈云原生应用开发与管理,包括容器.微服务框架.云中间件.压测.APM等系列产品,涵盖应用开发.编译.构建.部署.测试.发布.上线.运维等应用全生命周期管理,让客户更聚焦自己的业务.到目前为止,华为云容器和微服务产品广泛引用在金蝶云.同济大学.图灵生物.华为消费

进击的.NET 在云原生时代的蜕变

你一定看过这篇文章 <进击的 Java ,云原生时代的蜕变>,  本篇文章的灵感来自于这篇文章.北京时间9.24 就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Core. .NET 生态系统是一个不断变化的生态圈,我相信它正在朝着一个伟大的方向发展.正好 最近 InfoQ 上发布了一篇文章<.NET 生态系统概览>,有了开源和跨平台这两个关键优先事项,我们就可以放心了. 下面我们来参考文章<进击的 Java ,云原生时代的蜕变>对云原

.NET 在云原生时代的蜕变,让我在云时代脱颖而出

.NET 生态系统是一个不断变化的生态圈,我相信它正在朝着一个伟大的方向发展.有了开源和跨平台这两个关键优先事项,我们就可以放心了.云原生对应用运行时的不同需求,说明一个.NET Core 在云原生时代所完成的蜕变: 体积更小:对于微服务分布式架构而言,更小的体积意味着更少的下载带宽,更快的分发下载速度,.NET Core 的镜像体积都很小,alpine的镜像更小,带上应用程序通常80M. 启动速度更快:对于传统单体应用,启动速度与运行效率相比不是一个关键的指标.原因是,这些应用重启和发布频率相

【转】.NET 在云原生时代的蜕变,让我在云时代脱颖而出

原创:张善友 原文:https://www.cnblogs.com/shanyou/p/12198741.html .NET 生态系统是一个不断变化的生态圈,我相信它正在朝着一个伟大的方向发展.有了开源和跨平台这两个关键优先事项,我们就可以放心了.云原生对应用运行时的不同需求,说明一个.NET Core 在云原生时代所完成的蜕变: 体积更小:对于微服务分布式架构而言,更小的体积意味着更少的下载带宽,更快的分发下载速度,.NET Core 的镜像体积都很小,alpine的镜像更小,带上应用程序通常

云原生时代 来看看十年前李彦宏、马化腾和马云对云计算的评价

在容器.Kubernetes.DevOps,以及微服务等技术的推动下,2020年云原生势不可挡. .NET Core 也非常契合 云原生对应用运行时的不同需求,.NET Core和kubernetes 同年诞生发展, 2018年kubernetes 已经奠定了在容器编排领域的王者地位,2019年越来越多的企业选择基于云原生的技术或管理方法,把业务生于云或迁移到云平台,从而享受云的高效和持续的服务能力.几年前火热的Spring Cloud面临Kubernetes的革命,如今.NET Core在云原