更新时间:2024-04-17 GMT+08:00

模板写作技巧

组件启动等待

假设,您要启动A(Application)和S(Service)两个组件,并且A依赖S(即:A -> S),A需要去连接S做业务。以A为Tomcat,S为MySQL为例。

AOS编排时,会根据模板要求先启动S,待S启动成功后(进程启动成功,实际S的业务功能还不可用),就会接着启动A。由于S业务功能还并未完全启动,A又很快启动,马上去连接S时A就会启动失败,导致整个堆栈启动失败。所以在A启动之前,可能需要等待一小段时间。

目前,在模板语法中是不支持等待的,等待逻辑需要在业务流程中添加。

启动前等待示例如下:

name:  #参数名
  type: string  #参数类型
  description: resource name  #参数介绍
Task-Name:  #任务名,按需要自己取名
  description: sleep before business
  actions:
    poststart: #定义启动前:执行脚本
      command: "/bin/sh, -c, sleep 

数字转成字符串

很多情况下,定义的变量是一个字符串,但同时需要引用此变量既作为字符串,又作为数字。例如,端口号在作为ENV环境变量时,要求其值是字符串类型,而在作为应用微服务属性时,要求其值为数字。

针对上述问题,有如下两种方式可解决:

  • 方式一:定义两个变量

    定义PORT-iPORT-s两个变量,PORT-s是字符串,PORT-i是数字。这种方法虽然可以直截了当的解决问题,但效果并不是很好。因为带入了重复,从而使模板的可维护性和易用性变差。

  • 方式二:使用concat内置函数

    通过concat内置函数将多个小字符串拼接为一个更长、更完整的字符串。concat内置函数的参数可以是任意类型的变量,支持将数字和字符串混合拼接。示例如下:

    首先定义变量:

    magento-EPORT:
      type: integer
      default: 32080

    其次在ULR时需要为字符串:

    name: MAGENTO_URL
      value: 
        concat:
        - "http://"
        - {get_input: magento-EIP}
        - ":"
        - {get_input: magento-EPORT}  #这里直接将数字转为字符串了

    再次在微服务属性时需要为数字:

    serviceSpec:
      ports:
        - port: {get_input: magento-container-port}
          nodePort: {get_input: magento-EPORT}  #这里要求是数字