单体应用到分布式系统演变过程

1、单应用架构

早期的系统大部分都是单应用架构,所有的模块集成在一个应用里面,只需要一台应用服务器和一台数据库服务器,随着访问量的增加,服务器负载的慢慢提高,解决性能瓶颈的方案是不断提高服务器的配置。

2、应用服务器集群

随着访问量的继续增加,单台应用服务器已经无法满足需求,假设我们的数据库服务器还没遇到性能问题,我们可以通过增加应用服务器的方式来将应用服务器集群化,这样用户可以分流到各个应用服务器中,从而达到提升系统负载能力的目的。

但是应用服务器集群会带来的问题:

用户请求如何分流到各个应用服务器?

用户如果的两次请求被分配到不同的服务器,如果做到session共享?

为了解决第1个问题,需要在用户请求和应用服务器中间增加负载均衡,负载均衡分硬负载和软负载,硬负载可以选择F5等,软负载可以选择nginx、Apache等,增加了负载均衡后系统架构便变成下面这样。

而第2个关于session共享问题,我们可以通过配置tomcat的session共享或者缓存服务器来实现。

3、数据库读写分离

应用服务器集群提升了应用层的负载能力,但是数据库的负载能力并没有得到提升,那如何去提高数据库的负载能力呢?是不是也能参照应用服务器集群的方式,通过增加数据库服务器来实现呢?数据库读写分离被提了出来:

同样读写分离也会带来新的问题:

主库如何及时将数据同步到读库

应用服务器如何知道要调用哪个数据源

针对第1个问题,各数据库都提供了主从复制的解决方案,如mysql自带master-slave方式实现主从复制。

针对第2个问题,可以使用多数据源或者引入第三方数据库中间件,例如mycat。

4、缓存技术引入

随着访问量的持续增加,会出现许多用户访问统一内容的情况,对于这些数据,没必要每次都去数据库获取,这个时候引入应用层的缓存技术是个很好的选择,例如redis、memcache等。

5、应用拆分

随着业务的继续发展,应用的压力再次增大,同时不断增加的模块使系统变得越来越臃肿,维护工作量也越来越大。这个时候就可以考虑将应用系统进行拆分,按照领域模型拆分成多个子系统。

应用拆分后会带来新的问题,如子系统一中的一个查询在子系统二中也需要查询,是不是这些查询在两个子系统中都分别写一套呢?当然是不行的,一定要把这些抽象出来做成一个服务,这样又生成一个新的问题,多个子系统之间怎么相互访问呢?为了解决这个问题,RPC技术是个很好的选择,比较典型的有:dubbo、webservice、hessian、http、rmi等。

6、数据库垂直拆分

同样的,应用层面性能瓶颈解决后,又轮到数据库了,我们能将应用按照领域模型拆分成一个个应用子系统,数据库也是一样,根据不同的业务拆分成不用的数据库。拆分后数据库可以和拆分后的应用一一对应。

7、数据库水平拆分

数据库进行读写分离、垂直拆分后基本上解决了负载的问题,但是随着业务量的增加,表的数据不断增长,数据查询性能便成了问题,所以必须要多数据库进行水平拆分。水平拆分是将单个表的数据拆分到多个数据库中,如1亿数据的表拆分到10个数据库后,每个表就只有1000w了。

数据库水平拆分后,数据源就变得非常复杂了,让业务系统去控制查询哪个数据源变得不现实,这个时候需要引入第三方的数据库中间件,例如mycat、阿里的drds等。

最后演变出来的便是上图这个相对比较全的分布式架构了,但并不是说最后这个分布式架构一定是最优解决方案,具体选择哪个架构还是要结合业务系统的业务需求和业务量来分析。

最后:

SpringCloud 01_单体应用到分布式系统演变过程相关推荐

  1. 从单体应用转为分布式系统:来自Deliveroo的实践

    过去一年中,Deliveroo在商业和IT领域成长迅速,这导致它的大型单体应用面对不少的技术挑战.Greg Beech在近期的QCon伦敦大会演讲中指出,Deliveroo对此问题的解决方案并非依靠微 ...

  2. 系统设计思想之网络应用系统架构(思想+解决方案)——从单体到分布式系统和系统设计技术点

    总结 之前说过语言是基石头,语言通过系统设计思想形成系统,进而发展了语言,同时也发展了系统自身.系统为何有这么大的魅力,这个的关键就是系统的设计思想,系统设计思想分为架构思想和代码设计思想,一个是宏观 ...

  3. springboot gateway 负载均衡_05_Springbootamp;Springcloud面试题

    点击上方"蓝色字体",选择"设为星标", 可以防止走失! 1 简单说一下springboot? Spring Boot是由Pivotal团队提供的全新框架,其设 ...

  4. SpringCloud微服务架构学习

    SpringCloud 1. 微服务架构理论入门 1.1. 微服务架构概述 微服务架构是一种架构模式,它提倡将单一应用程序划分为一组小的服务,服务之间互相协调,互相配合,为用户提供最终价值.每个服务运 ...

  5. SpringCloud知识概括

    SpringCloud知识概括 SpringCloud简介 Eureka Zookeeper Consul Ribbon OpenFeign Hystrix Gateway Config Bus St ...

  6. 跟着狂神学SpringCloud(Rest环境搭建+Eureka服务注册与发现+ribbon+Feign负载均衡+Hystrix+服务熔断+Zuul路由网关+SpringCloud config分布)

    跟着狂神学SpringCloud SpringCloud 回顾之前的知识- JavaSE 数据库 前端 Servlet Http Mybatis Spring SpringMVC SpringBoot ...

  7. 2021年SpringCloud 精选大厂面试题-【附详细答案】

    1. 微服务是什么? 微服务与微服务架构 微服务的优缺点 2. 微服务之间是如何独立通讯的 微服务通信机制 系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很 ...

  8. 1、SpringCloud入门篇,综合概述

    SpringCloud 微服务概述 什么是微服务 目前的微服务并没有一个统一的标准,一般是以业务来划分 将传统的一站式应用,拆分成一个个的服务,彻底去耦合,一个微服务就是单功能业务,只做一件事. 与微 ...

  9. 基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇

    本文目录 前言 做项目的三大好处 强强联手(天狗组合) 专栏作者简介 专栏的优势 后端规划 1. SpringBoot 和 SpringCloud 的选择 2. Mybatis 和 MybatisPl ...

最新文章

  1. 有趣的Web版Ubuntu Linux
  2. 2000服务器文件共享,Win2000 Server实现对共享文件的监控
  3. 【OpenCV 例程200篇】29. 图像的翻转(cv2.flip)
  4. c#报错不实现接口成员_《C#程序设计》 习 题 集
  5. J.U.C并发框架源码阅读(十七)ReentrantReadWriteLock
  6. Mysql对字段进行分段统计
  7. dedecms 中变量函数
  8. gis环境设置在哪_BIM与GIS如何融合应用?
  9. nba球队查询系统c语言代码,NBA球队中英文对照一览表
  10. mongodb 查多个不等于_MongoDB增删查
  11. 信息论的基本概念和熵的计算
  12. 51单片机驱动数码管显示
  13. 网红电商第一股首份财报继续亏损,如涵的网红效应还能持续多久?
  14. 微信王者登录太多服务器怎样删除,使用微信登录游戏或其他app时,可以使用不同的个人信息登录 选项已满 怎么删除?如图...
  15. oracle元转换为万元,Excel表格中快速实现元转换成以万元显示的方法
  16. python爬取拉钩网信息
  17. 用project做项目计划之 项目成本、预算、基线工期、基线成本、基线时间
  18. python 使用pdfminer3k 读取PDF文档
  19. win7正版微软给你
  20. bzoj1123 [POI2008]BLO 圆方树

热门文章

  1. POJ - 3358 Period of an Infinite Binary Expansion(欧拉定理)
  2. 求n!,C(n,m)和A(n,m)最后的非零位。
  3. Duilib教程-控件练习
  4. 6.OD-Run trace /Hit trace
  5. Ring3下Dll注入方法整理汇总
  6. 学习windows 应用层 inline hook 原理总结
  7. 对现有的所能找到的DDOS代码(攻击模块)做出一次分析----其他(攻击方式)篇
  8. cocos2d-x初探学习笔记(10)--运动中的加速度效果
  9. PyCairo 中的文本
  10. SurfaceView 和 GLSurfaceView