微服务的好处有好多,易于扩展,发布简单,技术异构,便于重构等等,但今天我们的主题不是说好处,而是我们需要知道微服务同样也会带来痛,我觉得我们更要重视,提出问题,定义问题比解决问题更加的重要。
(1)微服务职责划分
微服务的难点在于无法对一些特定职责进行清晰划分,比如这个职责归属于A还是属于B,举例如下:
- 一个能根据商品ID找出商品信息的接口,将他放在商品服务中,再比如单个用户的所有订单,我们就把他放在订单服务中
- 业务逻辑服务归属和业务人员的划分可能存在关系,比如每个商品在每个门店的库存应该放在商品服务还是门店服务呢?因为各自门店的商品库存是由各自门店的运营人员管理,最终我们决定把它放在门店系统中。
- 业务逻辑服务归属还与组织架构可能存在关系,通过康威定律我们很快就能明白
Conway's law is an adage named after computer programmer Melvin Conway, who introduced the idea in 1967. It states that. organizations which design systems ... are constrained to produce designs which are copies of the communication structures of these organizations.
康威是个程序员,他提出:设计系统的组织在设计系统的时候,会设计出基于这些组织的沟通结构的系统。
上面的例子说明,在现实的场景中,微服务职责划分会受到太多因素的影响。我们需要慎重考虑。
(2)微服务粒度划分
举例一个新零售系统,刚开始只有登录和信息管理。这些功能放在一个服务就行了,随着加盟商的加入,因为加盟商准入,开店,退出都设计费用问题,因此我们又需要增加财务功能,比如应收、应付、实收、实付,退款,对账等,紧接着又要对加盟商员工管理(员工管理、部门管理、权限管理等)返点、加盟商子门店管理等功能,而此时的加盟商管理系统只有一个服务,你觉得合适吗?
一般来说,在设计新功能之前,我们会遵循一个大致的原则:根据新的微服务的大小,安排3-4人设计即可。
在对微服务拆分的时候,我们还需要考虑另外一个因素---绩效。大家都知道,开发人员的绩效很难实现量化,而微服务可谓是一个难得的可量化指标。
虽然我们不能拿微服务数作为KPI,但是开发人员在阐述个人工作量的时候会提及服务数。然后潜意识里就会细化微服务的个数,所以我们需要控制服务数,这种方法也可以作为服务拆分的一个逆向操作。
(3)没人知道系统整体架构的全貌
不知道你有没有碰到过这种情况:每隔几个月或半年,大领导就会发话让我们汇报下每个部门的微服务数量、公司微服务总数量、每个微服务都用来做什么等情况。因为企业微服务数较多,所以每次给大领导汇报时,都是长长的一条清单。
在以前的公司,我首先会把公司的整个架构系统全貌搞清楚,之后一旦出现问题,也就容易定位故障点了。可是自从来到这家使用微服务的公司后,我便再也没有这样的冲动了,只要求搞懂自己的一亩三分地就行,如果出现问题临时学习一下相关系统就好了。
因此,在实际工作中,很难找到这么一个人,他能知道系统整体架构的全貌,这就是微服务的一个痛点。
(4)重复代码多
比如某个团队做了一个日志自动埋点的功能,它能自动记录一些特定方法的调用。但是第一个吃螃蟹的团队使用后,立马报出了一个 JAR 版本冲突问题,自动埋点团队又重新设计了一版埋点的 JAR,并去掉了一些特定 API 的使用,最终 2 个团队终于可以正常使用了。不过呢,第三个使用埋点的 JAR 的团队又汇报了一个 JAR 版本冲突问题,又开始重复了上面的操作。
后来我们复盘了下,得出结论:重用 JAR 本身没有错,错就错在我们使用的 JAR 版本太多了,必须改变这个局面。
不过,维护这些小小的重复代码总比统一排期做重构、统一评审 JAR 版本的成本低得多。
(5)分布式事务
分布式事务是微服务永久的痛,事务出错,是哪些回滚,哪些不会滚等等问题。
因此在这种情况下,大部分场景下我们不考虑回滚和重试,只考虑Happy Path,如果报错就记个异常日志,再线下处理。也是So easy!
(6)耗费更多的服务器资源
有时候为了运维更好的定位问题,我们把服务各自分配到每一个节点上,同样这样就会耗掉很多的服务器。
总结:
- 微服务的职责划分
- 服务的拆分
- 没人知道系统的架构全貌
- 重复代码多
- 分布式事务
- 耗费更多的服务器资源