微服务

更多干货

  • 微服务什么?
  • 微服务解决了什么问题?
  • 微服务有什么特点?

单体架构是什么

  • 一个归档包包含了应用所有功能的应用程序, 我们通常称之为单体应用。
  • 架构单体应用的架构风格, 我们称之为单体架构, 这是一种比较传统的架构风格。

单体架构存在的缺点

复杂性逐渐变高

  • 以一个百万行级别的单体应用为例,整个项目包含的模块非常多,模块的边界模糊,依赖关系不清晰,代码质量参差不齐,混乱地堆砌在一起……整个项目非常复杂。每次修改代码都心惊胆战,甚至添加一个简单的功能,或者修改一个BUG都会造成隐含的缺陷。  

技术债务逐渐上升

  • 随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多。“不坏不修(Not broken,don’t fix)”,这在软件开发中非常常见,在单体应用中这种思想更甚。已使用的系统设计或代码难以修改,因为应用程序的其他模块可能会以意料之外的方式使用它。

部署频率低

  • 随着代码的增多,构建和部署的时间也会增加。而在单体应用中,每次功能的变更或缺陷的修复都会导致我们需要重新部署整个应用。全量部署的方式耗时长、影响的范围大、风险高,这使得单体应用项目上线部署的频率较低。而部署频率低又导致两次发布之间会有大量的功能变更和缺陷修复,出错概率比较高。

扩展能力受限

  • 单体应用只能作为一个整体进行扩展,无法结合业务模块的特点进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的CPU;有的模块则是IO密集型的,需要更大的内存。由于这些模块部署在一起,我们不得不在硬件的选择上做出妥协。

阻碍技术创新

  • 单体应用往往使用统一的技术平台或方案解决所有问题,团队的每个成员都必须使用相同的开发语言和框架,想要引入新的框架或技术平台会非常困难。例如,一个使用Struts 2构建的、100万行代码的单体应用,如果想要换用Spring MVC,切换成本无疑是非常高的。

无法按需伸缩

架构的演进

  • 单体架构
  • SOA
  • 微服务

什么是微服务

  • Martin Fowler:简而言之,微服务架构风格这种开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统的。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这样轻量的机制来相互通信。这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。

微服务具备的特性

  • 每个微服务可独立运行在自己的进程里
  • 一系列独立运行的微服务共同构建起了整个系统
  • 每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如:订单管理、用户管理等
  • 微服务之间通过一些轻量的通信机制进行通信,例如通过REST API或者RPC的方式进行调用
  • 微服务之间通过一些轻量的通信机制进行通信,例如通过REST API进行调用;
  • 可以使用不同的语言与数据存储技术;
  • 全自动的部署机制。

微服务优点

易于开发和维护

  • 一个微服务只关注一个特定的业务功能,所以它的业务清晰、代码量较少。开发和维护单个微服务相对是比较简单的。而整个应用是由若干个微服务构建而成的,所以整个应用也会维持在可控状态。

启动较快

  • 单个微服务代码量较少,所以启动会比较快。

局部修改容易部署

  • 单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。

技术栈不受限

  • 在微服务中,我们可以结合项目业务及团队的特点,合理地选择技术栈。例如某些服务可使用关系型数据库MySQL;某些微服务有图形计算的需求,我们可以使用Neo4J;甚至可以根据需要,部分微服务使用Java开发,部分微服务使用NodeJS进行开发。

按需伸缩

  • 我们可以根据需求,实现细粒度的扩展。例如:系统中的某个微服务遇到了瓶颈,我们可以结合这个微服务的业务特点,增加内存、升级CPU或者是增加节点。

微服务带来的挑战

运维要求较高

  • 更多的服务意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行;而在微服务中,需要保证几十甚至几百个服务的正常运行与协作,这给项目的运维带来了很大的挑战。

分布式的复杂性

  • 使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都给我们带来了很大的挑战。

接口调整成本高

  • 微服务之间通过接口进行通信。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。

重复劳动

  • 很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。

微服务设计原则

  • 单一职责原则
  • 服务自治原则:服务是实体,它们独立地配置、更新和管理
  • 轻量级通信原则
  • 接口明确原则:每个服务的对外接口应该明确定义,并尽量保持不变。

微服务开发框架浅谈

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐