许式伟的架构课
许式伟
七牛云CEO
立即订阅
20127 人已学习
课程目录
已更新 73 讲 / 共 77 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 怎样成长为优秀的软件架构师?
免费
基础平台篇 (21讲)
01 | 架构设计的宏观视角
02 | 大厦基石:无生有,有生万物
03 | 汇编:编程语言的诞生
04 | 编程语言的进化
05 | 思考题解读:如何实现可自我迭代的计算机?
06 | 操作系统进场
07 | 软件运行机制及内存管理
08 | 操作系统内核与编程接口
09 | 外存管理与文件系统
10 | 输入和输出设备:交互的演进
11 | 多任务:进程、线程与协程
12 | 进程内协同:同步、互斥与通讯
13 | 进程间的同步互斥、资源共享与通讯
14 | IP 网络:连接世界的桥梁
15 | 可编程的互联网世界
16 | 安全管理:数字世界的守护
17 | 架构:需求分析 (上)
18 | 架构:需求分析 (下) · 实战案例
19 | 基础平台篇:回顾与总结
加餐 | 我看Facebook发币(上):区块链、比特币与Libra币
加餐 | 我看Facebook发币(下):深入浅出理解 Libra 币
桌面开发篇 (16讲)
20 | 桌面开发的宏观视角
21 | 图形界面程序的框架
22 | 桌面程序的架构建议
23 | Web开发:浏览器、小程序与PWA
24 | 跨平台与 Web 开发的建议
25 | 桌面开发的未来
26 | 实战(一):怎么设计一个“画图”程序?
27 | 实战(二):怎么设计一个“画图”程序?
28 | 实战(三):怎么设计一个“画图”程序?
29 | 实战(四):怎么设计一个“画图”程序?
30 | 实战(五):怎么设计一个“画图”程序?
31 | 辅助界面元素的架构设计
课外阅读 | 从《孙子兵法》看底层的自然法则
加餐 | 想当架构师,我需要成为“全才”吗?
32 | 架构:系统的概要设计
33 | 桌面开发篇:回顾与总结
服务端开发篇 (14讲)
34 | 服务端开发的宏观视角
35 | 流量调度与负载均衡
36 | 业务状态与存储中间件
37 | 键值存储与数据库
38 | 文件系统与对象存储
39 | 存储与缓存
40 | 服务端的业务架构建议
41 | 实战(一):“画图”程序后端实战
42 | 实战(二):“画图”程序后端实战
43 | 实战(三):“画图”程序后端实战
44 | 实战(四):“画图”程序后端实战
45 | 架构:怎么做详细设计?
46 | 服务端开发篇:回顾与总结
加餐 | 如何做HTTP服务的测试?
服务治理篇 (11讲)
47 | 服务治理的宏观视角
48 | 事务与工程:什么是工程师思维?
49 | 发布、升级与版本管理
50 | 日志、监控与报警
加餐 | 怎么保障发布的效率与质量?
51 | 故障域与故障预案
52 | 故障排查与根因分析
53 | 过载保护与容量规划
54 | 业务的可支持性与持续运营
55 | 云计算、容器革命与服务端的未来
56 | 服务治理篇:回顾与总结
架构思维篇 (10讲)
57 | 心性:架构师的修炼之道
用户故事 | 站在更高的视角看架构
58 | 如何判断架构设计的优劣?
59 | 少谈点框架,多谈点业务
60 | 架构分解:边界,不断重新审视边界
加餐 | 实战:“画图程序” 的整体架构
61 | 全局性功能的架构设计
62 | 重新认识开闭原则 (OCP)
63 | 接口设计的准则
64 | 不断完善的架构范式
许式伟的架构课
登录|注册

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

许式伟 2019-07-30
你好,我是七牛云许式伟。
今天继续我们的画图程序。上一讲完成后,我们的画图程序不只是功能实用,并且还支持了离线编辑与存储。
今天我们开始考虑服务端。
我们从哪里开始?
第一步,我们要考虑的是网络协议。

网络协议

为了简化,我们暂时不考虑多租户带授权的场景。后面我们在下一章服务端开发篇会继续实战这个画图程序,将其改造为多租户。
在浏览器中,一个浏览器的页面编辑的是一个文档,不同页面编辑不同的文档。所以在我们的浏览器端的 dom.js 里面,大家可以看到,我们的 DOM 模型是单文档的设计。
但显然,服务端和浏览器端这一点是不同的,就算没有多租户,但是多文档是跑不了的。我们不妨把 QPaint 的文档叫 drawing,如此服务端的功能基本上是以下这些:
创建新 drawing 文档;
获取 drawing 文档;
删除 drawing 文档;
在 drawing 文档中创建一个新 shape;
取 drawing 文档中的一个 shape;
修改 drawing 文档中的一个 shape,包括移动位置、修改图形样式;
修改 drawing 文档中的一个 shape 的 zorder 次序(浏览器端未实现);
删除 drawing 文档的一个 shape。
完整的网络协议见下表:
其中<Shape>是这样的:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《许式伟的架构课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(14)

  • 且看海棠笑一回
    进入“画图”程序实战后,文章从一开始的高屋建瓴逐渐进入到架构具体的繁枝细节,每一章的内容都需要很长时间才能消化,也意识到自己在宏观架构层面代码应该如何有效组织的能力非常欠缺。
    留言区和收藏数相比前面章节也少了许多,不知道到底有多少同学可以坚持到这里,架构之路任重道远,许老师加油,大家一起加油!

    作者回复: 一起加油!下一讲结束实战,不过也是比较难的一块硬骨头。我后面会反复扳开来谈这个案例。

    2019-07-31
    4
  • Charles
    请问许老师,迭代是直接在mock程序上一点点修改实现了吗?等迭代完成,mock程序是否还有存在必要?

    作者回复: 1、看mock和实际程序的差距,两种可能都有;2、mock价值往往是阶段性的,到后期维护协议和正式程序的一致性成本会高于价值,而且往往已经有稳定版本的服务端程序可用

    2019-07-31
    2
  • 有铭
    老师,我对你说的那个“网络协议的版本升级问题”很有兴趣,虽然你只提到了其中一种,就是在url中加版本号v1,v2这种形式,但是我看过不少文章,有不少文章指责在url上添加版本号是非常典型的破坏REST语义的行为,对网络协议的版本升级问题,似乎没有一个特别好的方案,无论是写在url上,还是写在queryString上,都有各自的问题。这个问题能否深入探讨一下

    作者回复: 我只认这种,相对优雅

    2019-07-30
    2
    2
  • 风清扬
    老师,咱们采用的应该是restful协议,那为啥修改不用put,而是跟新建同一个post呢?这样做路由层区分怎么做呢?

    作者回复: 路由怎么解释可以看一下go代码。至于用post还是put,这个一定程度来说只是一个习惯问题

    2019-07-30
    2
  • 葫芦娃
    文中网络协议改成接口协议似乎更好理解

    作者回复: 网络协议的确是一个有歧义的词

    2019-07-30
    1
    2
  • 闫飞
    稍微较真一点讨论一下RESTful API里面关于verb的用法,因为相关的讨论实在是太多了,google一搜就可以得到一大把。

    一种惯例是:把对资源的局部修改是用patch操作的,而post提现的是资源从无到有的创建动作,类似地put操作用来表示移动资源,里面的内容可能不变化。

    上面表述的惯用法貌似是一种弱共识,具体例子可参考Kubernetes的API设计。

    作者回复: 确实是弱共识

    2019-08-20
    1
  • 立耳
    API版本是不是也可以放到Header中来完成,类似于UUID,这样接口形式基本保持一致?

    作者回复: 是一个可能性,只不过这意味着url route模块需要根据http header来路由,这大部分标准url route可能并不支持,需要自己实现。

    2019-08-16
    1
  • qubit
    请问老师看好GraphQL吗?

    作者回复: 还在理解,目前还没有看清楚趋势

    2019-08-01
    1
  • Fs
    后端看着一章简单
    2019-10-18
  • 科春
    http是应用层协议,并不是网络协议啊?

    作者回复: 应用层协议为什么就不算网络协议?

    2019-09-11
    1
  • Geek_88604f
    简单梳理一下服务端的流程:
            sharp.go定义了各种图形相关的结构体,drawing.go描述了doc的组成、操作drawing
    和sharp的各种方法。
            service.go定义了服务端实际的处理流程,首先初始化doc对象,然后创建service实例并将doc对象作为service的参数传入以便操作doc对象。接下来启动http端口侦听,指定了侦听端口和请求处理handle。这样当客户端向服务端发送请求时,侦听端口就会接收到。服务端接收到请求后,调用ServerHTTP在内部进行路由解析并调用对应的请求处理函数。
            在具体请求函数内部又调用了doc对象的相关处理函数实现对模型数据的操作。

    作者回复: 👍

    2019-08-17
  • Luke
    打卡跟进,这几节课需要时间消化一下
    2019-07-30
  • Linuxer
    请问这么看之前的浏览器端是MVP,后端是MC?
    2019-07-30
  • Aaron Cheung
    起床打卡 29
    2019-07-30
收起评论
14
返回
顶部