许式伟的架构课
许式伟
七牛云 CEO
84945 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 89 讲
许式伟的架构课
15
15
1.0x
00:00/00:00
登录|注册

30 | 实战(五):怎么设计一个“画图”程序?

对接 paintdom 的反向代理服务器
静态文件下载服务器
提高团队的开发效率
paintdom 和 paintweb 的网络协议
paintdom 和 paintweb 两大软件
下一讲的主题
实战过程的总结
画图程序前后端的对接
Model 层的重要性
Model 层的职责
Model 层的代码行数增加
加载文档结束后的 onload 消息
重构 QSerializer 全局变量
加载新文档、临时文档、远程文档
增加了同步接口
修改网络协议
完整的变更信息的计算逻辑
给对象增加版本号
怎么知道断网后离线编辑过的内容有哪些?
paintweb 的服务端
Mock 版本的服务端程序 paintdom
画图程序的跨团队协作
结语
Model 层的厚度
加载文档
同步变更
计算变更
宏观的系统架构
实战(五):怎么设计一个“画图”程序?

该思维导图由 AI 生成,仅供参考

你好,我是七牛云许式伟。
我们继续聊我们的话题。这是画图程序的最后一讲了。当然我们后续还会结合这个实战程序展开讨论有关于架构的方方面面。

宏观的系统架构

上一讲开始,我们的画图程序有了跨团队协作:因为我们开始有了 paintdom 和 paintweb 两大软件。paintdom 监听的地址是 localhost:9999,而 paintweb 监听的地址是 localhost:8888。
应当注意,在实际业务中它们是不同的软件,事实上我们 paintweb 程序也完全是以进程间协作的方式,通过反向代理机制来调用 paintdom 的功能。但是在我们这个画图 DEMO 程序中,它们同属一个进程,paintdom 作为 paintweb 的一个 goroutine 在跑。这纯粹是因为我们想让这两个程序 “同生共死”,方便调试的时候起停进程。
paintdom 和 paintweb 之间相互协作的基础,是它们之间所采用的网络协议。
当我们说起网络协议,它其实通常包含两个层面的意思:其一是我们网络协议的载体,也就是协议栈(我们这里采纳的是 HTTP 协议,而 HTTP 协议又基于 TCP/IP 协议);其二是我们网络协议承载的业务逻辑。
当我们谈架构的时候,也会同时聊这两个层面,只是它们在不同的维度。我们会关心网络协议的协议栈选择什么,是基于 HTTP 还是基于自定义的二进制协议,这个是属于基础架构的维度。我们也会关心网络协议的业务逻辑,判断它是否自然体现业务需求,这是属于应用架构的维度。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了如何设计一个“画图”程序的实战教程,涉及了程序架构的方方面面,包括技术细节和实际操作。作者通过具体的代码示例和技术解释,展示了如何设计一个完整的画图程序,包括前端文件的托管、帐号服务的支持以及业务协议的转译。文章还讨论了计算变更、同步变更和加载文档等方面的技术挑战,并提出了相应的解决方案。此外,文章还强调了 Model 层的重要性和厚度,以及对业务逻辑、视图层和控制层的职责。整篇文章内容丰富,对于想要了解如何设计类似程序的读者来说是一份有价值的实战经验分享。文章结尾提到了对接工作的复杂性以及未来的讨论内容,展示了作者对于技术细节的深入思考和对读者的关注。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《许式伟的架构课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • Peiel
    老师,我自己平时接触的比较多的语言是Java、Python、C、JS一类的,看到课程用到Go语言越来越多,我是不是需要学习下Go的一些基本语法和基础才有利于后续知识的吸收?

    作者回复: 学习一下会好一点。go入门不难,一周就够了。

    2019-08-02
    2
    10
  • 有铭
    老师,计算变更里,如果按方案3,版本对比,不记录编辑操作历史,怎么实现(离线下的)回撤功能呢

    作者回复: 后面在常见架构范式中会讨论undo/redo

    2019-08-02
    5
  • Geek_88604f
    相对于java技术栈实现的云服务来说,multi-user相当于云服务的后台(service manager);session-based model相当于云服务的前台(console),前台有前台的逻辑处理,通常也会调用后台提供的API;session-based view model相当于静态服务器上的资源。不知道这样理解对不对,许老师?

    作者回复: 👍

    2019-08-18
    4
  • Lrwin
    Model代表业务核心逻辑,如果不是业务发生颠覆性变化,Model层应该是很稳定的 至于调用Model层的调用者来说,都是在用不同的方式体现需求(比如Rest/controller或者view) 还有一些技术用于支持Model,比如Model要用到的基础组件(可以进行依赖导致DI,让依赖翻转) 使用上述两个步骤,则就将Model层设计为最稳定的核心层了。

    作者回复: 👍

    2019-11-28
    3
  • Jian
    一个闪念:即如果您在将来的课程中,为不同的版本打上相应的tag,这样是否更易懂?总之,您真的是辛苦啦!我们也不好太多要求给您。

    作者回复: 现在不同版本是不同的分支(branch)

    2019-08-04
    2
  • 忆民
    老师,这项目如何运行起来,能够给说明一下吗?这个项目go服务器如何启动,进行项目的调试?谢谢

    作者回复: go项目启动只需要 go run *.go 就行

    2020-06-02
    1
  • xl000
    老师,您一直说要胖model层,那么model之间可以有依赖吗?我是做游戏服务器开发的,现在的设计是在model实例里弱引用着user实例,通过user实例可以获取到其他model,总觉着不太好,太胖了,所以改名叫module了。老师有什么好建议吗?

    作者回复: model 是一个整体,内部怎么设计是详细设计阶段的事情,这一章关注点暂时还只在子系统/模块边界上。

    2019-08-02
    1
  • fy
    看到最后一句说清楚事情为目标,而不是限制在几讲,大大点个赞!!!!!!
    2019-08-02
    1
    62
  • 张白水
    看得云里雾里,不得不说许大的编码能力和设计能力确实十分硬核
    2019-08-05
    2
  • 程序员小跃
    等到老师全部更新完了,才来看这个画图程序,关键是一遍还不够
    2019-08-06
    1
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部