微服务拆分的一些思考

微服务拆分的一些思考
最新回答
浅夏时光

2020-08-12 12:13:17

微服务拆分的一些思考

微服务架构自2014年由Martin Fowler提出以来,已经在国内外的互联网公司中得到了广泛应用。然而,对于是否应该使用微服务以及如何拆分微服务,业界仍存在不同的看法。基于多年的实践经验,以下是对这两个问题的深入思考。

一、何时将单体服务改为微服务架构

首先,我们需要明确单体服务和微服务架构各自的优缺点,以便在合适的时机做出正确的选择。

  • 单体服务的优缺点

    优点

    开发简单:集群中所有服务都是一套code base,便于统一管理和开发。

    易于部署:所有服务都是一个可执行文件,简化了部署流程。

    性能好:没有服务间的调用开销,整体性能较高。

    缺点

    开发效率低:随着代码量的增加,维护一个巨大的code base会变得困难,影响开发效率。

    可扩展性差:无法针对某个模块或接口进行独立扩容。

    可靠性差:单个模块异常或性能问题可能拖垮整个后端系统。

    升级部署灵活性差:无法对单个模块进行独立升级和部署。

  • 微服务架构的优缺点

    优点

    高效开发:不同的微服务由不同的开发团队负责,code base小,开发速度快。

    扩展性好:可根据负载水平对不同的微服务进行独立扩容。

    高可用:单个微服务异常不会影响其他服务的正常运行。

    缺点

    更高的沟通成本:微服务之间以及负责团队之间需要更多的沟通。

    更高的资源成本:在相同流量下,微服务架构可能需要更多的资源(但好的拆分可以节省资源)。

    更高的排查问题成本:需要排查整个调用链来定位问题。

那么,何时应该将单体服务改为微服务架构呢?这主要取决于实际情况。以下是一些不应拆分的情况:

  • 服务流量很小:此时单体架构的缺点不会显现,而微服务架构反而会增加部署、资源和排查问题的成本。
  • 团队规模很小:代码库不大,拆分微服务会导致服务维护成本增加,影响开发效率。
  • 团队研发能力一般:微服务架构对服务治理、拆分、协议设计、限流降级等能力有较高要求。如果团队能力不足,容易出现问题。

二、服务如何拆分

在决定采用微服务架构后,如何合理地拆分服务是一个关键问题。以下是一些拆分服务的原则:

  • 服务内不同模块的迭代速度不同:如果某个模块需要频繁更新,而其他模块更新频率较低,则应将这个模块拆分为单独的服务。这有助于加快开发速度,减少对其他模块的影响。
  • 不同的模块负责团队在不同的地域:如果两个团队时区差异较大,为了降低沟通成本和提高开发效率,可以将他们负责的服务拆分开来。
  • 流量差异较大的模块:对于读写比例差异巨大的业务,除了底层数据库读写分离或用CQRS模式外,还可以将读写拆分为不同的服务集群,单独部署。这有助于读接口的扩容和节省成本。
  • 安全要求不同的模块:如果某些模块有特殊的安全要求,应将其拆分为独立的服务。这有助于确保这些模块的安全性,并防止对其他模块造成影响。
  • 三方依赖:将依赖特定功能的三方模块拆分为独立的服务,有助于代码的维护和在三方服务异常时对其他模块的隔离。
  • 功能:这是最常用的拆分方法。但需要注意的是,如果不同的功能都是由同一个人维护,且迭代速度、流量等都相同,则没有必要进行微服务拆分。拆分后反而会因为更多的服务间调用而引发问题。

综上所述,微服务拆分是一个复杂而细致的过程,需要综合考虑多种因素。在实际操作中,我们应结合实际情况和团队能力做出合理的选择。同时,也要保持开放的心态,不断学习和探索新的拆分方法和最佳实践。