一、架构演进
1、WEB1.0&WEB2.0阶段
时代背景
web1.0 (单体架构):带宽不足,项目内容少,用户量少,对安全性和稳定性要求不高;
web2.0(单体架构搭建集群):带宽提速,用户量增加,门户网站开始活跃,考虑到安全性和稳定性;
存在的问题
- 如何把请求平均的发送给不同的服务器,缓解服务器压力;
- 集群搭建成功后如何实现session共享;
- 数据量庞大时,数据库效率变慢,如何优化;
解决方案
- Nginx- 反向代理解决请求分发,实现负载均衡;
- Redis- 非关系型数据库,实现session共享;
- ElasticSearch- 处理海量数据;
2、垂直架构
- 随着项目不断更新,单体架构中的模块,功能越来越多,并且压力越来越大,完美体现了低内聚,高耦合;
针对以上问题演进出了垂直架构
3、分布式架构
随着项目不断迭代,新老功能相互交互,服务器之间要相互通讯;
架构从垂直架构演变到分布式架构
- 分布式架构落地技术
- 国内的通讯方式有两种:
- HTTP SpringCloud
- RPC Dubbo
分布式架构常见问题
- 服务之间的异步通讯 (MQ-RabbitMQ)
- 服务之间通讯地址的维护**(Eureka、Ribbon)**
- 服务降级**(Hystrix)**
- 海量数据**(Mycat 实现分库分表)**
4、微服务架构
在分布式架构的基础上再次拆分
5、Docker容器化技术
为了解决模块过多,运维成本增加的问题,采用Docker容器化技术来帮助我们管理。
分布式架构下的其他问题
分布式架构帮助我们解决了很多的问题,但是随之也带来了很多问题:
- 分布式事务:
最传统的操作事务的方式,是通过Connection链接对象的方式操作,Spring也提供了声明式事务的操作。
为了解决事务的问题,后续会使用到RabbitMQ | LCN方式来解决。
- 分布式锁:
传统的锁方式,synchronized | Lock锁,在分布式环境下,传统的锁是没有效果的。
为了解决锁的问题,后续会使用到Redis | Zookeeper来解决。
- 分布式任务:
在传统的定时任务下,由于分布式环境的问题,可能会造成任务重复执行,一个比较大的任务,需要可以拆分。
为了解决这个问题,后续会使用到Redis + Quartz | Elastic-Job。