目录(?)[+]

公司系统做了一年多,慢慢也有点规模了。从最初只有一个APP + 一个server的模式,到现在有多个子系统,多个客户端。这个过程中,积累了一些想法,本文简单总结一下

系统拆分的好处

基本上,比较小的系统,单进程集中部署就可以了。集中部署不代表一定不好,在系统规模很小的时候,或许是最适合的,因为调用关系简单,开发也比较容易。但是系统慢慢变大了以后,我认为拆分系统,分布式部署就变得更为合理了。

拆分系统至少有这些我体会到的好处:

1、停掉系统的一个部分,只会影响相关业务,不会造成整体业务中断。特别是一个新的模块上线,尚未稳定的时候,可能会有错误挂掉,或者主动重启维护等,如果是集中部署,就会造成整个系统都不可用。但是分布式部署的情况下,只会中断小范围的业务。当然,就算是集中部署,利用集群,分批重启,也可以实现同样的目的

2、对压力大的节点,可以单独部署集群。比如我们的系统,数据同步模块的负载是最高的,那么就可以针对这个子系统单独部署集群,其他负载低的模块,可以部署在一起,或者单独部署,都比较灵活。当然,要实现水平伸缩,对系统设计本身也有要求,比如至少要实现无状态服务等

3、代码分离,便于权限控制。一般来说,集中部署的代码也是在一起的,如果希望负责子系统A的小组,不需要接触到子系统B的代码,那么分成2个代码库就非常容易实现。相反,如果代码都是在一起的,控制就比较困难。因为不能只开放一部分代码给开发人员,这样不利于在本地搭建开发环境

4、按责任田制度,小团队维护特定模块。跟上面一点比较类似,每个小团队的责任边界比较清晰

按业务垂直拆分系统

拆分系统也要根据实际情况,有不同的选择。我们早期的时候是根据业务,垂直拆分子系统,比如划分成微站,数据同步,连锁等。这样做的好处是,每个子系统都是可以独立跑起来的,比如说把微站子系统运行起来,微站的页面就都能访问了,数据也是该系统自己负责读写的。但是缺点也很明显,就是冗余的代码比较多。比如连锁和微站,2个子系统都需要查询企业信息,那么就各自都写了这部分代码,其实接口几乎是一模一样的,存在很大的复用空间。重复行为基本上都是不好的,这个应该说是开发人员的共识

网状结构

后来做了一点调整,基本上子系统还是按照业务拆分的。但是每个子系统都对外提供服务,比如基础数据查询模块,提供了查询企业信息的接口。连锁和微站子系统,自己就不重复查了,而是以HTTP方式,调用基础数据查询模块的这个接口。这种方式的优缺点和上一种方案大致相反。消除了重复代码,但是模块之间存在依赖关系。如果基础数据查询模块不跑起来,那微站模块虽然能跑起来,但是相关的数据就没有了

而且这样调用关系会比较复杂一点,因为本地调用都变成了HTTP接口调用,意味着业务模块,需要知道去哪里调用所需的服务,可能需要配置很多IP地址(如果依赖很多外部服务的话)。并且这个IP地址是经常需要变化的,不同的开发人员,本地的开发环境地址都不一样;开发环境和生产环境的地址也不一样;生产环境的集群配置变化了,也可能造成地址的变化。系统的复杂性变得比较高

星型结构

再后来为了解决这个调用的问题,TOPO演进为星型结构,有一个中心节点。业务模块把所有的内部请求都发到这个中心节点上,由中心节点负责转发到服务提供者上。这样对于业务模块来说,就不需要知道服务提供方的实际地址,只要把所有请求都发到中心节点上就可以了。映射的工作由中心节点来完成,需要类似这样的映射:

service1       192.168.1.110:8080/svc1

service2       192.168.1.110:8080/svc2

service3       192.168.1.111:8080/svc3

……

这个工作,在服务的数量和复杂度不是太高的时候,只需要一个简单的路由就可以了,不需要专门的服务治理方案。比如我们早期采用的就是nginx,把nginx当做内部的服务中心来使用,借助server_name,proxy_pass,up_stream等特性,已经足以满足需求。但是当服务的数量和复杂度达到一个量级,就需要有专门的方案,来处理服务的注册、发布、寻址、负载均衡、队列、失败重试等需求了

子系统拆分的一点总结相关推荐

  1. 浅谈云效中的开发任务拆分

    使用云效公有云版本三个多月,对于任务拆分的一点心得,现在这里分享一下. 任务的定义 任务是从产品到开发到测试一个可以贯穿的概念,在Jira.github 等项目管理软件中,叫做 Issue,Issue ...

  2. 微服务架构技术调研<3>--微服务架构实践

    引言: 由于公司商业上有实打实的需求和场景,倒逼产品开始思考架构升级,以适应这种商业环境的快速变化.架构师在进行技术选型或者架构升级前,需要做大量技术调研.竞品分析,<微服务架构综述>则是 ...

  3. 系统架构-基础篇-(高性能基础建设说明与选型条件)

    本文牵扯的面积可能会比较泛,或者说比较大,在这个层面很多人也有自己的见解,所以我这也仅仅是抛砖引玉,结合前面讲述的一些基础技术,从思想中阐述更为深入的架构思想基础,因为最好的架构思想是架构师结合实际情 ...

  4. 分布式、集群概念汇总(二)

    技术本无好坏,在于适当的使用和积累.框架没有固定模式,主要是根据具体业务去设计最适合的框架. "分布式"基本思想总结 1.系统拆分 大系统小做".对于一个大的复杂系统,首 ...

  5. 爬虫进阶教程:极验(GEETEST)验证码破解教程

    原文链接及原作者:爬虫进阶教程:极验(GEETEST)验证码破解教程 | Jack Cui 一.前言 爬虫最大的敌人之一是什么?没错,验证码![Geetest]作为提供验证码服务的行家,市场占有率还是 ...

  6. 简单是一种美:提高项目成功率的一些方法

    大家都希望自己参与的项目能够成功交付,然而影响每个项目是否成功的因素却千差万别.在此,根据自己的经验,说说一些在适当时候有用的方法,可以从一定程度上提高项目成功率的方法.就像设计模式一样,这些方法的使 ...

  7. 《Java8实战》笔记(07):并行数据处理与性能

    并行数据处理与性能 在Java 7之前,并行处理数据集合非常麻烦. 第一,你得明确地把包含数据的数据结构分成若干子部分. 第二,你要给每个子部分分配一个独立的线程. 第三,你需要在恰当的时候对它们进行 ...

  8. Linux设备驱动开发详解 第3版 (即 Linux设备驱动开发详解 基于最新的Linux 4 0内核 )前言

    Linux从未停歇脚步.Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核.做技术,从来没有终南捷径,拼的就是坐冷板凳的 ...

  9. 直观认识Windows

    每天我们都在使用Windows系统学习.编程.听音乐.玩游戏,Windows的操作想来是很熟练了,可是你又对Windows到底了解多少呢?本系列的目的,就是让你对Windows系统有个更直观.更清楚. ...

最新文章

  1. 完全隐藏Master Page Site Actions菜单只有管理员才可以看见
  2. opengl用什么软件写_汇才论文工具分享:写科研论文的都在用这些截图软件
  3. 循环: 打印1~10
  4. C++11学习笔记-----获取异步操作执行结果
  5. 蓝桥杯 ALGO-52 算法训练 排列问题
  6. Eclipse 相同变量背景高亮显示设置(Occurrences)
  7. 提高Eclipse的运行速度 去掉JPA这个Eclipse 插件
  8. 2019 年度全球程序员薪酬报告:40岁以后普遍遭遇收入天花板
  9. 你熟悉的新华书店,已经变样了 | 数字化案例
  10. Scrapy框架爬取新闻!
  11. C语言排序算法之“选择排序法”
  12. nRF24L01单芯片2.4GHz收发模块射频信道频率
  13. 官方消息:即将开始退钱
  14. JavaSE-part2
  15. 容器化技术【Kubernetes】
  16. 二叉树之前序遍历、中序遍历、后续遍历
  17. 你所知道的文字识别工具有哪些呢?不如看看这几款吧!
  18. Android底部导航栏(带加号、红点提示、数字消息)
  19. linux内核烧写erasing failed,TQIMX6UL开发板手动烧写具体方法
  20. C51#学习笔记01#| Keil软件的使用入门教程

热门文章

  1. Linux怎么看内存是不是ecc,什么是ECC内存?怎么区分内存是不是ECC?
  2. rgb转yuv422 matlab,基于FPGA的RGB到YUV422的数字视频转换.pdf
  3. pytorch_SRU(Simple Recurrent Unit)
  4. 领导最喜欢提拔的10种人
  5. 耳放是什么,怎么使用?
  6. java uuid 32_Java生成32位UUID
  7. 2022年全球市场驱蚊产品总体规模、主要生产商、主要地区、产品和应用细分研究报告
  8. Unity FPS帧率计算
  9. 我在淘宝买了一件东西
  10. 很喜欢的句子,丧的时候就来看看吧