文章目录

  • 留念
  • 当前架构
  • 当前部署
  • 下一版架构图
  • 下一版部署图

留念

应几位朋友之邀,放一下图,也给自己留个纪念,数年后回想起,曾经我花了半年迭代出这么一个设计,哈哈,不知道到时候是什么感觉,会不会像我现在看一年前的设计图一样感觉傻,还是为进步而开心。

然后,本文的所有知识点都在我的其他博客中可以找到,我不会放链接,信我的,在我的博客主页搜索;


当前架构

土是土了点,应该能叫“架构图”了吧。

稍微解释一下:

网络层:muduo + pb + tcp/ip + api安全接口设计。
选择 muduo 是因为它是我目前技术栈里最高可用的网络库了。注:我的毕设是一个高可用系统。
选择 pb,我试过,同样一个包,pb 压缩后所占空间直接是 json 的 1/5 左右,甚至对于 0 值,pb 是直接省略的,这也可以拿来做文章的。就算选用了 pb,在字段上我依旧极致省略,首先就统统都是 int,字符串的话就映射成 int。其次 int 一定要尽量拼凑到 8 位数才发,如果超出 8 位,那就用 long。再怎么样,一个字段总比四个字段要省。
选择 tcp/ip,我就不说话了吧。
api 安全接口设计,自行了解。

业务层:这里的业务都被我抹掉了,不过有几点要注意的,通用的。
1、分布式系统要注意分布式锁。
2、对于登录业务要注意二次登录。
3、对于注册业务,采用自增 id 的时候要掂量一下,分布式环境的自增 id 没那么简单。可以在我的博客主页搜索一下“自增 id”。
3、对于 MySQL 可以考虑存储过程,只要不是太复杂,因为存储过程的调试是真的要呕血三升的,我调过。
4、业务和数据库之间一定要做熔断。
5、最好能有 IP 限流模块,这个模块开发的晚,就没在图中展示了。因为我自己系统的特殊性,我就设定,不论你是谁,一秒都只能访问一次,因为我默认你需要阅读一下我返回的内容。那会不会误杀?不可能的,我告诉你,绝对不可能,只要是从我手上出去的客户端,那都是要做防抖的。

其他的暂时还没想到,想到我也不再补了。

持久层:持久层选用 MySQL + Redis。这里要注意:
1、MySQL 有条件的话最好单独部署到别的机子上,没必要,那个网络 I/O 的开销,跟MySQL 的磁盘 I/O 比起来那真不算什么了。
2、有能力一定要做存储过程,前提是要做好调试存储过程的心理准备。
3、Redis 有条件的话最好跟业务层放在一台机子上,Redis是什么?吹破天了它也是个缓存,缓存你不跟主机放一起你要去自立门户吗?然后多走那一圈 I/O?要知道,后端开发很大的一个瓶颈就在于网络I/O,木有带宽呀!!!
4、数据字典。数据字典非常重要,在项目分析阶段一定要有明确的数据字典,而且一定要做单例模式。可以改,但是不能没有,也不能多实例。不然到后期就知道什么叫痛苦了,到时候模棱两可的数据越改越迷糊了。
5、很重要的一点:基准测试。在架构设计之前就要做好的事情。MySQL 可以使用专门的基准测试工具 sysbench,redis 更简单了,人家有自带的。

HA:根据基准测试的结果来设定 HA。不要到时候你的环境只能 hold 住一台 MySQL,你来个主从复制哈,然后跑过来说为什么我的 MySQL 查询这么缓慢,屁话,既要马儿跑,又要马儿不吃草…

性能监控:promethues(存储数据) + NodeExporter(采集数据) + G什么的(数据可视化)


对于图中两个框架,我的博客里也都有。
RPC:远程接口调用。
ORM:对象关系映射。

ORM 比较简单,RPC 可能不是那么好理解。其实图中 RPC 的位置在上一个版本我写的是:命令 + 门面。这两个设计模式我已经删了,当时觉得过于简单,这里我补一下:
命令模式:在业务层存放一个哈希表,键值对形式为 <业务id:业务函数指针>,通过函数调用 get_handle,传入业务id,执行函数指针。
门面模式:整个业务层只对外开放这么一个函数调用 get_handle。

有这两个框架,我可以将我的系统层层解耦,相互之间谁也不要认识谁,我大权在握哈哈。


当前部署

只有这么一个架构图是不够看的,因为你不知道怎么部署。我有一部分代码是在部署图上体现的。

简单解释一下:
可以看到,整个系统都是部署在 docker 上的,做了状态剥离。
状态剥离:将 各种 IP、Port 等配置项移出,填写在 Deployment.json 文件中,此后不管你想把哪个组件挪到哪台机子上,那随便你。
平滑升级:将状态进行剥离之后,那想做平滑升级就很简单了,做一个观察者模式,监控 deployment.json 中 version 的变化,只要 version 变化了,就重新读取配置项。至于新旧组件的交替,那至少得等新的上位了,再把旧的关了嘛。所以这里需要考虑一下你的资源是否充足。
平滑迁移:那我还能说什么呢,状态你都剥离了,我又全在 docker 上,你直接一锅端了呗。


下一版架构图

结束的是毕设,不是我的项目。

简单讲一下变更:
1、业务层拆分微服务,核心业务单独划分,零碎业务凑到一起办了。后面的业务都需要走登录这一块,也想过将登录业务直接作为伴生业务划到网络层的 pod 里面去,但是想了想万一登录业务崩了,连带整个网络层一起崩了。所以:做好熔断、

2、既然业务都拆了,说明流量大了。那 Redis 也拆了吧,用来做锁的单独一块儿,用来承载数据库热点数据的单独一块儿。

3、MySQL 暂时不拆,但是要有能分库分表的能力。


下一版部署图

为什么叫下一版,而不是这一版,其实架构图上也看不出来嘛,因为理论上是实现的了的。
看了部署图,就知道为什么叫 “下一版” 了。

你猜我是哪里不行哈哈。最底下那两块儿,目前还没部署成功…


如果有学弟学妹想做一下以后方便写在自己的简历上,一定要私信我。呈现在这里的就是这么几张图,但是你不知道的是它们每张图,背后都有十几张图的迭代,项目都是从最简单的开始做起,越滚越大越滚越大,一上来就高屋建瓴的,咱不是那天才哈…

留念 · 大学时代最后的系统设计图相关推荐

  1. 我大学时代的好朋友要结婚了!

    我大学时代的好朋友大珍珠要结婚了! 那天她发微信告诉我说他想跟他男朋友分手了,说慢慢的发现她对她越来越不好了. 大学的时候很不喜欢她男朋友,因为她男朋友是插足者.那时候的大珍珠有一个正在高四的男友,男 ...

  2. SDYY大学普通话考试报名系统说明文档

    系列文章目录 健康云平台开发说明文档 SD申报系统迭代说明文档 漏刻有时物联网传感器API接口对接说明文档 Echarts数据分析系统Data Analysis Platform使用说明文档 漏刻有时 ...

  3. 基于ssm的大学校园兼职平台系统

    008基于ssm的大学校园兼职平台系统 开发环境: Eclipse/MyEclipse.Tomcat8.Jdk1.8 数据库: MySQL 技术: Spring+Spring mvc+Mybatis+ ...

  4. Android开发英语听力软件,基于Android平台的大学英语听力学习系统的设计与实现...

    摘要: 随着信息技术的飞速发展,移动设备给学习提供了一种全新的学习模式,使学者能够在任何时间.任何地点获得自己想要的知识,实现自主学习.本文对基于Android平台的大学英语听力学习系统展开研究,旨在 ...

  5. 主题 09:如何画好系统设计图

    1. 引言 系统架构图是为了具象地呈现软件系统的整体轮廓.各个组件之间的相互关系和约束边界,以及物理部署和演进方向的整体视图.软件架构图是一种非常好的表达方式,一图胜千言,在项目评审.内部交流.方案归 ...

  6. 【PLM】【PDM】60页PPT终于说清了PDM和PLM的区别;智造时代,PLM系统10大应用趋势!

    PDM与PLM是产品创新数字化领域中极为常见的两个名词,然而不论在销售环节.实施环节,很多人经常在概念上混淆和滥用,本文通过一组PPT对两者进行深入区分,并进行案例分析. 本文由精智工厂根据网络资料整 ...

  7. 重庆邮电大学801信号与系统考研真题09-22年

    重庆邮电大学801信号与系统考研真题09-22年 真题及答案 25r

  8. 我的不羁成长岁月 - 大学时代

    技术人成长,却不仅仅是技术上,其中很重要的一面是心智的成长,心智的成长跟个人的思考习惯相关,思考习惯又和一个人的性格有着密不可分的联系,性格又主要是由成长环境和教育铸就的. 之前我有聊过自己的少年时代 ...

  9. 10年老兵!从大学毕业生到嵌入式系统工程师的修炼之道……

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 一名从事10多年嵌入式行业的老兵,用多年来从事这个行业的经验及独特视角,为想从事嵌入 ...

最新文章

  1. ie6 ie7 绝对定位 相对定位 层被遮住
  2. React: 关于React通信方式
  3. LiveGBS无插件播放页面的集成----单独的播放器样式
  4. ClientDataSet 探讨
  5. Ubuntu Server中安装keepalived
  6. Tornado 错误 Global name 'memoryview' is not defined
  7. 实现⼀个简洁版的promise
  8. 26_多线程_第26天(Thread、线程创建、线程池)
  9. 停止做这7件事,你的工作效率至少翻一倍!
  10. jquery开发插件_如何开发jQuery插件
  11. HR别掉坑里了,送你最精确的计薪算法!
  12. javascript快速入门(二):JS浏览器操作
  13. 使用eclipse开发jsp项目入门
  14. linux系统date命令(时间戳与日期相互转换)
  15. uniapp 实现高德地图导航
  16. 原腾讯QQ技术总监、T13专家,黄希彤被裁,原因竟是不愿意被 PUA ?
  17. s3c2440移植Linux内核,移植Linux-3.4.2内核到S3C2440
  18. CentOS配置DNS方法
  19. 微信商家收款码怎么申请
  20. 甲虫之王怀旧服新开的服务器是否自动开门,魔兽世界怀旧服:不刷虫皮也能当甲虫之王,钻漏洞可量产黑虫子...

热门文章

  1. 咆哮体---出师表!!!
  2. Learning to detect open classes for universal domain adaption
  3. R语言提示数学函数中用了非数学参数,求帮忙
  4. mysql msi 是离线安装吗_mysql 5.7.18 MSI安装图文教程
  5. slow http attack 简介及防护办法
  6. sqoop1.4.2数据导入
  7. 【luogu P5655 基础数论函数练习题】【分治+数论】
  8. 低价位高性价比keychron机器键盘推荐
  9. oppo计算机的夜间模式,OPPO如何设置夜间护眼模式?OPPO手机护眼模式使用教程
  10. E:Package ‘Vim‘ has no installation candidate问题解决