老哥们我整不会了,能否教教我? SSR 前端 + API 后端应该怎样简易优雅的平滑部署 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
sorakylin
V2EX    程序员

老哥们我整不会了,能否教教我? SSR 前端 + API 后端应该怎样简易优雅的平滑部署

  •  
  •   sorakylin 2022-06-06 14:02:53 +08:00 2797 次点击
    这是一个创建于 1228 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果是前后端分离,前端只有静态文件。

    部署起来都是直接 Nginx 往前面套就完事了。新版本上线的时候也就切一切 Nginx 的 upstream

    前端还能直接丢对象储存、顺手打包到 api server 的静态文件里、直接把服务器文件覆盖等等,总之都挺方便。


    但是如果是到 SSR 的前端,我就有点迷茫了。
    因为要给前端单独部署一个 node 服务。并且这个 node 服务还要请求后端接口,那 node 那边也得维护 api server 的地址才行。

    node -> api server 这一层,是要每次打包 node | 启动 node 服务的时候手动操作么,额就感觉怪麻烦的。


    我想了想,上一次线,得:

    • 将新的 api server 启动到新的端口
    • 将新的 node server 启动到新的端口
    • 启动 node server 时手动设置一下 node server 请求 SSR 数据的地址
    • 切 nginx 的 upstream
    • 停掉老的 api server / node server

    有经验的同志们一般是咋部署的?怎么搞最快捷


    还有一个额外的问题,客户端 HTTP 请求 API 的链路(注意,不是 SSR ,是 JSON API )一般是哪个?

    1 、客户端 -> Nginx (proxy) -> node (proxy) -> api server
    2 、客户端 -> Nginx (proxy) -> api server

    18 条回复    2022-06-06 23:36:54 +08:00
    zinete
        1
    zinete  
       2022-06-06 14:05:17 +08:00
    pm2
    superfatboy
        2
    superfatboy  
       2022-06-06 14:08:20 +08:00
    不太懂后端, 单纯部署的话可以试试 pm2
    shakaraka
        3
    shakaraka  
    PRO
       2022-06-06 14:15:06 +08:00
    新的端口是什么意思?不能用固定端口吗?

    我理解的访问路径是:client -> nginx -> ssr

    请求 API 的链路是正常的 2 。

    ssr 只是预渲染首屏而已,剩下的和普通 spa 无异
    Latin
        4
    Latin  
       2022-06-06 14:18:07 +08:00
    有考虑容器化吗 docker-compose 一条命令不就解决了吗
    inhons
        5
    inhons  
       2022-06-06 14:21:27 +08:00
    打个比方,你有一个列表,如果是请求接口获取数据,想要 SSR 就肯定得在服务端发生请求,却决于这个框架依赖 Node ,所以你需要 Node 服务。如同 PHP 模板的循环一样,也需要 PHP 环境。

    还有一个额外的问题,客户端 HTTP 请求 API 的链路(注意,不是 SSR ,是 JSON API )一般是哪个?
    是 2 、客户端 -> Nginx (proxy) -> api server
    Hieast
        6
    Hieast  
       2022-06-06 14:36:36 +08:00
    我看我们前端
    生产环境下客户端 -> Nginx (proxy) -> api server
    开发环境下静态文件是客户端 -> Node ,接口是客户端 -> Nginx (proxy) -> api server
    duan602728596
        7
    duan602728596  
       2022-06-06 14:52:41 +08:00   1
    1. api server 的地址可以单独放在同一个文件里,这样前后端都可以 import 这一个文件
    2. 端口可以使用环境变量,包括前端的打包和 node server
    3. 部署服务的话,我之前的公司用的 k8s ,所以上线真的没有这么麻烦
    4. C 端:请求 API 用的 1 方案,这样主要是为了跨域(因为为了兼容 IE 用的 jsonp ),以及按需返回数据
    内部系统的话直接配置 proxy 解决跨域问题
    dudubaba
        8
    dudubaba  
       2022-06-06 15:02:57 +08:00
    可以在 ssr 服务里直接用绝对路径 /api 代理 api server 地址,这样后续就不需要在 ssr 服务里维护 api server 地址了。
    sorakylin
        9
    sorakylin  
    OP
       2022-06-06 15:21:14 +08:00
    @wunonglin 不能使用固定端口呀,之前的服务会还存在呢。 因为不是先停机再启动服务,而是直接切流量到新的服务上去,实现平滑部署效果……
    isbase
        10
    isbase  
       2022-06-06 15:22:36 +08:00
    @sorakylin 你需要 k8s
    shakaraka
        11
    shakaraka  
    PRO
       2022-06-06 15:25:58 +08:00
    @sorakylin #9 我也觉得你需要 k8s ,不然你只能一遍遍手动操作,装 k8s 麻烦的话装 k3s 也一样
    isbase
        12
    isbase  
       2022-06-06 15:28:54 +08:00   1
    @sorakylin 公司有运维的话让他们部署一套 k8s 环境或者直接买云服务商的,然后应用部署升级直接用 k8s 操作就很简单了。这套方案对应用来说做个容器化改造就行,主要成本是搭建 k8s 的基础设施,还有镜像仓库之类的

    简单点就 pm2 reload 但是会稍微中断一会儿,选择停机维护或者半夜没流量的时候
    sorakylin
        13
    sorakylin  
    OP
       2022-06-06 15:34:30 +08:00
    @Hieast #6 老哥你这生产环境没提到 SSR 啊,SSR 的话 [node server -> api server] 这个链路是得有的吧…… 如果只是基本的前后端分离我还是会整的
    sorakylin
        14
    sorakylin  
    OP
       2022-06-06 15:38:08 +08:00
    @isbase 没有没有,不是公司的。 是我自个部署。 就一个 SSR node 服务 + 一个 Kotlin 后端服务, 总共加起来就这俩服务。
    isbase
        15
    isbase  
       2022-06-06 15:47:17 +08:00
    @sorakylin 你的 SSR Node 和 API Server 是两个应用,SSR Node 应用只要通过固定的 访问地址 去调用 API Server 就行。正常情况这个访问地址通过环境变量配置一次就行了,之后不管你 API Server 怎么重启部署。SSR Node 都不用改动。

    至于应用的不间断部署以及服务之前相互调用这种用 k8s 就能很好解决你的问题。你可以了解下 k8s 的 Pod 和 Service 这两个概念

    你提到的重启后端口会变这种事情,一般是不应该让 SSR Node 感知到的。k8s 的 Service 就可以解决这个问题
    isbase
        16
    isbase  
       2022-06-06 15:50:41 +08:00
    我想了想,上一次线,得:

    将新的 api server 启动到新的端口
    将新的 node server 启动到新的端口
    启动 node server 时手动设置一下 node server 请求 SSR 数据的地址
    切 nginx 的 upstream
    停掉老的 api server / node server
    有经验的同志们一般是咋部署的?怎么搞最快捷


    ---


    你的复杂度主要是改端口导致的,要想简单就两个应用全部固定端口,重新部署的时候直接 pm2 reload
    SixGod66
        17
    SixGod66  
       2022-06-06 16:59:51 +08:00
    1 、SSR 只涉及到前端页面的首次渲染,前端页面的请求是正常转发到 node 。api 请求没有改到
    2 、重新上线部署的话,应该会涉及到服务中断,即使每次发布手动改端口号。比较好的方式是用 k8s 这一套方案
    Hieast
        18
    Hieast  
       2022-06-06 23:36:54 +08:00
    @sorakylin 没细看你上面的上线流程,就随便说了下你问的额外的问题。上线流程没啥好说的,docker build/push 完之后 helm upgrade 完事,配置变动流量切换都是 k8s 自动做的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5421 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 08:28 PVG 16:28 LAX 01:28 JFK 04:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86