微服务架构的演变

微服务是一种服务间松耦合的、每个服务之间高度自治并且使用轻量级协议进行通信的可持续集成部署的分布式架构体系。这一句包含了微服务的特点,微服务架构和其他架构有什么区别?以下对比一些常见的架构。

单体架构

单体架构是最简单的软件架构,常用于传统的应用软件开发以及传统Web应用。传统Web应用,一般是将所有功能模块都打包(jar,war)在一个Web容器(JBoss、Tomcate)中部署、运行。随着业务复杂度增加、技术团队规模扩大。在一个单体应用中维护代码,会降低开发效率。即使是处理一个小需求,也需要将所有机器上的应用全部部署一遍,增加了运维的复杂度。

SOA架构

当某一天使用单体架构发现很难推进需求的开发、以及日积月累的技术债,很多企业会开始做单体服务的拆分。拆分的方式一般有水平拆分以及垂直拆分。垂直拆分把一个应用拆成松耦合的多个独立的应用,让应用可以独立部署,有独立的团队进行维护。水平拆分把一些通用的,会被很多上层服务调用的模块独立拆分出去,形成一个共享的基础服务,这样拆分可以对一些性能瓶颈的应用进行单独的优化和运维管理,也一定程度防止了垂直拆分的重复造轮子。
SOA也叫面向服务的架构,从单体服务到SOA的演进,需要结合水平拆分以及垂直拆分。SOA强调用统一的协议进行服务间的通信,服务间运行在彼此独立的硬件平台但是需通过统一的协议接口相互协作,也即将应用系统服务化。举个易懂的例子,单体服务如果相当于一个快餐店,所有的服务员都是一样的,又要负责收银结算,又要负责做汉堡,又要负责端盘子,又要负责打扫,服务员之间不需要有交流,一个用户来了一个服务员从前到后负责到底。SOA相当于让服务员有职责分工,收银员负责收银,厨师负责做汉堡,保洁阿姨负责打扫等等。所有服务员需要同一种语言交流,方便工作协调。

微服务和SOA

微服务也是一种服务化,不过其和SOA架构的服务化概念也是有区别的。可以从几个关键字来理解:

  1. 松耦合: 每个微服务内部都可以使用DDD(领域驱动设计)的思想进行设计领域模型,服务间尽量减少同步的调用,多使用消息的方式让服务间的领域事件来进行解耦。
  2. 轻量级协议:Dubbo是SOA的开源的标准实现之一,类似的还有像gRPC、Thrift等。微服务更倾向于使用Restful风格的API,轻量级的协议可以很好得支持跨语言开发的服务,可能有的微服务用Java实现,有的用Go语言,有的用C++,但所有的语言都可以支持Http协议通信,所有的开发人员都能理解Restful风格API的含义。
  3. 高度自治和持续集成:从底层的角度来说,SOA更加倾向于基于虚拟机或者服务器的部署,每个应用都部署在不同的机器上,一般持续集成工具更多是由运维团队写一些shell脚本以及提供基于共同协议(比如dubbo管理页面)的开发部署页面。微服务可以很好得和容器技术结合,容器技术比微服务出现得晚,但是容器技术的出现让微服务的实施更加简便。目前Docker已经成为很多微服务实践的基础容器。因为容器的特色,所以一台机器上可以部署几十个几百个不同的微服务。如果某个微服务流量压力比其他微服务大,可以在不增加机器的情况,在一台机器上多分配一些该微服务的容器实例。同时,因为Docker的容器编排社区日渐成熟,类似Mesos,Kubernetes以及Docker官方提供的swarm都可以作为持续集成部署的技术选择。

其实从架构的演进的角度来看,整体的演进都是朝着越来越轻量级,越来越灵活的应用方向。甚至到近两年日渐成熟起来的Serverless(无服务)架构。从单体服务到分层的服务,再到面向服务、再到微服务甚至无服务。对于架构的挑战是越来越大的。

微服务架构和分布式

微服务架构属于分布式系统吗?答案是肯定的。微服务和SOA都是典型的分布式架构,只不过微服务的部署粒度更细,服务扩展更灵活。

理解微服务中的分布式

怎样理解微服务中的分布式?举一个招聘时一个来面试同学的例子。A同学,说目前所在公司在做从单应用到微服务架构迁移,已经差不多完成了。提到微服务感觉就有话题聊了,于是便问“那能简单描述下服务拆分后的部署结构、底层存储的拆分、迁移方案吗?”。于是A同学说,只是做了代码工程结构的拆分,还是原来的部署方式,数据库还是那个库,所有的微服务都用一个库,分布式事务处理方式是“避免”,尽量都同步调用……于是我就跟这位同学友好地微笑说再见了。
微服务的分布式不仅仅是容器应用层面的分布式,其为了高度自治,底层的存储体系也应该互相独立。并且也不是所有的微服务都需要持久化的存储服务。一个“手机验证码”微服务可能底层存储只用一个Redis。一个“营销活动搭建页面”微服务可能底层存储只需要一个MongoDB。
微服务中的分布式场景除了服务本身需要有服务发现、负载均衡。微服务依赖的底层存储也会有分布式的场景: 为了高可用性和性能需要处理数据库的复制、分区。并且存储的分库情况下,微服务需要能保证分布式事务的一致性。