Appearance
静态化模板
对模板中心有了简单概念之后,这里介绍一下更多模板相关的概念和技巧。
模板渲染流程
了解模板渲染(静态化)的主要流程是掌握模板中心的基础,也能对模板中心的功能范围有一个清晰的认知。
用户行为 | 程序行为 |
---|---|
在模板中心创建或修改 模板 配置表单 | |
检测分析数据函数 内容,提取相关的 KMS 数据依赖,作为后续数据变更观察的依据; | |
执行 数据渲染+静态化+部署 ,即核心静态化逻辑 | |
在配置中心修改配置(增删改) | |
内部消息广播 | |
模板中心检查变更的数据是否有关联的模板,如果存在关联的模板,则执行核心静态化逻辑 | |
在模板中心删除模板 | |
根据用户选择来决定是否删除已经部署的内容 | |
通过 Service Trigger 触发 | |
检查 Service 权限通过后,执行核心静态化逻辑 |
核心静态化逻辑
模板渲染由于是一个 CPU 密集型工作(大量字符串拼接),在实现上模板中心采用了 nodejs 中的 worker threads
来做渲染工作(即 EJS 模板的数据填充)。同时主线程采用一个简易队列来处理高并发时的情况。
收到渲染请求后,查询其他实例(服务器节点)是否有相同任务在处理,如果有,则移交任务
在其他实例没有相同任务的情况下,将渲染相关配置和数据添加到待处理队列中
如果队列没有在执行任务(等待状态)则标记队列状态为工作中,并开始循环处理任务
取出最早的任务进行处理
a. 检查同一个任务上一次的处理结果,并标记任务处理状态为处理中
b. 调用数据函数,并将结果和 EJS 模板交给
worker
进行渲染c. 收到 wroker 渲染结果(渲染内容以及对应的 md5 值)后,准备启动部署
d. 跟上一次的部署结果进行对比,md5 一致的跳过,不一致的推送到部署服务,不存在的进行删除或重置
e. 更新数据库任务状态为完成,并写入当前处理结果
暂停 100 毫秒后,重复步骤 4 直到任务列表为空
任务列表为空后,标记队列的处理状态为等待
如果收到其他实例的查询请求,则检查队列:
a. 如果待处理任务中有相同任务,则接手任务并更新数据
b. 如果跟处理中的任务相同,则中止正在处理的任务,并接手任务插入到队列末尾
c. 如果没有相同任务,则拒绝接手任务
部署结果删除或重置
部署服务中,是否可以删除文件是可选的,所以在部署服务的此项配置不同的情况下,模板中心有两种策略来处理已经过期或失效的静态化内容:
- 如果部署服务支持删除,则调用删除接口删除部署内容;
- 如果部署服务不支持删除,则调用部署接口上传一份自定义的 404 内容;
通过 Service 触发渲染
在模板的数据函数
中,不仅仅可以读取 KMS 配置中心的数据,还可以通过 request
工具读取其他 URI 资源(request
工具仅仅支持 GET
请求),不过这种情况下,模板中心将无法得知 URI 资源的变化,也就无法自动触发渲染工作。
针对这个场景,模板中心提供一个独立的 Service 服务来触发模板渲染。
提示
完整的 Service URL 在模板列表的折叠行中,打开即可看到,点击可以复制链接。
SPA 静态化
单页应用 SPA 的静态化是模板中心核心功能之一,其基本原理是将 SPA 文件(即编译后的唯一 html 文件)注入不同的初始化数据后,按照路由规则生成多份 SPA 副本,达到实现 history 路由并保持内容差异。这种方案权衡了用户体验和搜索引擎体验(SEO)。
API 静态化
对于查询工作量大,但无用户个性数据的非敏感数据的 API(比如新闻列表,服务器列表或者某类不包含敏感数据的配置文件等),可以使用模板中心,将 API 数据分页静态化为 json 文件,这些 json 文件最终被推送到 CDN(当然也可以推送到任何需要的地方),这将降低服务器实时查询的压力,并提供更稳定的访问服务。
数据多态化
当遇到一份数据有多种消费形态的场景(比如将 KMS 配置静态化为 json 文件的同时,保存一份 html 版本,再或者生成针对 PC 和移动端不同的 html 代码),模板中心将是一个趁手的工具。