简单来说,微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务(由单进程演化为多进程),这些服务之间通过基于HTTP的RESTful API进行通信协作。被拆分的每一个小型微服务都各自围绕自身的业务进行构建,数据存储,开发和维护。
在微服务中,需要我们对服务进行组件化分解。然后通过HTTP等通信协议进行协作。每一个服务都独立开发,部署,可以有效避免一个服务的修改引起整个系统的重新部署。
在单体应用中,组件间直接通过函数调用的方式进行交互协作。而在微服务架构中,由于服务不在一个进程中,组件间的通信模式发生了改变,若仅仅将原本在进程内的方法调用改成RPC方式的调用,会导致微服务之间产生繁琐的通信,使得系统表现糟糕,所以我们需要更粗粒度的通信协议
一般采用以下两种:
使用HTTP的RESTful API或轻量级的消息发送协议,实现信息传递与服务调用的触发。通过在轻量级消息总线上传递消息,类似RabbitMQ等一些提供可靠异步交换的中间件。在实施微服务架构时,通过采用轻量级的契约定义接口,使得我们对服务本身的具体技术平台不再那么敏感,这样整个微服务架构系统中的各个组件就能争对其不同的业务特点选择不同的技术平台。终于不会出现杀鸡用牛刀或是杀牛用指甲钳的尴尬处境了。
数据管理去中心化:让每一个服务来管理其自有的数据库。
不过,由于数据存储于不同的数据库实例中后,数据一致性也成为微服务架构中亟待解决的问题之一。所以在微服务架构中,我们更强调在各服务之间进行"无事务"的调用,而对数据一致性,只要求数据在最后的处理状态是一致的即可:若在过程中发现错误,通过补偿机制来进行处理,使得错误数据能够达到最终的一致性。
单体应用中,一般不存在单个组件故障而其他部件还在运行的情况,通常是一挂全挂。而在微服务架构中,则会出现部分服务出现故障,而其他服务正常运行的情况。所以,在服务架构中,快速检测出故障源并尽可能地自动恢复是必须被设计和考虑的。通常,我们都希望在每个服务中实现监控和日志记录的组件,比如服务状态,断路器状态,吞吐量,网络延迟等关键数据的仪表盘等。