微服务是个坏主意吗?

曾几何时,我记得我的手指疯狂地敲打键盘,与庞大而杂乱的代码库搏斗。那是巨石的时代,代码就像古老的城堡一样,由一块块石头砌成一个令人印象深刻的庞然大物。

几年过去了,时代变了。开发人员口中的流行语变成了“微服务”。微服务革命——承诺成为我们的救世主。

我们被告知,通过将庞然大物分割成更小、自包含的独立服务,我们将获得无与伦比的可扩展性、敏捷性和可维护性。这听起来是如此完美。

  • 更快的部署?√
  • 单独扩展?√
  • 独立团队开发?√

但是,当我把单体架构切换成微服务时,我不禁想知道:微服务的魅力真的像它所描述的那样吗?还是只存在于远景的海市蜃楼,只有当我们走近时才显露出它的挑战?

1、微服务的诱人承诺

还记得我们不得不与多个团队协调只是为了进行微小的调整吗?传统的单体架构是后勤方面的噩梦。

每次更改都需要理解代码库的大部分区域,与其他团队同步,并希望一个小的调整不会引发多米诺骨牌效应。

但微服务打开了新大门:突然之间,团队可以独立开发他们的服务了。

例如,用户管理团队可以实施新的身份验证策略,而无需等待库存管理团队更新其产品列表方法。这种解耦不仅仅是在代码层面,它还延伸到了团队动态。

O'Reilly 的一项调查发现,采用微服务的组织在团队协作方面提高了63%。每个开发人员都成为其领域的大师(从字面上看,考虑到领域驱动设计实践)。

在我们之前的一个项目中,我记得“黑色星期五”大促销活动时引发的混乱。我们的单体应用难以应对大量涌入的用户,导致所有功能的性能下降,而不仅仅是结帐流程。

微服务很好地解决了这种不平衡的需求。你只需简单地在负载下扩展服务,而无需为整个应用程序过度配置资源。

想结账的用户激增?没问题,扩大结帐服务规模。

宣传视频病毒式传播?没问题,提升媒体服务,不影响触及其他服务。

思科的一项案例研究显示,使用相同数量的资源的情况下,使用微服务架构设计的应用程序可以处理多达 20%的负载。

2、不那么迷人的现实

虽然许多人认为微服务是解决软件开发问题的灵丹妙药,但作为一名远程开发人员,我对这种架构风格的尝试经常感觉像打开了潘多拉的盒子。

在虚拟茶水间的闲聊和一行行代码之外,这个故事总是充斥着无数希望、频繁的正面交锋以及相当多的启示。

当我将我的第一个项目过渡到微服务时,我突然意识到,将一个应用程序拆分为多个服务并不是简单的“分而治之”。

随着拆分而来的是管理这些离散服务的责任。有一次,我部署了一个新的微服务,突然间,系统的其他部分失去了对它的跟踪——这是分布式系统中服务发现(Service Discovery)的臭名昭著的挑战。

此外,数据一致性也成为一场艰苦的战斗。

我再也不能依靠单个数据库事务来确保一切正常。因为每个服务都在管理自己的数据,我发现自己陷入了分布式事务的泥潭之中。

然后是失败。当一项服务失败时,连锁反应通常会导致其他服务发生级联故障。

理论上让服务进行通信,听起来很简单。

但问题是:分布式系统引入了延迟。

一天晚上,我正在调试一个异常缓慢的操作,却意识到罪魁祸首是服务之间的大量同步调用。等待下一个请求的次数增加了。

这需要改变战略。

虽然通过事件进行异步通信减轻了一些痛苦,但它也带来了挑战,例如确保事件的顺序。

被吹捧的模块化承诺往往与性能相悖。虽然微服务可以简化流程,但与传统的单体应用相比,它们也可能导致通信延迟。

3、噩梦循环:部署混乱

作为 CI/CD 的坚定倡导者,部署单个服务的承诺感觉就像一个梦。

但现实很不一样。最初的几天尤其混乱。

使用多个管道时,一个服务中的更改有时需要与其他服务进行协调。还记得你每天都为之头疼的版本兼容性问题吗?有了微服务,跟踪哪个版本的服务A与服务B兼容成为了一种日常仪式。

4、我开始怀念单体架构了

带有一系列服务和数据库阵列的微服务,常常感觉就像一块不断移动的拼图。有很多个晚上,我发现自己由于无法预见的集成问题而恢复代码,或者梳理日志试图找到哪个服务是薄弱环节。

与巨石时代形成鲜明对比的是,在铁板一块时,变化尽管规模较大,但具有一定的可预测性。

工作流程是线性的,那么部署呢?好吧,他们感觉更受控制了。

如果你曾经尝试通过一串 Slack 消息来传达一个复杂的想法,你就会欣赏直接沟通的益处。与此类似的,在单体架构中,模块之间的进程内通信的简单性是直接、无缝的,并且通常被认为是理所当然的。没有网络调用,没有延迟,没有丢失请求。一切都在应用程序的范围内正常工作。

使用微服务,服务间通信感觉就像试图与分布在各大洲的团队成员进行 Discord 语音聊天,每个人都在与自己的互联网困境作斗争。

当然,这是可行的,但这些小问题会让你怀念一切都在一个屋檐下的时光。当公司要求他们的开发人员回办公室坐班时,我理解了:它确实有它的好处,尤其是在即时沟通方面。

5、权衡:我们得到了什么,失去了什么

微服务的主要优势之一是能够专注于特定的功能。我记得我被分配到一个专门负责用户身份验证的团队。解耦的特性使我们能够完善机器中的一个齿轮。

不久前,我们的单体应用中的一个小模块故障导致了严重的中断。对于微服务,每个服务都充当其隔离的故障点。我见过一些特定微服务出现宕机的实例,但多亏了架构,整个应用程序得以继续运行,用户对此几乎没有感知。

6、当单体更好时

管理微服务感觉就像同时处理十几个Slack频道。每个服务都有自己的日志记录、监视和部署过程。相比之下,单体架构有一个固定的流程。

微服务通常意味着多个数据库。虽然这看起来很棒,但确保数据一致性却是一场噩梦。在单体架构时代,一个数据库意味着一致性。这就像在 Discord 中有一个线程,每个人都在更新。我经常发现自己怀念这种统一性提供的便利。

然后是整体调试。

还记得尝试通过相互连接的微服务跟踪bug吗?这就像追溯无数的 Discord 对话来找到一条消息。但在单体架构的设置中,错误日志是集中的,因果关系更加清晰。

7、总结:微服务之旅中的反思

当我回顾自己在微服务领域的尝试时,我发现这条道路充满了挑战、得失和可以从中学习收获的宝藏。以下是我在微服务之旅中获得的3个主要收获。

1) 明智地接受复杂性

深入微服务不仅仅是一个技术决策——这是对复杂性的承诺。有时,我们会觉得自己只是为了顺应潮流而打破了一个体系。并非每个应用程序都需要由相互连接的服务组成的网络。正如Sam Newman在《构建微服务》中提到的那样,架构需要一定的先决条件,如果没有这些先决条件,它可能会矫枉过正。

2)灵活性是有代价的

是的,微服务承诺了灵活性,但要实现这一点,也需要付出沉重的代价——不仅在基础设施方面,而且在认知负荷方面。每项服务都有自己的领域,需要专门的关注。

3)没有放之四海而皆准的方法

架构决策不能脱离业务需求。灵活的初创公司的需求与传统的企业应用程序截然不同。虽然经典案例研究(例如 Netflix 著名的微服务转型)很有启发性,但必须认识到,适用于一个人的方法不一定适用于所有人。

变身为技术弄潮儿可能很诱人。成为科技领域重大变革的组成部分有一定的吸引力。但作为代码的守门人,我们需要抵制盲目接受趋势的诱惑。批判性评估、理解趋势背后的“原因”,并权衡其与我们的特定背景的相关性至关重要。

Slack 消息、GitHub 存储库和 Discord 讨论已成为我们许多远程开发人员的新饮水机。在各种噪声中,让我们记住定期聚焦,反思我们的选择,并确保我们不只是追逐趋势,而是有目的地制定经得起时间考验的解决方案。

8、善用工具

成功的前端工程师很会善用工具,这些年低代码概念开始流行,像国外的 Mendix,国内的 JNPF,这种新型的开发方式,图形化的拖拉拽配置界面,并兼容了自定义的组件、代码扩展,确实在 B 端后台管理类网站建设中很大程度上的提升了效率。

开源地址:JNPF体验中心

代码量少,系统的稳定性和易调整性都会得到一定的保障。基于代码生成器,可一站式开发多端使用 Web、Android、IOS、微信小程序。代码自动生成后可以下载本地,进行二次开发,有效提高整体开发效率。同时,支持多种云环境部署、本地部署给予最大的安全保障,可以快速搭建适合自身应用场景的产品。同时它有微服务和单体两种选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/137097.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse如何打开debug变量窗口

今天笔者在使用Eclipse调试的时候,发现没有变量(Variables)监视窗口,真是头痛得很,最后摸索出一套显示变量窗口的操作如下: 点击other,找到Variables并点击 最后调试代码,调试后如图…

【小知识送书2】从不了解用户画像,到用画像数据赋能业务看这一本书就够了丨《用户画像:平台构建与业务实践》

⭐简单说两句⭐ 作者:后端小知识 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 简单说两句 🎁本次送书1~3本取决于阅读量,阅…

springboot整合aop,实现日志操作

前言: 整合之前,我们要明白aop是什么,为什么要用aop,aop能帮我们做什么。 答:AOP是面向切面编程(Aspect-Oriented Programming)的简称,它是一种编程思想,旨在在面向对象…

虹科方案 | LIN/CAN总线汽车零部件测试方案

文章目录 摘要一、汽车零部件测试的重要性?二、虹科的测试仿真工具如何在汽车零部件测试展露头角?三、应用场景**应用场景1:方向盘开关的功能测试****应用场景2:各类型电机的控制测试****应用场景3:RGB氛围灯的功能测试…

win系统环境搭建(六)——Windows安装nginx

windows环境搭建专栏🔗点击跳转 win系统环境搭建(六)——Windows安装nginx 本系列windows环境搭建开始讲解如何给win系统搭建环境,本人所用系统是腾讯云服务器的Windows Server 2022,你可以理解成就是你用的windows10…

建立表使用约束

1.建立表 二、使用约束 1.NOT NULL 非空约束,规定某个字段不能为空,NOT NULL 约束强制列不接受 NULL 值。 NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。下面的 SQL 强制表&qu…

最小二乘法的实现与线性回归的应用

1. 简介 简单线性回归中,您有一个因变量y和一个自变量X。该模型可以表示为: y m x b ymxb ymxb 其中 x x x: 自变量 y y y: 因变量 m m m: 斜率 b b b: 截距 最小二乘法是回归分析中用于估计线性回归模型参数的标准方法。它可以最小化误差的平方和&…

LVS+Haproxy

LVSHaproxy 一、Haproxy简介1.1、Haproxy应用分析1.2、Haproxy的特性1.3、常见负载均衡策略1.4、LVS、Haproxy、Nginx区别1.5、 Haproxy的优点1.6、常见的Web集群调度器 二、Haproxy部署实例四、日志定义优化 一、Haproxy简介 Haproxy 是一个使用C语言编写的自由及开放源代码软…

mysql odbc驱动安装

到官网下载对应版本的驱动包 可以选择对应版本,建议使用最新版本即可 查看powerDesigner对应的位数,位数对应不上的话,会找不到 powerDesigner 可以参考:powerDesigner安装 我这里装的是32位的 下载对应版本的即可 下载完成&a…

深入理解Kubernetes Pod调试

调试运行中的容器和Pod不像直接调试进程那么容易,本文介绍了通过临时容器共享命名空间的方式调试业务容器进程的方法。原文: Debugging Kubernetes Pods: Deep Dive ZanUnsplash 调试pod最简单的方法是在有问题的pod中执行命令,并尝试排除故障。这种方法…

软件定制开发的优势与步骤|APP搭建|小程序

软件定制开发的优势与步骤|APP搭建|小程序 定制开发的优势: 1. 满足特定需求:定制开发可以根据客户的实际需求进行设计和开发,使得软件系统能够更好地满足客户的业务目标。 2. 优化用户体验:通过深入了解客户的需求,定…

视频监控管理平台/视频汇聚/视频云存储EasyCVR安全检查的相关问题及解决方法3.0

智能视频监控系统/视频云存储/集中存储/视频汇聚平台EasyCVR具备视频融合汇聚能力,作为安防视频监控综合管理平台,它支持多协议接入、多格式视频流分发,视频监控综合管理平台EasyCVR支持海量视频汇聚管理,可应用在多样化的场景上&…

若依前端使用

初始化页面时,路由上加参数 1. 多个菜单对应一个页面,默认查询的数据状态不一样 vue 页面上 通过 debugger; 查看所有的参数, 最后取到了 2. Vue warn]: Error in callback for immediate watcher “fileList”: “TypeError: Cannot read p…

双系统ubuntu20.04(neotic版本)从0实现Gazebo仿真slam建图

双系统ubuntu20.04(neotic版本)从0实现Gazebo仿真slam建图 昨晚完成了ROS的多机通讯,还没来得及整理相关操作步骤,在进行实际小车的实验之前,还是先打算在仿真环境中进行测试,熟悉相关的操作步骤,计划通过虚拟机&…

【深度学习】 Python 和 NumPy 系列教程(九):NumPy详解:1、创建数组的n种方式

目录 一、前言 二、实验环境 三、NumPy 0. 多维数组对象(ndarray) a. 多维数组的属性 1. 创建数组 a. 使用numpy.array函数: b. 使用numpy.zeros函数 c. 使用numpy.ones函数 d. 使用numpy.arange函数 e. 使用numpy.linspace函数 …

2023Q2全球可穿戴腕带出货量达 4400 万台

全球可穿戴设备市场在2023年第二季度继续保持增长态势,总出货量达到了4400万台,同比增长了6%。这一增长得益于消费者对于可穿戴设备的需求不断增加,以及不同细分市场的需求反弹。 根据市场研究机构 Canalys 的最新报告,全球可穿戴…

Android EditText筛选+选择功能开发

在日常开发中经常会遇到这种需求,EditText既需要可以筛选,又可以点击选择。这里筛选功能用的是AutoCompleteTextView,选择功能使用的是第三方库https://github.com/kongzue/DialogX。 Android AutoCompleteTextView(自动完成文本框)的基本使用…

【物联网】简要解释RTK(Real-Time Kinematic)>>实时动态差分定位

引言: RTK(Real-Time Kinematic)技术是一种基于差分GPS的高精度定位技术,它通过实时通信和数据处理,能够提供厘米级甚至亚米级的定位精度。RTK技术在许多领域都得到了广泛应用,如测绘、航空航天、农业等。本…

详解Nacos和Eureka的区别

文章目录 Eureka是什么Nacos是什么Nacos的实现原理 Nacos和Eureka的区别CAP理论连接方式服务异常剔除操作实例方式自我保护机制 Eureka是什么 Eureka 是Spring Cloud 微服务框架默认的也是推荐的服务注册中心, 由Netflix公司与2012将其开源出来,Eureka基于REST服务开发,主要用…

【C++STL基础入门】list改、查操作

文章目录 前言一、list查操作1.1 迭代器循环1.2 for_each函数 二、list改操作2.1 迭代器修改2.2 assign函数2.3 运算符 总结 前言 C标准模板库(STL)是C语言中非常重要的部分,它提供了一组通用的模板类和函数,用于处理常见的数据结…