我们可以使用 @malagu/scf-adapter 组件把应用部署到腾讯云云函数计算平台。基于约定大于配置原则,零配置,开箱即用。

云资源

适配器组件有一套默认的部署规则,该规则可以被覆盖。适配器组件在执行部署任务的时候,使用平台提供的 SDK,根据部署规则,创建需要的云资源。如果发现云资源已经存在,则差异更新云资源。适配器组件总是以尽可能安全的方式,创建或更新我们的云资源。比如,当我们配置了自定义域名,适配器组件则尝试创建或更新该自定义域名资源。

适配器组件将应用部署到一个函数中,也就是说一个应用对应着一个函数,如果我们的应用很大,我们应该将大应用拆解成一个个小的微应用或者微服务。就像微服务架构的粒度拆分原则一样,合理的粒度拆分,对我们的应用管理是有很多好处的。框架会保证一个应用在一个函数中运行的性能。

环境隔离

在 Malagu 框架中,提供了一个顶级配置属性 stage 表示环境。而在 @malagu/scf-adapter 组件约定的部署规则中,使用 mode 属性映射 stage 属性。默认提供了三套环境:测试、预发和生产。表达式规则如下:

  1. stage: "${'test' in mode ? 'test' : 'pre' in mode ? 'pre' : 'prod' in mode ? 'prod' : cliContext.prod ? 'prod' : 'test'}" # test, pre, prod

stage 取值规则如下:

  • test 测试环境。当 mode 属性包含 test 模式,或者 mode 都不包含 test、pre、prod,且命令行参数 -p,--prod 没有被指定
  • pre 预发环境。当 mode 属性包含 pre 模式
  • prod 生产环境。当 mode 属性包含 prod 模式,或者命令行参数 -p,--prod 被指定

通过指定特殊的 mode 表示不同的部署环境:

  1. # 部署到测试环境
  2. malagu deploy -m test # 或者 malagu deploy
  3. # 部署到预发环境,我们也可以直接跳过预发环境的部署,直接部署到生产环境
  4. malagu deploy -m pre
  5. # 部署到生成环境
  6. malagu deploy -m prod

隔离级别

环境的隔离级别是可控制的。我们可以使用账号隔离环境:不同环境对于不同配置文件,不同配置文件分别配置不同的云账号。同理,我们也可以使用 Region、服务别名来隔离环境。框架默认提供的是服务别名隔离环境。隔离方式可以互相叠加。

stage 属性值与服务别名关联(以下是默认规则,无需配置):

  1. malagu:
  2. faas-adapter:
  3. alias:
  4. name: ${stage}

API 网关的 environment 关联(以下是默认规则,无需配置):

  1. malagu:
  2. faas-adapter:
  3. apiGateway:
  4. release:
  5. environmentName: "${stage == 'pre' ? 'prepub' : stage == 'prod' ? 'release' : stage}"

部署模式

适配器组件通过 mode 属性定义部署模式,支持的部署模式如下:

  • **http** 基于 API 网关 + Web 函数的部署模式。部署过程中,创建或更新 API 网关、命名空间、函数等云资源
  • **timer** 基于定时触发器 + 事件函数的部署模式。部署过程中,创建或更新定时触发器、命名空间、函数等云资源
  • **api-gateway** 基于 API 网关 + 事件函数的部署模式。部署过程中,创建或更新 API 网关、命名空间、函数等云资源
    1. mode:
    2. - http

自定义部署规则

我们可以通过同名覆盖自定义部署规则。

默认规则

默认规则定义在 @malagu/scf-adapter 组件的 malagu-remote.yml 配置文件中。

自定义部署类型

  1. mode:
  2. - htpp # 默认值是 http,目前支持 http、timer、api-gateway

自定义命名空间

  1. malagu:
  2. faas-adapter:
  3. namespace:
  4. name: xxxx # 默认值是 default

命名空间的其他属性也是类似的方式配置。

自定义函数名

  1. malagu:
  2. faas-adapter:
  3. function:
  4. name: xxxx # 默认值是 ${pkg.name}

函数的其他属性也是类似的方式配置。

属性配置

  1. malagu:
  2. faas-adapter:
  3. namespace:
  4. description:
  5. function:
  6. name: ''
  7. namespace:
  8. handler:
  9. publish:
  10. l5Enable:
  11. type:
  12. codeSource:
  13. description:
  14. memorySize:
  15. timeout:
  16. runtime:
  17. role:
  18. clsLogsetId:
  19. ClsTopicId:
  20. env:
  21. vpcConfig:
  22. vpcId:
  23. subnetId:
  24. layers:
  25. name:
  26. version:
  27. deadLetterConfig:
  28. type:
  29. name:
  30. filterType:
  31. publicNetConfig:
  32. PublicNetStatus:
  33. eipConfig:
  34. eipStatus:
  35. alias:
  36. name:
  37. functionName:
  38. namespace:
  39. description:
  40. routingConfig:
  41. additionalVersionWeights:
  42. version:
  43. weight:
  44. addtionVersionMatchs:
  45. version:
  46. key:
  47. method:
  48. expression:
  49. apiGateway:
  50. usagePlan:
  51. name:
  52. environment:
  53. desc:
  54. maxRequestNum:
  55. maxRequestNumPreSec:
  56. strategy:
  57. name:
  58. environmentName:
  59. strategy:
  60. api:
  61. name:
  62. serviceTimeout:
  63. protocol:
  64. desc:
  65. authType:
  66. enableCORS:
  67. businessType:
  68. serviceScfFunctionName:
  69. serviceWebsocketTransportFunctionName:
  70. serviceScfFunctionNamespace:
  71. serviceScfFunctionQualifier:
  72. serviceWebsocketTransportFunctionNamespace:
  73. serviceWebsocketTransportFunctionQualifier:
  74. isDebugAfterCharge:
  75. serviceScfIsIntegratedResponse:
  76. isDeleteResponseErrorCodes:
  77. responseSuccessExample:
  78. responseFailExample:
  79. authRelationApiId:
  80. userType:
  81. oauthConfig:
  82. publicKey:
  83. tokenLocation:
  84. loginRedirectUrl:
  85. responseErrorCodes:
  86. code:
  87. msg:
  88. desc:
  89. convertedCode:
  90. needConvert:
  91. requestConfig:
  92. ApiRequestConfig:
  93. path:
  94. method:
  95. requestParameters:
  96. name:
  97. desc:
  98. position:
  99. type:
  100. defaultValue:
  101. required:
  102. RequestParameter:
  103. service:
  104. exclusiveSetName:
  105. name:
  106. protocol:
  107. description:
  108. netTypes:
  109. ipVersion:
  110. setServerName:
  111. appIdType:
  112. release:
  113. environmentName:
  114. desc:
  115. customDomain:
  116. name:
  117. isDefaultMapping:
  118. certificateId:
  119. protocol:
  120. netType:
  121. pathMappingSet:
  122. path:
  123. Environment: