timzaak / blog

8 stars 1 forks source link

SPA 发布辅助工具 #80

Closed timzaak closed 2 years ago

timzaak commented 2 years ago

SPA 在当前体系下,常规的发布方法,是打包成 nginx docker 镜像再进行部署。这样就导致 nginx 的多重浪费,实际上一个 Nginx 足以支撑10+ SPA。如果再挂CDN,上千个都可以。 所以缺乏一个工具,他要达到:

  1. 静态文件 http(s) 代理,并可热加载,支持多SPA,简易设定。
  2. cli:打包好的静态文件上传(权限校验)。
  3. SPA资源更新通知,客户端、CDN 端。

第一条,很容易实现,web框架+ File Change Notify即可。 热加载可以通过重定向目录来解决。 添加版本一说 第二条,基本上用 Go/Python 之类的写就可以,用上 rsync。 第三条,CDN端可以用API接口来兼容,至于客户端,没有一个轻量级方案,而且需要根据具体场景做二次开发,例如:大工具类型的,就需要给客户端弹窗;资讯浏览类的,还没这个需求。

timzaak commented 2 years ago

Envoy 不支持 static web serve,要么基于 Nginx 做,要么用个类似替代的。

大致产品实现思路应该是:

基于 Rust 的 web 框架 来实现静态资源 http server, 并基于开源的 rust metrics 来实现统计,制作成 docker 镜像。

在 k8s 里不走 ingress,而是单独 EIP 暴露到公网(支持 LTS)。否则需要走 ingress controller,涉及 k8s ingress 配置管理。

SPA(静态文件)会以 ${域名}/${version} 的目录形式存储在服务器端硬盘或S3,将文件读到内存中以提升读取效率(做LRU)相关配置要写入到文件中,方便重启管理。

版本控制,要想一个合适的方法提供版本变化通知。

提供 grpc web api,暴露版本控制API 和 metrics。metrics 包括统计 当前5分钟/10分钟/24小时各域名-版本的访问量等。

客户端提供封装 rsync 的客户端,用来做用户传输静态文件到服务器端或S3,并做权限验证,提供一般 API 展示 SPA 服务状态。

第一个版本

最精简的服务控制台需要提供的 HTTP API 接口:

  1. 当前在服务的域名 + 版本 + 当前存在的所有版本及目录创建时间
  2. 获得域名的上传目录(携带版本号),方便用户组合 rsync/scp/ftp 等工具上传文件
  3. 更迭域名的服务版本
timzaak commented 2 years ago

已开项目:https://github.com/timzaak/spa-server

timzaak commented 2 years ago

除了多证书(像是个伪需求)、S3的支持(S3可以直接挂载到容器内),剩下所有都是和性能相关的。

http2, tcp多路复用, 提升加载效率 https 自带 h2 spdy,缩减传输数据 compression, 缩减传输数据 更应该是 web build tool 解决的问题 memory fs,提升数据读取效率 header cache/expire config(etag),缩减传输数据 port reuse, 干掉socket dispatcher , 这个是 web 框架的问题

除了 memory fs (目前没有合适的实现),剩下的都是API缝合怪的工作。慢慢来吧。

后续最重要考虑的话,就是这个项目真正的干什么,第一个:自己提供 static web 托管服务,需要解决监管问题。但这在国内没需求。 第二个:目前暂时想不到。

timzaak commented 2 years ago

v1.2.2 版本发布了,这个项目算是有个终结。 实现的虽然比较粗暴,但作为我的用 Rust 实现的第一个完整项目,还不错。 后续,这个项目就进入到维护阶段,如果有时间,就写一点宣传文案,传播一下,不过类似项目太多,应该没啥人用。

后面应该开始面向用户思考,看如何解决一整套部署流程问题。 用户开发完毕后,编译、测试,然后便是部署,这个项目要解决部署及以后的事情。后面的内容有点多,要搞个思维导图先。

timzaak commented 2 years ago

v1.2.4 spa-server, v0.1.1 spa-client 发布,文档(GitHub Pages)发布。 目前还剩下 Gitee Page 和 文档搜索功能,但已算是一个完完整整的开源项目。 从3月2日开这个 Issue,到4月3日我心目中的版本发布,一个月的时间飞快,其中编码的时间不到一半,都是在整理文档、CICD、梳理产品思路、做产品Roadmap、推广,真心收获颇多。

这个算是我真正意义上的第一个开源项目,虽然现在就3个 star、0个 issue😭,对自己而言也有了一个交代。

后续,会在花大量时间磨砺自己的想法后,再出发。现在还是要focus 在工作+写小说上。

期望下个开源项目能满 100 star!

timzaak commented 2 years ago

v1.2.5 发布,功能都已完善。 后续这个项目会进入个人使用/维护阶段,应该要持续到8月份。若没什么问题,会准备再做一下二次推广,期望到时候有时间处理这个项目。

timzaak commented 2 years ago

HTTP 缓存header 的讲解 https://my.oschina.net/vivotech/blog/5448571 对照来看,就是没有强加cache-control:public和 progma 的兼容。

timzaak commented 1 month ago

还是有一堆BUG,在没有写自动化测试之前,完全不可信。

timzaak commented 11 hours ago

最终打造的产品形态: GitHub Pages 单机 + 私有化部署。所以 API 应该参考 Github Pages API,可无痛迁移。