目录:

一、什么是分布式系统?

二、为什么要走分布式系统架构?

三、系统如何进行拆分?

四、分布式之后带来的技术挑战?

一、什么是分布式系统?

在谈分布式系统架构前,我们先来看看,什么是分布式系统?

假设原来我们有一个系统,代码量30多万行。现在拆分成20个小系统,每个小系统1万多行代码。

原本代码之间都是直接基于Spring框架走JVM内存调用,现在拆开来,将20个小系统部署在不同的机器上,然后基于分布式服务框架(比如dubbo)搞一个rpc调用,接口与接口之间通过网络通信来进行请求和响应。

所以分布式系统很重要的特点就是服务间要跨网络进行调用,我们来看下面的图:

此外,分布式系统可以大概可以分成两类。

1. 底层的分布式系统。

比如hadoop hdfs(分布式存储系统)、spark(分布式计算系统)、storm(分布式流式计算系统)、elasticsearch(分布式搜索系统)、kafka(分布式发布订阅消息系统)等。

2. 分布式业务系统

分布式业务系统,把原来用java开发的一个大块系统,给拆分成多个子系统,多个子系统之间互相调用,形成一个大系统的整体。

举个例子,假设原来你做了一个OA系统,里面包含了权限模块、员工模块、请假模块、财务模块,一个工程,里面包含了一堆模块,模块与模块之间会互相去调用,1台机器部署。

现在如果你把他这个系统给拆开,权限系统,员工系统,请假系统,财务系统,4个系统,4个工程,分别在4台机器上部署。

然后一个请求过来,完成这个请求,员工系统去调用权限系统,调用请假系统,调用财务系统,4个系统分别完成了一部分的事情。

最后4个系统都干完了以后,才认为是这个请求已经完成了。这就是所谓的分布式业务系统。

同样,我们来一张图,感受一下上述过程:

二、为什么要走分布式系统架构?

有的同学可能要问了,我一台服务器跑的好好的,所有系统一个工程全部搞定,多好。为啥一定要去搞什么分布式系统架构,互相调用还要走远程,似乎还增加了不少工作量?

这里我就以我曾经待过的一个公司的血泪经历为例,来聊聊这个问题。

很多年前,在没有走分布式架构的时候,我待的这家公司的各个业务线都是垂直的 “烟囱式” 项目。

随着互联网的快速发展,公司的业务也在不断的发展,注册用户增加、网站应用的功能、规模不断扩大,特别是移动互联网的发展,APP、微信、自助终端机等访问渠道的增加,各种新业务,新需求不断涌入,系统遇到了各种各样的问题。

首先是项目工程无节制的变得臃肿庞大,系统复杂度增加,大几十万行代码,几十个开发人员,service层,dao层代码大量被copy使用,经常各种代码合并冲突问题要处理,非常耗费时间。

经常是我改动了我的代码,别人调用了我的接口,导致他的代码也出现问题,需要重新测试,麻烦的要死。

然后每次发布都是几十万行代码的系统一起发布,大家得一起提心吊胆准备上线,几十万行代码的上线,每次上线都要做很多的检查,很多异常问题的处理,每个人都高度紧张,被搞得几乎崩溃。

而且如果我现在有个新业务,打算把相关依赖升级一下,比如升级到最新的spring版本,还不行,因为这可能导致别人的代码报错,不敢随意乱改技术。并且一个web工程每次启动都需要好分钟的时间,本地IDE里面调试一次代码都很痛苦。

其次,随着用户访问流量的增加,系统负载压力变大,变得不堪重负,通过增加实例数,增加硬件扩容能够带来的效果已微乎其微,故障频发,效率低下。系统质量也越来越难以保证,测试周期也变得越来越长,无法满足公司业务发展的需要。

以上就是以前待过的公司一些 “不堪回首” 的往事,总得来说,问题主要体现在以下几个方面:

  1. 应用代码耦合严重,功能扩展难

  2. 新需求开发交互周期长,测试工作量大

  3. 新加入的开发同事需要很长时间才能熟悉系统

  4. 升级维护也很困难(改动任何一点地方都要升级整个系统)

  5. 系统性能提升艰难,可用性低,不稳定。

好,既然我们已经深刻体会到了系统耦合的痛苦,那么现在就来看看,系统拆分后带来的好处:

首先,系统拆分了以后,会感觉整个世界都清爽了。

几十万行代码的系统,假设拆分成20个服务,平均每个服务就1-3万行代码,每个服务部署到单独的机器上。20个工程,就用20个git仓库代码,20个开发人员,每个人维护自己的那个服务就可以了。

  • 因为是自己独立的代码,跟别人没关系。再也没有代码冲突了,爽!

  • 每次就测试我自己的代码就可以了,爽!

  • 每次就发布我自己的一个小服务就可以了,爽!

  • 技术上想怎么升级就怎么升级,保持接口定义不变,输入输出内容不变就可以了,爽!

总结起来一句话,分布式系统拆分之后,可以大幅度提升复杂系统大型团队的开发效率。

三、系统如何进行拆分?

一般来说,将系统进行拆分,首先需要对系统整体比较熟悉。可以走多轮拆分的思路,第一次拆分就是将以前的各个大的模块粗粒度的拆分开来。

比如一个电商系统可以拆分成订单系统、商品系统、店铺系统、会员系统、促销系统、支付系统等等。

后面可能每个系统又变得越来越复杂了,比如说订单系统又可以进一步拆分出来购物车系统,库存系统,价格系统等。

总得来说就是基于领域驱动设计的思想以及实战经验总结,同时参考业界一些常规做法,大家讨论着来进行拆分,逐步优化,多轮拆分,小步快跑,最终达到一个比较好的状态。

四、分布式之后带来的技术挑战?

首先就是分布式服务框架的选用,目前国内来讲主流的还是dubbo与spring cloud。

我们来思考一下,使用服务框架主要用来解决什么问题呢?如果不用dubbo或者spring cloud是否可以做分布式架构呢?

不用dubbo或者spring cloud等服务框架当然也是可以的,但是这就需要自己处理很多事情了。

比如,各个子系统走restful接口调用,那么就是http调用,这时比如传送过去一个对象,就要自己搞成一个json,然后一次调用失败后重试怎么做?

另外,一般来说都是集群部署,目标系统有多个实例,那么自己还要写一个负载均衡算法,如何每次随机从多个目标机器中挑选一个来调用?

还有,如果目标系统扩容新部署了一个实例,或者服务器故障下线了一个实例,如何动态让调用方感知到呢? 诸如此类的很多问题,如果不用服务框架的话,自己这么瞎搞,会遇到各种各样的问题。

上述过程,用一张图给大家呈现一下:

如果选用了某一个分布式服务框架,就需要深入的掌握这个框架的使用与底层原理,比如 dubbo 就需要搞明白以下的一些问题:

  1. dubbo的工作原理?

  2. dubbo支持的序列化协议?

  3. dubbo的负载均衡和高可用策略?动态代理策略?

  4. dubbo的SPI思想?

  5. 如何基于dubbo进行服务治理、服务降级、失败重试以及超时重试?

  6. dubbo服务接口的幂等性如何设计(比如不能重复扣款,不能重复生成订单,不能重复创建卡号)?

  7. dubbo服务接口请求的顺序性如何保证?

  8. 如何自己设计一个类似dubbo的rpc框架?

使用spring cloud也是一样,比如eureka的工作原理?feign声明式调用的原理?等等各种底层原理要搞懂。

还有其它一些走分布式架构后常见的要解决的技术问题:

  1. 分布式会话

  2. 分布式锁

  3. 分布式事务

  4. 分布式搜索

  5. 分布式缓存

  6. 分布式消息队列

  7. 统一配置中心

  8. 分布式存储,数据库分库分表

  9. 限流、熔断、降级等。

分布式系统架构简单介绍相关推荐

  1. 自己动手写处理器之第一阶段(3)——MIPS32指令集架构简单介绍

    将陆续上传本人写的新书<自己动手写处理器>(尚未出版).今天是第四篇.我尽量每周四篇 1.4 MIPS32指令集架构简单介绍 本书设计的处理器遵循MIPS32 Release 1架构,所以 ...

  2. 公司网络架构简单介绍

    公司网络架构简单介绍 公司服务器架构简单介绍: CDN:租用的,用于提高用户访问速度 前边两台LVS:实现负载均衡和高可用 三台Nginx服务器提供Web服务 三台Tomcat服务器当动态Web服务 ...

  3. 3种应用架构简单介绍

    1.单一架构:将所有的应用(业务)放到一台服务器上运行,如公司管理系统/超市收银系统. 2.垂直应用架构 将大应用拆分成为多个小应用(一般按照业务拆分),根据不同的访问频 率决定各自业务部署的服务器数 ...

  4. Web服务器架构简单介绍

    服务器开发的流程图 服务器架构的设计思路 服务器设计思路

  5. MVVM架构简单介绍

    在这里我们要使用其支持库Data Binding来实现mvvm架构 model-view-viewmodel 三个部分 1.配置model(app) 的build.gradle android { . ...

  6. Hive代码组织及架构简单介绍

    2019独角兽企业重金招聘Python工程师标准>>> hive三个主要组件 Serialzers/Deserialzers(trunk/serde)     此组件允许用户自己开发 ...

  7. Apollo架构体系、Apollo运行原理、Apollo配置中心简单介绍(一)

    笔者在工作中遇到如下问题,随着程序功能越多,配置文件不断增加,一些功能的开关.服务器地址.接口地址.不同环境的一些配置文件不同,这些在每次发布不同环境.更新项目时都比较繁琐,后来学习微服务时接触到了S ...

  8. 从Elasticsearch来看分布式系统架构设计,真是666~

    欢迎关注方志朋的博客,回复"666"获面试宝典 分布式系统类型多,涉及面非常广,不同类型的系统有不同的特点,批量计算和实时计算就差别非常大.这篇文章中,重点会讨论下分布式数据系统的 ...

  9. 机器学习排序之Learning to Rank简单介绍

     机器学习排序之Learning to Rank简单介绍 标签: Learning to Rank学习排序PointwisePairwiseListwise 2015-01-03 21:50 23 ...

  10. 《大规模分布式系统架构与设计实战》

    <大规模分布式系统架构与设计实战> 基本信息 作者: 彭渊 丛书名: 大数据技术丛书 出版社:机械工业出版社 ISBN:9787111455035 上架时间:2014-2-21 出版日期: ...

最新文章

  1. Oracle 11g 客户端使用
  2. mac os10.11上使用proxychains
  3. wall poj 1113
  4. 从镜像安装vs2010MSDN,错误“您没有权限修改为帮助内容存储区指定的位子下的内容......
  5. 信息安全三要素(CIA)
  6. m5310模组数据上传至onenet_5G通信模组799元限量发售,中国移动意欲何为?
  7. 中文邮件营销html模版,怎么制作邮件营销模板?— —邮件格式
  8. GAN的一些重要论文
  9. 改动office outlook 2007默认文件夹的存放位置
  10. 将node.js程序作为服务,并在windows下开机自动启动(使用forever)
  11. join(long)与sleep(long)的区别
  12. EDI 电子数据交换(Electronic data interchange,缩写EDI)
  13. C# 通过DirectInput 实现手柄操控
  14. 故障:PDF 文件打印失败
  15. SolidEdge完整安装教程-亲测
  16. 如何授权接入芝麻小客服系统?
  17. FPGA开发——SRIO
  18. 安卓学习专栏——百度地图(6)移动到我的位置(图文+代码)
  19. 电脑老是显示无网络连接到服务器,电脑怎么老弹出无法与服务器建立连接
  20. 中国中产阶级“被中产”?

热门文章

  1. 财智家庭理财软件 V5.5 精锐版
  2. 基于单片机的导盲拐杖设计
  3. web聊天类数据库功能表结构如何设计?
  4. Zune软件教程 Windows Phone同步攻略
  5. AI 诊断新算法,可提前十年查出老年痴呆症;济南酒店推行“人脸识别”,没带证件也可住店...
  6. 大学生河南旅游网页设计成品 学生网页作业我的家乡网页制作代码 静态HTML旅游网页设计作品下载
  7. linux如何磁盘管理工具下载,Linux_Linux系统的磁盘空间管理工具, 1.fdisk -lDis - phpStudy...
  8. linux环境模拟器,在Linux环境下玩PlayStation模拟器
  9. 云莲MK8215_联芸MAS0902固态硬盘开卡教程,量产工具软件下载
  10. 如何新浪微博html5,新浪微博接入Html5游戏 注重轻量碎片化