人人都是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 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
分布式计算 运维 搜索推荐
立马耀:通过阿里云 Serverless Spark 和 Milvus 构建高效向量检索系统,驱动个性化推荐业务
蝉妈妈旗下蝉选通过迁移到阿里云 Serverless Spark 及 Milvus,解决传统架构性能瓶颈与运维复杂性问题。新方案实现离线任务耗时减少40%、失败率降80%,Milvus 向量检索成本降低75%,支持更大规模数据处理,查询响应提速。
743 57
|
数据采集 运维 Serverless
云函数采集架构:Serverless模式下的动态IP与冷启动优化
本文探讨了在Serverless架构中使用云函数进行网页数据采集的挑战与解决方案。针对动态IP、冷启动及目标网站反爬策略等问题,提出了动态代理IP、请求头优化、云函数预热及容错设计等方法。通过网易云音乐歌曲信息采集案例,展示了如何结合Python代码实现高效的数据抓取,包括搜索、歌词与评论的获取。此方案不仅解决了传统采集方式在Serverless环境下的局限,还提升了系统的稳定性和性能。
534 0
|
12月前
|
分布式计算 Serverless OLAP
实时数仓Hologres V3.1版本发布,Serverless型实例从零开始构建OLAP系统
Hologres推出Serverless型实例,支持按需计费、无需独享资源,适合新业务探索分析。高性能查询内表及MaxCompute/OSS外表,弹性扩展至512CU,性能媲美主流开源产品。新增Dynamic Table升级、直读架构优化及ChatBI解决方案,助力高效数据分析。
实时数仓Hologres V3.1版本发布,Serverless型实例从零开始构建OLAP系统
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
1352 69
|
数据采集 运维 监控
Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
随着互联网数据采集需求的增长,传统爬虫架构因固定IP易封禁、资源浪费及扩展性差等问题逐渐显现。本文提出基于Serverless与代理IP技术的新一代爬虫方案,通过动态轮换IP、弹性调度任务等特性,显著提升启动效率、降低成本并增强并发能力。架构图与代码示例详细展示了其工作原理,性能对比数据显示采集成功率从71%提升至92%。行业案例表明,该方案在电商情报与价格对比平台中效果显著,未来有望成为主流趋势。
574 0
Serverless爬虫架构揭秘:动态IP、冷启动与成本优化
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
791 12
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
Cloud Native 安全 Serverless
云原生应用实战:基于阿里云Serverless的API服务开发与部署
随着云计算的发展,Serverless架构日益流行。阿里云函数计算(Function Compute)作为Serverless服务,让开发者无需管理服务器即可运行代码,按需付费,简化开发运维流程。本文从零开始,介绍如何使用阿里云函数计算开发简单的API服务,并探讨其核心优势与最佳实践。通过Python示例,演示创建、部署及优化API的过程,涵盖环境准备、代码实现、性能优化和安全管理等内容,帮助读者快速上手Serverless开发。
|
人工智能 JSON 自然语言处理
一键生成毛茸萌宠形象,基于函数计算极速部署 ComfyUI 生图系统
本次方案将帮助大家实现使用阿里云产品函数计算FC,只需简单操作,就可以快速配置ComfyUI大模型,创建出你的专属毛茸茸萌宠形象。内置基础大模型+常用插件+部分 Lora,以风格化图像生成只需用户让体验键配置简单方便,后续您可以根据自己的需要更换需要的模型、Lora、增加插件。
1182 14
|
存储 消息中间件 人工智能
基于 Apache RocketMQ 的 ApsaraMQ Serverless 架构升级
基于 Apache RocketMQ 的 ApsaraMQ Serverless 架构升级
473 0

相关产品

  • 函数计算