1 Star 0 Fork 0

Serverless Devs Registry / start-realwrold

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

realwrold 生产项目最佳实践

最佳实践

环境划分

背景

一般项目开发会有三套环境,测试环境(test),预发环境(pre)和线上环境(prod)。函数计算FC通过Service 进行隔离。同时三套环境有某些配置不太一样,比如测试环境的实例规格小些为512M,线上实例规格为2G

本质上为了解决配置代码冗余,进行不同环境的划分。 可以通过 Yaml继承extend 可以实现环境划分效果。

环境划分实践

  1. 先创建一个基础的配置模版s-base.yaml
vars:
  baseService: #  服务名称
    component: fc  # 组件名称
    props: #  组件的属性值
      region: cn-hangzhou
      service:
        name: realworld-app
        description: 欢迎使用ServerlessDevs
      function:
        name: hello-world
        handler: index.handler
        runtime: nodejs12
services:
  frontend: ${vars.baseService}
  backend: ${vars.baseService}

这里我们将公共的配置抽离成一个变量vars来维护,同时声明两个应用frontend(前端服务)以及backend(后端服务)来应用它。

ServerlessDevs内置一些变量,可以很方便的解决一些特殊的问题。详情可以参考文档

  1. 配置预发环境s-pre.yaml
extend: ./s-base.yaml

vars:
  serviceName: realworld-app-pre

services:
  frontend:
    props:
      service:
        name: ${vars.serviceName}
      function:
        name: frontend #  函数名
        codeUri: ./frontend # 具体的代码文件夹
  backend:
    props:
      service:
        name: ${vars.serviceName}
      function:
        name: backend #  函数名
        codeUri: ./backend # 具体的代码文件夹
  1. 执行部署 线上环境可以命名为s-prod.yaml配置和预发环境s-pre.yaml类似,不再赘述。 我们通过指定部署文件s deploy -t s-prod.yaml部署到预发环境。详情查看文档

隐私变量

项目开发中有些隐私信息(数据库连接串,阿里云Ak/SK),不能上传到Git版本管理中,否则会造成严重中的安全事故。

这时候有几种推荐方式。

方法1(开发测试环境)

  1. codeUri相对路径下,建立一个.env的文件。.env格式参考代码

  2. 同时这个.env文件必须放在.gitignore文件中,不能提交到代码仓库。

  3. 通过环境变量参数传递给函数计算

extend: ./s-base.yaml

vars:
  serviceName: realworld-app-pre
services:
  backend:
    props:
      service:
        name: ${vars.serviceName}
      function:
        name: backend #  函数名,会体现
        codeUri: ./backend # 具体的代
        码文件夹
        environmentvariables: # 环境变量
          DB_CONNECTION: ${env(DB_CONNECTION)}

参考:

  1. 函数计算代码中获取当前环境变量值 可以通过当前进程获取当前环境变量,比如Nodejs 中这样获取 process.env.DB_CONNECTION

方法2(线上环境)

在CICD场景下通过export DB_CONNECTION=xxx设置到临时环境变量中生效。

jobs:
  serverless-devs-cd:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 12
          registry-url: https://registry.npmjs.org/
      - run: npm install
      - run: npm install -g @serverless-devs/s
      - run: s config add --AccountID ${{secrets.AccountID}} --AccessKeyID ${{secrets.AccessKeyID}} --AccessKeySecret ${{secrets.AccessKeySecret}} -a default
      - run: export DB_CONNECTION=${{secrets.DB_CONNECTION}}
      - run: s deploy

加下来的使用方式方法1一样,在s.yaml配置environmentvariables,然后代码中通过process.env获取当前环境变量值。

fcignore

声明:serverless-Devs ignore 遵循.npmignore规范。基于minimatch 库构建。

.fcignore 作用于当前codeUri目录中,用户在上传代码到函数计算平台时候,可以忽略某些文件。典型场景:比如我的node_module依赖上传到layer。这时候每次执行s deploy时候就需要忽略上传node_module。 详细使用说明参考文档

部署

版本&灰度

  1. 先发布一个版本 s version publish
  2. 设置两个别名,分别对应预发(pre)环境和线上(prod)环境
s alias publish --alias-name pre
s alias publish --alias-name prod
  1. 添加对应的触发器(trigger)
triggers:
  - name: http-trigger
    type: http
    config:
      authType: anonymous
      methods:
        - GET
        - POST
  - name: pre-trigger
    type: http
    qualifier: pre
    config:
      authType: anonymous
      methods:
        - GET
        - POST
  - name: prod-trigger
    type: http
    qualifier: prod
    config:
      authType: anonymous
      methods:
        - GET
        - POST
  1. 修改域名qualifier生效
customDomains:
  - domainName: auto
    protocol: HTTP
    routeConfigs:
      - path: /*
        qualifier: pro

Tips

导出函数配置

通过s sync 命令是将线上的资源(包括配置以及代码)同步到本地。

空文件

简介

Serverless-Devs部署线上生产项目的最佳实践 展开 收起
JavaScript 等 3 种语言
取消

发行版 (1)

全部

贡献者

全部

近期动态

加载更多
不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/devsapp/start-realwrold.git
git@gitee.com:devsapp/start-realwrold.git
devsapp
start-realwrold
start-realwrold
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891