微服务

2021/12/08 架构与设计 共 1912 字,约 6 分钟

在开聊微服务之前,我先要你和介绍下单体应用。如果你不知道单体应用的痛,那也不会深刻理解微服务的价值。

单体应用

以 MVC 架构为例,业务通常是通过部署一个 WAR 包,然后启动 Tomcat,监听某个端口即可对外提供服务。早期在业务规模不大、开发团队人员规模较小的时候,采用单体应用架构,团队的开发和运维成本都可控。

然而随着业务规模的不断扩大,单体应用架构就会开始出现问题。

  • 部署和发布效率低。当单体应用的代码越来越多,依赖的资源越来越多时,应用编译打包、部署测试一次,需要的时间较长。
  • 团队协作开发成本高。测试阶段只要有一块功能有问题,就得重新部署测试,所有相关人员得参与其中,效率低下,开发成本极高。
  • 系统高可用性差。一旦某一功能涉及的代码或者资源有问题,那就会影响整个 WAR 包中部署的功能,比如内存泄露。
  • 扩展性差。单体服务只能作为一个整体扩展,即使只有小部分存在性能问题,也需要整个服务扩展。

想要解决上面这些问题,服务化的思想也就应运而生。

微服务

微服务就是一些小而自治并协同工作的服务。

那么微服务相比于服务化有什么不同呢?

  • 服务拆分粒度更细。微服务可以说是更细维度的服务化,小到一个子模块,只要该模块依赖的资源与其他模块都没有关系,那么就可以拆分为一个微服务。
  • 服务独立部署。每个微服务都严格遵循独立打包部署的准则,互不影响。
  • 服务独立维护。每个微服务都可以交由一个小团队甚至个人来开发、测试、发布和运维,并对整个生命周期负责。
  • 服务治理能力要求高。因为拆分为微服务之后,服务的数量变多,因此需要有统一的服务治理平台,来对各个服务进行管理。

由此可见,微服务化给服务的发布和部署,以及服务的保障带来了诸多好处。

主要好处

  • 技术异构性。可以在不同的服务中使用最适合该服务的技术,例如可以使用不同的开发语言和不同的数据存储技术。
  • 弹性。如果系统的一个组件不可用了,并不会导致级联故障,可以很好地处理服务不可用和功能降级问题。
  • 扩展。可以针对部分存在性能问题的服务进行扩展,而在单体应用中必须整体扩展。
  • 简化部署。各个服务的部署是独立的,可以更快地对特定部分代码部署,出了问题也只会影响一个服务,可以快速回滚。

服务化拆分的前置条件

一般情况下,业务系统引入新技术就必然会带来架构的复杂度提升,在具体决策前,你先要认识到新架构会带来哪些新的问题,这些问题你和你的团队是否能够解决?如何解决?是自己投入人力建设,还是采用业界开源方案?

下面几个问题,是从单体应用迁移到微服务架构时必将面临也必须解决的。

  • 服务如何定义。对于单体应用来说,不同功能模块之前相互交互时,通常是以类库的方式来提供各个模块的功能。对于微服务来说,每个服务都运行在各自的进程之中,应该以何种形式向外界传达自己的信息呢?答案就是接口,无论采用哪种通讯协议,是 HTTP 还是 RPC,服务之间的调用都通过接口描述来约定,约定内容包括接口名、接口参数以及接口返回值。
  • 服务如何发布和订阅。单体应用由于部署在同一个 WAR 包里,接口之间的调用属于进程内的调用。而拆分为微服务独立部署后,服务提供者该如何对外暴露自己的地址,服务调用者该如何查询所需要调用的服务的地址呢?这个时候你就需要一个类似登记处的地方,能够记录每个服务提供者的地址以供服务调用者查询,在微服务架构里,这个地方就是注册中心。
  • 服务如何监控。通常对于一个服务,我们最关心的是 QPS(调用量)、AvgTime(平均耗时)以及 P999(99.9% 的请求性能在多少毫秒以内)这些指标。这时候你就需要一种通用的监控方案,能够覆盖业务埋点、数据收集、数据处理,最后到数据展示的全链路功能。
  • 服务如何治理。可以想象,拆分为微服务架构后,服务的数量变多了,依赖关系也变复杂了。比如一个服务的性能有问题时,依赖的服务都势必会受到影响。可以设定一个调用性能阈值,如果一段时间内一直超过这个值,那么依赖服务的调用可以直接返回,这就是熔断,也是服务治理最常用的手段之一。
  • 故障如何定位。在单体应用拆分为微服务之后,一次用户调用可能依赖多个服务,每个服务又部署在不同的节点上,如果用户调用出现问题,你需要有一种解决方案能够将一次用户请求进行标记,并在多个依赖的服务系统中继续传递,以便串联所有路径,从而进行故障定位。

小结

无论是纵向拆分还是横向拆分,都是将单体应用庞杂的功能进行拆分,抽离成单独的服务部署。

但并不是说功能拆分的越细越好,过度的拆分反而会让服务数量膨胀变得难以管理,因此找到符合自己业务现状和团队人员技术水平的拆分粒度才是可取的。我建议的标准是按照每个开发人员负责不超过 3 个大的服务为标准,毕竟每个人的精力是有限的,所以在拆分微服务时,可以按照开发人员的总人数来决定。

文档信息

搜索

    Table of Contents