微服务是不是一种错误的方向?

165 天前
 Joker123456789

先说想法

这个标题并非一时兴起,也并非哗众取宠,而是我这段时间以来的思考。为什么会出现这样的想法?这还得从一个事实说起。

众所周知,微服务并不能提升整个项目的吞吐量,它的作用仅仅只是把项目按照一定的规则拆分成各种模块,然后每个模块都可以交给不同小组去开发。他解决的仅仅是大项目的团队协作问题。而真正能提升吞吐量的,除了程序本身的质量那就是负载均衡了,而且事实上微服务的架构中,每个服务都是以负载均衡的形式部署的,所以这里就有一个问题了:

如果仅仅是为了解决 [大项目的团队协作问题] 那么常规的模块化设计是不是也能做到?

现在由于 maven 的出现,再加上企业内部可以搭建私服,我们完全可以让每一个服务都以 jar 包的形式来开发。举个很简单的一个例子,比如有一个用户服务,订单服务,现在一般的做法是写一个聚合服务去调用这两个服务的接口,来实现业务逻辑的整合。

那如果把用户服务换成用户模块 jar 包、订单服务换成订单模块 jar 包,以 jar 包的形似传到私服,然后同样的写一个聚合服务,聚合服务把这两个 jar 包引入进来,是不是也能达到这样的效果?

如果需要负载均衡,那我们把这个聚合服务部署多个就好了,完全不影响。我完全想不到跟微服务比起来有什么坏处,如果有,欢迎大家指正。

微服务有什么缺点

  1. 耦合性太高,虽然开发和部署不会影响别的服务,但是你如果动了接口的出入参,那么其他服务就得同步升级了,而且是调用了这个接口的服务都要升级,又或者你需要为此单拎一个接口出来,做版本区分。
  2. 需要注册中心,项目会多出一个中间件,提升复杂度。
  3. 会消耗内网带宽,甚至是公网带宽,因为服务之间的调用都是通过网络完成的。
  4. 会出现分布式事务的问题,因为一个事务的操作可能会分布在不同的服务上执行。

如果用常规的模块化方案

  1. 虽然耦合也高,但是如果你动了接口的出入参甚至是接口名,别的服务是不需要立刻升级的,除非你是在改 bug ,但这是被业务逼着升级,因为不升级是有 bug 的,但他不会被技术逼得升级,因为模块只是被打成了一个 jar 包引入了其他模块里,无论你怎么变,已经部署在线上的别的模块里依然是用的你的老代码。
  2. 不需要注册中心
  3. 不会消耗多余的带宽资源
  4. 不需要分布式事务了

还是压力问题

一定会有人说,你把这么多模块都塞进一个服务里,那这个服务得部署多少台机器啊。

说到这里,就不得不从全局来看待问题了。我们可以看两张图(不好意思,有错别字,但是已经截图了就懒得改了,能看懂就行)

图 1

图 2

根据上面的两个图,我们是不是可以这么说,微服务在面对相同的流量时根本没有节约服务器的数量?反而还多了?

假如左边的聚合服务,他的业务量需要 10 台服务器才能支撑,右边的需要 5 台才能支撑,那么一共是 15 台。而微服务会导致 A 部署 15 台,B 也部署 15 台,再加上两个聚合服务,一共需要 32 台以上。

当然了,这只是极端的情况,现实中可能 A 服务不需要处理这么多业务,他可以少部署一点,又或者 B 服务可以少部署一点。但无论怎么算,服务器都是多了。

如果采用 jar 包的形式,那么只需要 15 台就够了,10 台用来部署左边的聚合服务,5 台用来部署右边的聚合服务。

说到底

这其实就是以三方库的思想在设计模块化,如果有一个工具类叫用户管理,有一个工具类叫支付管理。当你需要开发登录功能的时候,只需要引入一个 jar 包,然后调用里面的某个方法就好了,当你需要开发支付功能的时候也一样,你不需要去学习 dubbo ,不需要去学习 springcloud ,甚至不需要去关注注册中心是否挂没挂,注册中心的 url 是多少,服务到底有没有正常发布,有没有正常被发现。你会不会觉得这样有什么不妥呢?

以上只是个人的一点浅薄见解,欢迎大家理性探讨。

6580 次点击
所在节点    Java
50 条回复
micean
164 天前
从一个极端到另一个极端……
kneo
164 天前
绝大多数使用微服务的项目规模,都远远小于 Windows ,Chrome 。不存在一定要微服务。只能说,微服务有很多明显的优势,让它一度很流行。随便举几个:

1. 团队分工明确,接口测试明确。
2. 责任明确。如果一个服务挂了,可以迅速定位相关的团队。
3. 热更新方便。
4. 整体的运行性能(性价比)会降低,但是更容易 scale 。
5. 可以使用不同语言开发。团队有自主权。
6. 互相无编译依赖,无运行库依赖,配合容器部署,在很大程度上可以解决 dll/so/jar 冲突问题。

微服务的问题在于后来机械化,搞得太微了,一个团队负责好几个微服务,微服务互相直接也有依赖,也存在版本问题。部署和调试也成了地狱。你搞的不微别人还说你不正宗。

具体上不上微服务还是看自己团队和项目。自己爽不爽自己心里有数。不爽就别硬上。
lesismal
164 天前
多数人都不懂的一切从实际出发,即使背会了八股、实际工程中还是不擅长运用。
微服务只是一种架构设计和工程实践方案,关键是适不适合用、怎么用、用的对不对。

2015 年左右微服务刚开始要兴起的时候,我在好多技术群里喷那些无脑微服务的人,注意,是喷那些无脑微服务的人而不是喷微服务本身。
早年没有微服务的时候就有分布式,是更广义的概念,微服务被 web 领域的人把分布式更加领域细分并且搞了一大坨以 web 领域为主的基础设施。但其实游戏行业大型游戏系统很早就用分布式,只是游戏技术没有 web http 这些相对统一的协议和技术栈、而多是一家公司一套框架,所以游戏行业的技术相对 web 领域而言像是一盘散沙,也难成固定流派,开源的游戏服务器架构没几个好用的。

整天在那纠结这个概念那个概念,从来没去思考下这个方案与实际工程结合是否合理,你们 95-99%的人都错了。

好的现象是,一些大厂团队和一些老鸟逐渐开始清醒,但也是局限于实践中的那些好坏的点才后知后觉,但如果懂得思考,这些很多坑都是可以提前预见的。
软件工程领域,绝大多数所谓的架构师最大缺点,就是没有像土木建筑数学等领域,去做更详细的建模、图纸设计之类的,只知道 tmd 跟风只知道画点漂亮的所谓架构图甚至 ppt 忽悠老板,但凡知道思考实际的事情、这些大多问题、不是指所有问题,而是排除掉高精尖难度大的那部分,因为现实工程中绝大部份问题都是普通问题,其实都是可以像幼儿园搭积木一样,提前摆弄摆弄就清晰了。

只背八股,不思考工程实践,写再多文章都是误人误己。
cp19890714
164 天前
“微服务”这个名字只是表象,本质上是要根据实际的业务架构和业务需求,给出合适的技术架构。
你要是不想“微”,你可以不“微”啊,服务化就行了。
现在这个情况,明明是人的问题,你却说是技术的问题。
jay0726
164 天前
我们一个部门 11 个后端开发,后端服务就有 100 多个,维护起来真的是灾难。
sujin190
164 天前
@Joker123456789 你去问问淘宝,谁会给你什么额外措施,随时重启且不中断不出现异常不出现是所有互联网业务的基本要求好吧,而且更主要的一个问题是稍微大一点的业务流程都很长,可能数百步,可能需要执行很久,任何时刻都有未完全结束的流程在执行,重启不会产生不能完成或者未知状态的流程也是基本要求,服务器不是客户端,重启只会制造异常
encro
164 天前
看看我的需求:

1 ,解决耦合度增加导致的复杂度增加的问题,采用微服务可以物理隔离各类模块的联系。
2 ,微服务后可以按模块部署,更容易按需迭代扩容。

从维护角度分析:
复杂度管理:微服务虽然看起来更多了,但是出问题的时候就更容易定位了。
水平扩展性:性能问题更容易定位,也更容易扩展。


从写代码角度管理:
写代码时由于粒度更小,更加容易写出稳定,可测试的代码。
开始项目前必须考虑通信,性能等因素,进一步要求先设计后编码,有利于提高代码质量。


为什么要微服务?回到第一性原理回答:

1 ,因为人的脑袋存储和 cpu 不够大,不能同时装下那么多模块的逻辑;
2 ,因为一台或者几台机器不够,不能同时运行这么多服务;
3 ,因为我们需要保证服务的不间断运行。


为了看看我的答案怎么样,我问了下 deepseek r1:为什么要微服务?用第一性原理回答

结果还好,无明显遗漏。。。
249239432
164 天前
微服务这技术没错,最烦那些一天没几个人访问的也要硬上微服务

还有一个硬上微服务的场景就是,投标的时候,你没有微服务,你就比那些用了微服务的得分低
julyclyde
164 天前
微服务(化)是手段而不是目标
问题是你需要找到目标
xiaohusky
164 天前
我试过 20 几号人维护一个单体屎山,那确实是噩梦
opengps
164 天前
微服务是为了大型服务端架构,进行进一步拆分,来分解服务端压力的,用不到那么大的架构根本没必要折腾微服务
mark2025
164 天前
耦合性太高,虽然开发和部署不会影响别的服务,但是你如果动了接口的出入参,那么其他服务就得同步升级了
=======
单体服务不也一样么,改动接口参数,相关下游调用方都得同步修改(不管是项目内部还是外部)。
encro
164 天前
@mark2025

还是有不通的,单体服务你不知道这个接口别人用了没有,界限是模糊的。
而微服务你已经明确定义了哪些是外部的,哪些是内部的。你动内部的,是没有问题的,你动外部的,你需要做兼容处理,或者增加一个新的接口,或者发布一个新的版本。
aliveyang
164 天前
什么都引入工具放你本地,你本地放得下吗?
lujiaxing
164 天前
不能说是错误方向。
微服务是解决团队大型化的必然方向。一个上百人的团队,去维护一个项目,别的不说光解决冲突都要解决好久。

但是好多公司做错了。一个只有几个人的团队硬去搞什么微服务。这才是需要修正的。
zjsxwc
164 天前
那么问题来,
楼上说的 java 微服务架构的优点,serverless 全都具备,而且 serverless 还有运维方便、伸缩方便、部署成本价格低等优点,

为何不直接用 serverless 代替 java 的微服务架构?
fcten
164 天前
@zjsxwc
serverless 资源隔离性差,核心场景为了稳定性往往不得不独立部署,这些优点就基本都没了
非核心场景倒是可以直接往上放,但是作为开发也不想整两套技术栈啊
另外 serverless 开发运维方便了,问题排查要麻烦的多

最后还是只有小团队会选择
CasualYours
164 天前
微服务架构中核心对象是服务,因为服务间的解耦,可以轻松实现不同服务的区分对待。
比如在业务高峰期时,订单服务往往比用户服务承担更多流量,微服务架构可以指定仅对订单服务进行扩容。基于容器,可以根据业务场景,动态变换不同服务间的资源配置。

可以微服务架构是提高了系统负载能力的上限,但对应的维护成本,性能问题,部署成本都是需要权衡的因素。
521jx123OvO
163 天前
不能为了微服务而去微服务,应该是项目的体量现行架构不足以承载了,再去考虑微服务。主要是前几年大家都在跟风做微服务,然后在现行的降本增效趋势下进行退微服务化。

微服务是为了解决一些问题,但是会产生新的问题。

最后,软件工程架构没有灵丹妙药。
agagega
163 天前
软件工程是人的工程,软件项目的结构最后会变成开发人员的结构(康威定律)。

所以不同团队维护不同模块,就适合微服务。如果是一个团队,那用微服务就是自讨苦吃。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1113366

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX