许多大公司如阿里巴巴,腾讯,微博,滴滴等,已经采用现在所谓的微服务架构模式解决了我们前文所提到的单体应用遇到的种种问题。主要的思路:将应用程序分解成一套较小的互连服务。
一、微服务解决方案
一个服务通常实现了一组不同的特性或功能,例如订单管理、客户管理等。每一个微服务都是一个小型迷你应用,在需要依赖的地方,通过REST API连接其他所需要的服务之星业务逻辑。
1.微服务架构
一些微服务会向外暴露一组供其他模块访问和使用的API。其他微服务实现了自己的业务逻辑,在必要时,可以通过API进行业务逻辑访问。比如,之前提到的单体应用,通过拆解后,可以变成如下的架构:
具体的表现为:**应用程序的每个功能区域现在都由自己的微服务实现。**例如,以我们的出租车系统为例,一个是乘客的应用,一个是司机的应用。这使得它更容易地为特定的用户、司机、设备或者专门的用例部署不同的场景。每个后端服务暴露一个REST API,大部分服务消费的API由其他服务提供。例如,Driver Management 使用了 Notification 服务器来通知可用司机一个可选路程。UI服务调用了其他服务来渲染页面。
2.微服务与数据库的关系
既然我们将微服务架构模式明显影响到了应用程序与数据库之间的关系,与其他共享单个数据库模式服务有所不同,其每一个服务都有自己的数据库模式。一方面,这种做法与企业级数据库数据模型的想法相背,此外,它经常导致部分数据冗余。对于微服务架构而言,每一个服务都应该有自己的数据库模式,因为它能实现松耦合。如下图所示:
这种模式下设计架构的特点是每个服务都拥有各自的数据库。而且,服务可以使用一种最适合其需求、号称多语言持久架构的数据库。比如,Driver Management要找到与潜在乘客接近的司机,就必须使用支持高效地理查询的数据库。
【补充:伸缩立方】
无论是单体应用还是微服务架构的应用,在实际的生产环境和数据量增加时,都会面临着应用扩展的需要,用以来提高处理能力。在进行系统伸缩性的探索上,有不同的方法。通常,我们常见的提高系统伸缩性能的方法有以下几种:
通过负载均衡器后运行的多个拷贝构成,有N份拷贝,则没份负责处理1/N的负载。比如,当我们的系统流量过大时,我们常常会部署到多个Tomcat上,这些Tomcat均挂载在同一台负载均衡器上,这样每一台Tomcat所处理的业务量就降低为原来的一部分。如下图所示:
对数据库进行分解。原来是所有的业务和功能都存放在统一的数据库中,比如叫db1。为了提高系统性能,提高处理数据的能力,可以将原本是耦合,依赖在同一个系统中的业务模块拆分为小规模的多个业务模块,也就是我们说的微服务的实现架构,每个微服务都只实现核心功能,比如订单模块拆分为一个微服务,支付模块拆分为一个微服务。在拆分的过程中,因为每个微服务是独立部署的,所以订单模块对应的订单表存在于一个数据库db1中,支付模块所对应的支付表存在于另外一个数据库db2中。这样就完成了由一个数据库到多个数据库的拆分。如下图所示:
对数据表进行拆分。数据库中,同一张表格的数据量过大时,我们的查询等业务在操作数据库时会变得效率下降,我们需要通过其他的方式来提高数据库操作的效率。解决这种同一张表数据的数据量过大的问题,通过拆表来解决。比如我们将0-10000000的数据存放在第1个表中,将10000001-20000000数据存放在第2个表中,依次类推。当我们操作数据库时,到对应的数据库中查询就可以了。如下图所示:
伸缩立方
伸缩立方是一本技术书籍中提出的概念,这本书的名称为《The Art of Scalability》。
经过上述我们给大家介绍的系统伸缩性解决方案,进而解释一下伸缩立方。在上述伸缩立方的表当中,分为X轴,Y轴,Z轴。具体轴的方案如下:
- **X轴:**运行多个负载均衡器后的多个实例。
- **Y轴:**对应用进一步分解为微服务(分库)
- **Z轴:**大数据量时,对数据进行分区(分表)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!