Spring Cloud中的分布式组件五花八门,该怎么学?

发布时间:2024-05-04 16:01

分布式架构的演进

在软件行业,一个应用服务随着功能越来越复杂,用户量越来越大,尤其是互联网行业流量爆发式的增长,导致我们需要不断的重构应用的结构来支撑庞大的用户量,最终从一个简单的系统主键演变成了一个非常复杂的可以支撑高并发的高可用的分布式架构,但是一个系统再复杂也是不断演变来的,所以从另一方面来说,其实是业务(问题)推动了技术的发展。

传统的单体应用

在早期,我们开发的都是单体应用,也就是一个系统所有的模块都在一个服务上:

Spring Cloud中的分布式组件五花八门,该怎么学?_第1张图片

图片

这种传统的应用开发和运维都非常简单,随着用户量的增加,我们发现应用程序的压力越来越大,于是我们会选择对应用进行集群部署:

当然因为选择了集群,我们就需要考虑服务分发的问题,所以需要有负载均衡服务器,比如我们最常用的 nginx,还有 lvs,HaProxy 等,硬件层面也可以选择 F5 来实现负载均衡等等。

当然,在使用了集群之后,我们还需要考虑 session 共享的问题,所以相比较单机架构会稍微复杂一点点,那么到这里我们应用进行了扩展了,这时候发现数据库又到瓶颈了,所以数据库又需要进行扩展。

数据库的扩展可以有两种主流方式:

读写分离

通过读写分离以及在某些场景用分布式存储系统替换关系型数据库的方式,能够降低主库的压力,解决数据存储方面的问题,不过随着业务的发展,主库依然会遇到瓶颈。

分库分表

当采用读写分离之后,如果再次遇到瓶颈,那么就可以采用垂直拆分的方式来实现,垂直拆分的意思是把数据库中不同的业务数据拆分到不同的数据库中。但是这样有些热门模块依然迟早会遇到瓶颈,于是可以更进一步采用水平拆分,水平拆分就是把同一个表的数据拆分到不同的数据库中。

垂直拆分还比较容易处理,毕竟同一个模块的数据还是在一起,水平拆分就会比较复杂了,比如说用户表拆成了两张,存在不同的数据库中,那么存的时候到底该存的哪个库,取的时候又该到哪个库去查询,所以水平拆分需要考虑以下问题:

  • 插入和查询的路由问题,需要根据某一个条件来决定当前数据应该分到哪个库。

  • 主键的处理,主键不能采用自增主键的形式,因为不同的库采用自增主键会有冲突。

  • 如果某些查询需要到两个库去查询,会比较难处理。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号