人人都是Serverless架构师之传统内容管理系统改造实战一[开篇]

简介: 内容管理系统是很常见的一种web应用场景,可以用到个人独立站,企业官网展示等场景,具有很高的实用价值,一个标准的内容管理系统主要由三个部分组成 主站展示部分、后台管理系统、API接口服务,本系列文章会以一个已有内容管理系统的Serverless架构重构展开,介绍改造的基本思路,改造细节,以及性能优化业务可观测设计等。涉及大家关心的Serverless生产遇到的一些问题,比如数据库、日志、动静态分离、调试、维护、灰度方案等。最真实的展现Serverless架构的实施落地细节。本篇章作为系列文章的开篇,大致讲解一下将传统前端应用重构成Serverless架构的架构设计方案,工程改造思路,以及部署

本次改造的项目题材取自GiiBee CMS
Serverless架构改造的仓库地址

项目改造后预览地址 SSR方案地址SSG方案地址

1. 题材选择

最初的动机是想针对传统的项目做一个完整的Serverless架构重构,并且想找一些有一定复杂度能够展示Serverless架构分布式特色的项目,GiiBee CMS的项目结构比较符合预期。整个项目采用的技术栈是前端js全栈,Api服务使用了 NestJS, 管理后台是标准的 Vue + Element UI 的单页面应用形式,展示首页则是用了Nuxtjs这个既可作 SSR 也可作SSG 的前端渲染框架,三个部分各自独立又有联系,整体看是一个项目,非常契合Serverless架构的分布式结构。

2. 架构设计

这套CMS系统的三个部分在部署部分是独立的,但在访问侧却应该是统一的,首页,后台管理,OpenApi 服务需要共用同一个域名,这个时候需要有个前置网关入口来做相应的分流处理。这里提供两套方案,一套是以阿里云ApiGateway为入口流量处理的方案,另外一个则是以阿里云DCDN边缘应用程序为入口流量处理的方案,两个方案都有各自的优劣,后面会详细展开。并且为了能够将项目的完整功能呈现出来,首页的渲染方式准备使用SSR,整个的架构设计方案如下。

方案一:ApiGateway

方案二:DCDN边缘应用程序


3. 工程改造

对整个工程源码进行解读后,将需要改造的部分进行如下罗列:

3.1 前端静态资源

主要包括网站首页图片,产品图片等,原项目中静态资源存放在server/public/uploads 目录下,跟服务端的耦合度比较高,而服务端最终需要运行到函数计算FAAS服务中,无写权限,这部分需要做一些处理。有两种方案可以参考:

  1. 将目录映射到Nas上,利用Nas进行读写,这种改造成本较低,不过缺点是依然依赖主业务服务。
  2. 单独将静态资源文件存储到 OSS,实现跟业务服务的解耦,缺点就是改造成本比第一个方案要高。

3.2 日志

后端服务的日志写入同样会受限,与静态资源不同的是日志服务可以单独写到专业的日志存储服务上不如SLS。

3.3 数据库

数据库部分也要单独准备可访问的链接地址,账号,密码等,这些同样需要改动源码。

3.4 配置项

比如上面提到的数据库信息,日志地址信息,静态资源地址信息等,这些配置项在Serverless架构模式下都需要单独抽离出来,以环境变量的方式替换存在于源码中的位置,以便安全和灵活的设置。

3.5 其他

除了上面几个基本项外,剩下的就是根据业务功能做适当的调整了,实践中比如路径的改动,功能性增加等。此外部署配置部分的内容也需要在源代码中体现,比如使用函数计算Customer Runtime 部署后端Api服务,就需要准备好bootstrap入口文件。

3.6 部署方案

其实就是如何配置ServerlessDevs  s.yaml,  我们需要先配置 Api服务的配置项,将Nestjs的后端项目部署到函数计算,将后端管理系统的前端静态资源上传到OSS对象存储,将主站内容做SSR的构建,然后同样以部署函数的方式部署到函数计算上,最后还要配置网关及路由关系映射,增加DNS解析等。理想的状态是,所有这些操作都可以用统一工程化的方式一键处理,具体实施的环节我将在后面的文章中做详细介绍。

s.yaml的基本信息展示如下:

edition: 1.0.0
name: modern-app-new
access: hanxie
vars:
  region: cn-hangzhou
  fc: 
    serviceName: 'modern-app-new'
    functionName: 'modern-app-new'
    triggers: 'modern-web-api'
    staticPath: '/mnt/auto/modern-app-new/public'
    logPath: '/mnt/auto/modern-app-new/logs/application.log'
  oss:
    bucketName: 'hanxie-modernweb-registery'
    bucketObject: 'admin'
    bucketObject2: 'portal'
services:
  www-admin: # 静态资源
    component: oss
    props:
      region: ${vars.region}
      bucket: ${vars.oss.bucketName} # OSS bucket 自动生成
      subDir: ${vars.oss.bucketObject}
      acl: public-read # 读写权限
      codeUri: ./admin/dist # 指定本地要上传目录文件地址
      website: # OSS 静态网站配置
        index: index.html # 默认首页
        error: 404.html # 默认 404 页
        subDirType: redirect # 子目录首页 404 规则
      # customDomains: # OSS 绑定域名
      #   - domainName: auto
      #     protocol: HTTP
  api-server:
    component: fc
    actions:
      post-deploy: # 在deploy之后运行
      - plugin: keep-warm-fc
        args:
          url: http://modern-app-new.modern-app-new.1611387345152601.cn-hangzhou.fc.devsapp.net
    # actions:
    #   post-deploy:
    #     - component: fc nas upload -r ./server/logs /mnt/auto/modern-app-new
    #     - component: fc nas upload -r ./server/public /mnt/auto/modern-app-new
    props:
      region: ${vars.region}
      service:
        name: ${vars.fc.serviceName}
        description: Aliyun RAM Role
        internetAccess: true
        nasConfig: auto
      function:
        name: ${vars.fc.functionName}
        description: Native recording handler
        timeout: 3000
        memorySize: 1024
        runtime: custom
        environmentVariables:
          NODE_ENV: production
          dbHost: 
          dbPort: 3306
          dbPassword: 
          dbUserName: 
          staticPath: ${vars.fc.staticPath}
          logPath: ${vars.fc.logPath}
        codeUri: ./server
        caPort: 3000
      triggers:
        - name: ${vars.fc.triggers}
          type: http
          config:
            authType: anonymous
            methods:
              - GET
              - POST
              - PUT
              - DELETE
              - HEAD
              - OPTIONS
      customDomains:
        - domainName: auto
          protocol: HTTP
          routeConfigs:
            - path: /*
              serviceName: ${vars.fc.serviceName}
              functionName:  ${vars.fc.functionName}
  ssr-portal:
    component: fc
    actions:
      post-deploy: # 在deploy之后运行
      - plugin: keep-warm-fc
        args:
          url: http://modern-app-portal.modern-app-portal.1611387345152601.cn-hangzhou.fc.devsapp.net
    # actions:
    #   post-deploy:
    #     - component: fc nas upload -r ./server/logs /mnt/auto/modern-app-new
    #     - component: fc nas upload -r ./server/public /mnt/auto/modern-app-new
    props:
      region: ${vars.region}
      service:
        name: modern-app-portal
        description: Aliyun RAM Role
        internetAccess: true
        nasConfig: auto
      function:
        name: modern-app-portal
        description: Native recording handler
        timeout: 3000
        memorySize: 1024
        runtime: custom
        codeUri: ./web
        caPort: 3001
      triggers:
        - name: modern-app-portal
          type: http
          config:
            authType: anonymous
            methods:
              - GET
              - POST
              - PUT
              - DELETE
              - HEAD
              - OPTIONS
      customDomains:
        - domainName: auto
          protocol: HTTP
          routeConfigs:
            - path: /*
              serviceName: modern-app-portal
              functionName:  modern-app-portal

4. 总结

上面介绍了对传统前端应用做Serverless架构重构的基本思路,从设计到工程改造到部署方案都有涉及,单单是内容的罗列就有很多内容,真实的改造中遇到的问题更多,也曾一度有打退堂鼓的想法,怀疑过Serverless改造的投入产出是否合理,但当真正完成后又会有非常大的成就感,在后续对项目的逐渐完善中进一步体会到Serverless架构的魅力所在,相信各位小伙伴在跟随笔者完成这个Serverless架构改造系列文章后也会有相同的感觉,接下来我们一起探索!

相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
11月前
|
SQL 前端开发 关系型数据库
如何开发一套研发项目管理系统?(附架构图+流程图+代码参考)
研发项目管理系统助力企业实现需求、缺陷与变更的全流程管理,支持看板可视化、数据化决策与成本优化。系统以MVP模式快速上线,核心功能包括需求看板、缺陷闭环、自动日报及关键指标分析,助力中小企业提升交付效率与协作质量。
|
10月前
|
数据采集 机器学习/深度学习 运维
量化合约系统开发架构入门
量化合约系统核心在于数据、策略、风控与执行四大模块的协同,构建从数据到决策再到执行的闭环工作流。强调可追溯、可复现与可观测性,避免常见误区如重回测轻验证、忽视数据质量或滞后风控。初学者应以MVP为起点,结合回测框架与实时风控实践,逐步迭代。详见相关入门与实战资料。
|
10月前
|
前端开发 JavaScript BI
如何开发车辆管理系统中的车务管理板块(附架构图+流程图+代码参考)
本文介绍了中小企业如何通过车务管理模块提升车辆管理效率。许多企业在管理车辆时仍依赖人工流程,导致违章处理延误、年检过期、维修费用虚高等问题频发。将这些流程数字化,可显著降低合规风险、提升维修追溯性、优化调度与资产利用率。文章详细介绍了车务管理模块的功能清单、数据模型、系统架构、API与前端设计、开发技巧与落地建议,以及实现效果与验收标准。同时提供了数据库建表SQL、后端Node.js/TypeScript代码示例与前端React表单设计参考,帮助企业快速搭建并上线系统,实现合规与成本控制的双重优化。
|
11月前
|
人工智能 监控 测试技术
告别只会写提示词:构建生产级LLM系统的完整架构图​
本文系统梳理了从提示词到生产级LLM产品的八大核心能力:提示词工程、上下文工程、微调、RAG、智能体开发、部署、优化与可观测性,助你构建可落地、可迭代的AI产品体系。
1311 52
|
10月前
|
机器学习/深度学习 人工智能 缓存
面向边缘通用智能的多大语言模型系统:架构、信任与编排——论文阅读
本文提出面向边缘通用智能的多大语言模型(Multi-LLM)系统,通过协同架构、信任机制与动态编排,突破传统边缘AI的局限。融合合作、竞争与集成三种范式,结合模型压缩、分布式推理与上下文优化技术,实现高效、可靠、低延迟的边缘智能,推动复杂场景下的泛化与自主决策能力。
841 3
面向边缘通用智能的多大语言模型系统:架构、信任与编排——论文阅读
|
10月前
|
人工智能 自然语言处理 安全
AI助教系统:基于大模型与智能体架构的新一代教育技术引擎
AI助教系统融合大语言模型、教育知识图谱、多模态交互与智能体架构,实现精准学情诊断、个性化辅导与主动教学。支持图文语音输入,本地化部署保障隐私,重构“教、学、评、辅”全链路,推动因材施教落地,助力教育数字化转型。(238字)
1750 23
|
11月前
|
消息中间件 数据采集 NoSQL
秒级行情推送系统实战:从触发、采集到入库的端到端架构
本文设计了一套秒级实时行情推送系统,涵盖触发、采集、缓冲、入库与推送五层架构,结合动态代理IP、Kafka/Redis缓冲及WebSocket推送,实现金融数据低延迟、高并发处理,适用于股票、数字货币等实时行情场景。
1657 3
秒级行情推送系统实战:从触发、采集到入库的端到端架构
|
11月前
|
前端开发 API 定位技术
如何开发车辆管理系统中的用车申请板块(附架构图+流程图+代码参考)
本文详细解析了如何将传统纸质车辆管理流程数字化,涵盖业务规则、审批流、调度决策及数据留痕等核心环节。内容包括用车申请模块的价值定位、系统架构设计、数据模型构建、前端表单实现及后端开发技巧,助力企业打造可落地、易扩展的车辆管理系统。
|
10月前
|
存储 人工智能 搜索推荐
拔俗AI助教系统:基于大模型与智能体架构的新一代教育技术引擎
AI助教融合大语言模型、教育知识图谱、多模态感知与智能体技术,重构“教、学、评、辅”全链路。通过微调LLM、精准诊断错因、多模态交互与自主任务规划,实现个性化教学。轻量化部署与隐私保护设计保障落地安全,未来将向情感感知与教育深度协同演进。(238字)
1260 0
|
10月前
|
机器学习/深度学习 人工智能 搜索推荐
拔俗AI学伴智能体系统:基于大模型与智能体架构的下一代个性化学习引擎
AI学伴智能体系统融合大模型、多模态理解与自主决策,打造具备思考能力的个性化学习伙伴。通过动态推理、长期记忆、任务规划与教学逻辑优化,实现千人千面的自适应教育,助力因材施教落地,推动教育公平与效率双提升。(238字)
1223 0

热门文章

最新文章

相关产品

  • 函数计算