使用微服务架构可以为我们带了好处、便利的同时,但也带了很多挑战,新的问题。比如,微服务之间的调用和调用和通信会不会很复杂? 通讯模式,一对一还是一对多的?依赖的服务没有准备好,如何验证我的开发功能?数据一致性的问题等等。 总结起来:
为了解决这些问题,我们在设计微服务架构时,必须进行全盘考虑,权衡利弊,这样才能做出合理的抉择,达到最佳的效果,从而达到我们复杂系统微服务拆分的最终目的。接下来我们来讨论讨论设计思想。
微服务架构设计首要任务根据给定的因素粗粒度将业务功能合理的划分微服务。每个公司每个复杂系统业务划分区域都不同,但都可以基于这两种方式创建微服务:
基于分布式的高性能、高并发的设计,结合Rest API微服务和Web UI微服务可以构建一个适应任何规模访问的多维的稳定牢固,且扩展性良好的系统平台。
在微服务设计中,微服务治理能力是至关重要的,甚至一个微服务系统好坏,取决微服务治理能力。可以使用治理组件和服务来管理统筹庞大分布式系统,确保系统处于有序不乱、稳定而高效。
这里只提供Spring Cloud基础组件(选择治理组件应该基于公司的情况而定),包括:
这些组件是如何进行微服务治理的呢?主要过程如下图:
Rest API微服务实现功能:
Rest API微服务主要是关于涉及数据库,其中,数据管理基于数据库实现数据持久化。接口开发根据Restful规范使用GET、POST、PUT、DELETE对数据进行CRUD操作。
但最重要的如何设计Rest API微服务,其性能将对整个系统的性能至关重要,起决定性作用。这边提供一下方案:
数据库中间件实现读写分离
使用数据缓存也是可以提搞数据存取性能,可使用Redis等高性能的NoSQL数据库。但为了提供缓存的命中率,需遵守:
保持Rest API微服务的独立性,禁止在Rest API微服务中之间进行互相调用。
基于Rest API微服务前后端分离的垂直划分-Web UI微服务包括两个功能:
在设计Web UI微服务主要考虑是高并发的问题,可以通过以下方法来实现高并发:
在Rest API微服务,使用FeignClient实现负载均衡调用。FeignClient自动实现了Zuul动态路由和Ribbon负载均衡服务
使用Hystrix组件实现断路器的设计,提供对服务访问容错设计和降级使用机制。
使用非阻塞的异步调用实现高并发
使用分布式文件系统,将图片、视频等资料独立一个分布式文件系统管理。比如,FastDFS。
为了保证各个微服务的独立性,并减少通信的复杂性,提高微服务之间的调用效率,我们对微服务之间的调用,遵循如下规定:
对于微服务的多服务架构数据需确保数据一致性,可以基于CAP原理的BASE理论来合理设计。具体实现操作:
CAP(Consistency,Availability,Partition tolerance)即一致性、可用性、分区容错性三者不可兼得
BASE(Basically Avaiable,Soft state,Eventually consistent)即基本可用、软状态、最终一致性。BASE是对CAP中一致性和可用性进行权衡的结果