当前位置: 首页 > news >正文

微服务的优点及在云原生时代的合理落地方式

云计算de小白

那么,微服务到底能给业务带来什么好处?在云原生时代,如何更合理地实现微服务?

架构没有好坏之分,只有适合与不适合。然而,当我们对比微服务架构与单体架构时,可以发现微服务有以下优势:

首先,微服务独立运行,以进程的方式进行隔离,可以有效控制故障范围,使架构更加可靠。

其次,微服务架构的整体可用性更高,因为故障被有效隔离,减少了单点故障对整个系统的影响。

而且微服务的粒度更小,架构演进的影响也更小,不需要大规模重构,只需要对个别微服务进行调整。

然后,可以以服务为粒度实现微服务架构,通过接口共享和重用,具有更高的可重用性。然后,可以以服务为粒度根据服务对资源的需求进行微服务架构的扩展,扩展性更加灵活。最后,服务拆分后,每个服务可以独立开发、测试、并行部署,大大提高交付效率,加快产品更新速度,提供更好的用户体验。

图片

图片

1. 团队调整

团队需要进行重组,以服务为核心,按照业务领域划分全功能团队,同时改变原有的研发流程和决策机制。比如要倡导敏捷文化,实现快速迭代,多做自动化测试,加强代码评审等工作。另外,微服务框架可以封装和抽象一些分布式场景下的通用能力(比如负载均衡、容错、远程通信等),方便开发者快速开发出高质量的服务。因此,在采用微服务之前,应该对微服务架构进行选择、学习和试用,让整个团队储备一定的微服务相关知识。

2.基础设施建设

基础设施即代码可以通过编程来管理虚拟机或容器,无需手动配置和更新每一台硬件,让基础设施变得弹性十足,实现快速、高效、准确的可重复操作。开发者可以使用同一套代码或配置来部署和管理大量物理机。

另外,当服务数量增多,交付频繁时,故障数量可能会大幅增加,因此需要构建完善的监控体系,及时发现故障并进行处理。当生产环境出现问题时,需要对故障进行分类,评估影响范围,然后分配给相应的负责人。

微服务架构的一大优势就是交付快,既体现在服务粒度更小,也体现在整体流程更快。因此需要构建基于自动化的工具链,以流水线交付的方式串联整个 DevOps 流程,这样小团队就可以基于服务独立开发、测试、部署、运维。这两点并不是采用微服务模式的必要充分条件,但如果能满足,微服务流程就会更加顺畅,后续的维护和迭代也会变得轻松而不是困难。

还有一点需要注意的是,微服务要随着业务的发展逐渐拆分。几乎所有成功的微服务架构都是从庞大的单体架构中拆分出来的,而几乎所有从头开始构建微服务架构的案例,在后来都遇到了很大的困难。面对新的业务和领域时,我们很难在一开始就把业务梳理得非常清楚,往往是经过一段时间、经过一些挫折之后,业务的内部架构才逐渐清晰起来。从现有的模块清晰的单体架构中逐渐划分服务,比从头构建微服务要简单得多。否则,会有两个弊端:第一,第一个版本的交付时间会因为需要构建很多公共服务而大大延迟;第二,服务很容易被不合理地拆分,严重影响整个调用流程的性能,甚至可能需要花费很大的精力去处理分布式事务,最后不得不将多个微服务重新整合成一个单体。

而且只有当业务复杂度达到一定程度时,微服务架构所消耗的成本才会体现出优势。微服务设计应遵循垂直分工优先的原则,让团队自上而下专注于业务实现,端到端负责,避免跨服务多次调用带来的性能和沟通成本。

图片

图片

1. 选择正确的时间

在实际实施过程中,想要享受微服务带来的好处,需要做一些前期的准备。比如,组织架构和团队文化要适应云原生的节奏,足够敏捷和自主;打造功能齐全的团队,产品、UI、前后端研发、测试等角色配备齐全;提前构建自动化流水线,实现一键构建、发布、部署和快速扩缩容功能;服务也必须提前容器化部署,因为服务容器化更利于云原生场景下其他功能组件的集成。当以上所有准备工作都完成,业务逐渐发展到一定规模,迫切需要拆分时,就该果断进行微服务拆分和架构设计了。

2. 选择正确的微服务框架

目前主流的微服务框架主要分为两类:侵入式和非侵入式。

主流的侵入式框架有Spring Cloud、Dubbo、brpc等,这些框架功能特点不同,应用场景不同,大部分架构师都比较熟悉,社区和文档也比较成熟。虽然传统侵入式微服务框架如Spring Cloud存在版本碎片化严重、升级成本高等问题,但总体上可以满足大部分服务治理需求。

现在大多数人都比较关注非侵入式框架的选型,也就是近几年兴起的 Service Mesh 技术。2017 年随着 Linkerd 的推出,Service Mesh 翻译成服务网格,开始进入国内社区的视野。一些大公司也同步开发了自己的适合公司内部应用场景和依赖关系的 Service Mesh 框架,助力内部服务的快速迭代和发展。

Istio 作为一个开源的 Service Mesh 框架,自推出以来就备受关注,成为各大厂商和开发者热议的话题。很多人认为 Istio 将成为继 Kubernetes 之后的又一明星产品。有了 Istio,基本就不需要其他微服务框架了,也不需要自己去实现服务治理等功能了,只要把网络层的事情交给 Istio 就可以完成这一系列工作。简单来说,Istio 就是一个提供服务治理能力的服务网格。

此外,Istio 还具备全面的可观察性能力,包括对网格控制下的所有流量进行自动测量、日志记录和跟踪。换句话说,通过选择 Istio,单体应用无需任何修改就可以轻松接入微服务,享受云原生的福利。

3.借助云厂商产品快速落地云原生和微服务

之所以提到云厂商,是因为大部分中小型公司或者传统行业都被单体应用和传统微服务框架的种种弊端所困扰,迫切需要云原生和微服务化改造,但又缺乏足够的人力和技术去维护一套功能齐全的云原生基础和基础设施服务。以Istio框架为例,其版本更新频繁,控制面和数据面在提供强大功能的同时,其代码实现也相当复杂,当出现异常时,很多工程师往往难以定位问题所在。云厂商提供了一整套云原生应用编排和微服务管理解决方案,所有技术都已经产品化,使用简单、效果易于查看,还能避免或快速解决运行过程中可能遇到的各种问题。这在一定程度上不仅提高了服务效率,还大大降低了各种成本,让人们能够快速充分地享受到云原生带来的好处。

总体来说,任何软件或架构都有其优缺点,没有十全十美的东西。在考虑是否实施微服务时,需要思考和权衡当前的软件和系统是否满足微服务改造的前提条件,微服务改造带来的好处是否大于损失,利大于弊,团队是否各方面都准备好了。如果还没准备好,那不妨再等等,毕竟单体架构也有自己的优势。

相关文章:

  • 设计模式之门面(Facade)模式
  • 【Java异常】(简简单单拿捏)
  • 剑指 offer 刷题集
  • java 生成.h文件,java调用c语言dll动态链接库流程
  • uni-app App版本更新
  • C语言习题~day33
  • react通过下拉框选择多个,并展示在下方的方式
  • 【工具分享】Darkside勒索病毒解密工具
  • 每天五分钟深度学习框架pytorch:激活函数在神经网络中的应用
  • 数据结构—(java)反射,枚举,lambda表达式
  • 开发受用户喜欢有声听书APP:快速满足用户需求的秘诀
  • [PICO VR眼镜]眼动追踪串流Unity开发与使用方法,眼动追踪打包报错问题解决(Eye Tracking/手势跟踪)
  • 使用 LlamaIndex 进行 CRAG 开发用来强化检索增强生成
  • python 将 aac 转为 mp3,保持原有目录结构
  • Spring 全家桶使用教程 —— 后端开发从入门到精通
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • css选择器
  • javascript 哈希表
  • JavaScript创建对象的四种方式
  • JAVA多线程机制解析-volatilesynchronized
  • java小心机(3)| 浅析finalize()
  • js中forEach回调同异步问题
  • Mithril.js 入门介绍
  • 阿里云应用高可用服务公测发布
  • 从零开始的无人驾驶 1
  • 扑朔迷离的属性和特性【彻底弄清】
  • 小试R空间处理新库sf
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • linux 淘宝开源监控工具tsar
  • MPAndroidChart 教程:Y轴 YAxis
  • 数据可视化之下发图实践
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (2022 CVPR) Unbiased Teacher v2
  • (done) 两个矩阵 “相似” 是什么意思?
  • (zhuan) 一些RL的文献(及笔记)
  • (八)Spring源码解析:Spring MVC
  • (第一天)包装对象、作用域、创建对象
  • (二)c52学习之旅-简单了解单片机
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (三)mysql_MYSQL(三)
  • (三)模仿学习-Action数据的模仿
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)JAVA中的堆栈
  • (转)memcache、redis缓存
  • ***检测工具之RKHunter AIDE
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .md即markdown文件的基本常用编写语法
  • .net 7和core版 SignalR
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 连接达梦数据库开发环境部署