仔细想想,微服务架构相比于单体服务架构来讲优势也没有很大

2019-10-13 21:54:32 +08:00
 petelin
我的观点是微服务从技术上使得每个服务不在和其他服务分享资源,所以更加独立和健壮一点(更分布式一点)

但是,只要有依赖关系我看不出来通过 rpc 调用和直接方法调用有什么区别
诸如吐槽单体应用存在 业务边界模糊,调用关系复杂,难以重构等等问题 难道一个治理的不好的微服务里就不会发生了? 我们不可以在单体应用中分模块来解决吗?

我们可以在代码层面依然分出来不同的服务在不同的目录下 只是不用 rpc 还按照领域驱动模型拆分出来子模块 按照微服务的思路去治理这个大的单体应用(权限验证 调用关系等等) 每个模块也可以有自己的数据库 而不是一个公用的数据库等等

每个子模块就相当于一个微服务 这样的思路会有什么问题?
7065 次点击
所在节点    问与答
56 条回复
optional
2019-10-14 11:23:02 +08:00
@petelin 不仅仅是开发,还有上线、测试流程的解耦, 如果在一个大程序里,只能依赖固定的部署周期来解决上线问题。
dandycheung
2019-10-14 11:26:53 +08:00
@petelin 你的思考精神不错,但到这层楼开始想偏了。不使用微服务当然也可以解耦、分拆、部署、迭代,但是这样的通用需求最后总要落实到某种实现上,而眼下最靠近的技术实践就是微服务架构。当你自己实现了一套体系时,你可以挑战它,而不是以零散的见招拆招式的思维来质疑它。类、库、框架,这些的抽象和构建都是这样的,你当然问出说不调用 strlen 就无法计算字符串长度了吗这样的问题,但是那不是常规理解和思辨的方向。
firefox12
2019-10-14 11:43:57 +08:00
为什么卡车 客车 轿车 跑车 不做成一个车里面,让车有所有的功能。现在生产真多型号也是浪费。

所以实质就是组合比继承好。但是分散有通讯的代价。这其实又回到了微内核 宏内核一样的问题 微内核更好,但是通讯代价太大了平衡是关系
sujin190
2019-10-14 11:49:22 +08:00
@petelin #38 这不用想吧,多人协作中,至少各业务是分开的微服务组件,修改更新的至少不需要整体等着大半夜统一重启更新吧,单个项目结构更简单,新人来了熟悉难道不更快,反正你又不是大佬一来就负责所有业务
伸缩性更不用说了,那个服务性能不够了,再加几台机器就是了,多简单
业务适应性更新更不用说了,就现在这行情,上个月卖水果,这个月就可能想着做金融的,微服务化的至少你不用担心做新项目的时候还不知道哪把老项目改出 bug 来了吧,老的项目或者直接废弃或者只要不挂扔在那不管就是了,这还不比你单个复杂项目适应性更强?
whp1473
2019-10-14 11:50:55 +08:00
@suikatw 以前一般用服务总线,其实就是现在微服务的雏形。你说 BAT 大项目,在洪荒时代,也不是一个项目跑的。。。他们也会划分项目的,那时候一般比较粗糙,没有注册中心、调用链监控、RPC 模块、协议一般也都是 HTTP,关于重试和降级策略一般都是自己写在项目里,把这些抽离出来就是 RPC 框架。有些说的也对,最最开始的确一个项目,京东以前还是 Asp.net 。。。然后前面挂负载均衡,报错有时候你还能看到 Asp.net 把异常堆栈抛到前端。。。

至于你说分目录,优点不说了,说缺点:
(1)随人员变动、项目扩大,你很难维持现有的结构。git 冲突 版本管理也是很难解决的问题。比如我写完了这个模块要上,但是别人需要依赖前一个版本,你需要等。你用 Dubbo 可以通过 group version 解决,可以同时支持多版本开发。
(2)只要有修改别人代码的可能,就一定会发生。所以专注自己系统,不会给多余的权限
(3)一个简单 BUG 的修改都将导致服务重新发布,并且编译和发布时间成本巨大,在发布时,容易造成故障,压力激增
(4)这种结构容易造成雪崩,一般的,比如物流系统故障,订单已经下达,可以通过 MQ 重试机制保障物流恢复后系统自动恢复。而单点一旦崩溃,将导致整个系统不可用,数据无法进入,也不可能恢复。
(5)项目实践会告诉你,随人的增加沟通成本会越来越大,最后新增加的人的效率将不足以弥补沟通成本。解决方式就是系统拆分,专注自己的系统。
(6)至于机器占有资源问题,那是因为你预估有问题,没有计算你需要的 QPS 和机器资源。估计都是差不多直接上去。另一方面,当系统使用人数增加后,比如看东西的人很多,但是买的很少,那我可以扩容商品模块,而不需要对订单系统进行扩容,系统大了资源消耗反而降低。
(7)维护成本增加是必然的,但可以通过技术去解决 HSF、Dubbo、SpringCloud,以及之后的服务网格都是在解决成本问题
(8)服务不是无限拆分的,一般系统确定时,系统设计这个阶段要占用 50%时间,划分领域。要注意事务尽量属于自己所属领域,避免跨服务的分布式事务以及跨库事务。

没有最完美的架构,具体问题具体分析,要不然要这么贵的开发和架构干嘛:
(1)你要是外包项目或者中小项目,或者人数少,那就一个项目跑呀。
(2)如果你项目开始就定位比较大,比如目标是全中国用户,那开始架构时就应该考虑到微服务的形式
也可以渐进式演化,BAT 京东 这些最初都是一个项目跑的,有钱时再慢慢变成了领域模型内切分,各个服务高内聚,低耦合,用 MQ 解耦合以及填谷消峰。
exc
2019-10-14 11:54:44 +08:00
可能是职责更清晰、维护更方便吧。我自己做 Android 开发,兼前后端开发,Android 里面就有模块化、插件化开发这个东西,跟后端的微服务其实很像。

做后端的时候,不自觉的就把 Android 的这套开发方式拿过来用了,然后发现原来后端也有类似的概念:微服务。

其实是真的方便,我平时也写些个人 app,后端如果不用微服务,那么每个 app 都要搞一套用户系统,很麻烦的,如果用户系统独立出来作为一个服务,就非常爽了。

我觉得微服务、模块化、插件化、库、SDK 等等,概念都差不多,只是场景不同,名称各异。

站在开发的角度,同一功能编译成一个库,到处使用,能理解,那么微服务就是站在产品的角度,同一功能独立成一个服务,到处使用,感觉两者差不多。
wc951
2019-10-14 12:07:01 +08:00
没有微服务之前也有 soa 了啊,服务化口号喊了十几年了吧
uleh
2019-10-14 12:15:38 +08:00
说明你还年轻😏
jadec0der
2019-10-14 13:08:09 +08:00
petelin
2019-10-14 13:33:10 +08:00
@jadec0der 多谢,之前听过这个观点.
ps: 想关注你的时候发现已经关注了.
jsq2627
2019-10-14 14:52:49 +08:00
1. 职责拆分,便于团队横向扩展
2. 部署隔离,避免改个小 bug 要重启整个巨型应用,还有给横向伸缩的提供便利
3. 技术方案隔离,A 服务可以用一种框架写,B 服务又可以用另一种框架写,甚至引入其他编程语言
4. 故障隔离,A 服务崩溃只会影响自己,一般不会导致整个应用崩溃
xuanbg
2019-10-14 15:05:44 +08:00
我司是一家互联网小厂,业务规模也比较小。这是背景
微服务在我司的实践也有 2 年多了,和单体架构相比,好处还是不少的。最大的好处,就是业务复杂度的降低。刚入职的新人我就敢让他独立负责一个新项目,只要花几分钟了解我们的项目模板,就能直接上手,真正做到了只需要关注业务。其余的例如方便水平扩展,局部更新,项目组织灵活等等就不多说了。
在实践中,最大的问题是服务边界的界定问题。总有人见风就是雨,看问题只看表面,不能把代码写对地方。其实这个问题在单体架构中也是存在的,模块没有边界,代码到处乱写也很常见。单体架构设计不好,微服务照样搞不好。
lihongjie0209
2019-10-14 15:45:22 +08:00
lihongjie0209
2019-10-14 15:49:14 +08:00
取决于你的团队规模和项目规模。一个小组能做完的项目搞微服务就是闲得蛋疼
anmie
2019-10-14 15:56:30 +08:00
你既然叫微服务架构了,那么架构其实有一个概念:解决未来的问题。
l00t
2019-10-14 17:55:15 +08:00
系统不大到一定程度是没必要用微服务的。用了微服务,也不要拆太多太碎。一个程序显然比多个程序更方便调试。微服务能让业务复杂度降低的观点简直搞笑。

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

https://www.v2ex.com/t/608938

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

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

© 2021 V2EX