华为云用户手册

  • 场景描述 实现场景:根据查询到的呼吸机资源,数据判断资源是否充足,并修改相关资源信息。 实现方案:提前创建好呼吸机资源对象Respirator,使用服务编排实现上述场景功能。 通过循环图元对传入的数组对象变量RespiratorInfos(即空闲状态下的呼吸机资源数组)进行遍历,并将数组中的每个元素放置到对象变量RespiratorInfo(空闲状态下的呼吸机资源数组元素)中。 通过“赋值”图元,设置参数。 将当前遍历的对象变量元素,添加到此次申请的原始呼吸机资源数组中,并对计数进行加一操作。将当前遍历的对象变量元素的字段医院信息修改为发起呼吸机申请的医院信息,将呼吸机状态修改为“使用中”,并添加到申请后的呼吸机资源数组中。 通过“决策”图元,判断资源是否充足。 走“ResourceEnough1”分支:在空闲状态下的呼吸机资源满足申请数量时,跳出循环,返回信息“资源充足,申请呼吸机成功!”。 走“ResourceNotEnough1”分支:循环遍历全部元素后仍未满足申请数量,将走Finish连线进行资源是否充足的判断: 走“ResourceEnough2”分支:资源充足情况下,返回“资源充足,申请呼吸机成功!”。 走“ResourceNotEnough2”分支:当此次申请的呼吸机资源数组中,实际存在的资源数量比申请的数量少时,代表申请的资源不足,返回信息“资源不足,申请失败!”。 图1 总体编排流程
  • 前提条件 开发呼吸机申请服务,首先需要创建呼吸机资源对象Respirator,作为呼吸机申请服务处理的对象。 表1 Respirator对象自定义字段 字段名 字段类型 字段含义 status 文本 呼吸机当前状态,“空闲”或“使用中”。 hospital 文本 呼吸机当前所在医院。 参考经典应用开发工作台介绍中操作,登录经典版应用设计器。 将鼠标放在某个应用的目录上(例如,Model文件夹上),单击 “+”,选择“对象”。 设置对象的标签和名称为“Respirator”,单击“添加”。 图2 添加Respirator对象 在“自定义字段”页签,单击“新建”。 字段类型选择“文本”,单击“下一步”。 设置字段标签和名称为“status”,“数据长度”设置为“255”,单击“下一步”。 设置字段的访问权限,即哪些Profile可以查看或修改该字段,单击“下一步”。 添加到页面布局保持默认,即默认该字段加入所有布局,单击“保存”。 参考3~8中操作,新建“hospital”字段。
  • 如何开发呼吸机申请服务 参考如何创建服务编排中操作,创建“名称”和“标签”为“RespiratorApply”的服务编排。 图2 新建RespiratorApply服务编排 参照表1,定义服务编排用到的变量,并设置该服务编排的入参和出参。 表1 变量说明 变量名 变量类型 变量说明 num 数字 申请的呼吸机数量。 hospital 文本 申请呼吸机的医院。 msg 文本 申请结果。 RespiratorInfos Respirator对象数组 系统中空闲状态下的呼吸机资源数组(后用于存放信息修改后的资源数组)。 RespiratorRecs Respirator对象数组 此次申请的原始呼吸机资源数组。 在服务编排编辑器页面右侧,选择,在全局上下文页面单击“变量”后的加号。 图3 创建变量 单击新增变量后的“...”,选择“设置”。 图4 设置变量 配置数字类型的变量“num”,单击“保存”。 图5 配置变量 表2 普通变量参数说明 参数 参数说明 名称 新增变量的名称,直接输入“num”。 数据类型 变量的数据类型,根据业务需求直接在下拉框中选择。 本示例设置为“数字”。 默认值 变量的默认取值。 本示例不用配置。 描述 新增变量的描述说明,建议填写该变量的作用。 是否为数组 是否为数组型变量即集合变量。 本示例不勾选。 参考上述操作,创建文本类型的变量“hospital”、“msg”。 图6 成功创建变量 在服务编排编辑器页面右侧,选择,在全局上下文页面单击“对象变量”后的加号。 图7 创建对象变量 参考上述操作,新建对象变量“RespiratorInfos”,对象中选择前提条件中创建的对象Respirator,设置字段描述信息(可选),选中“是否为数组”,单击“保存”。 图8 配置数组类型对象变量 参考上述操作,创建数组类型的对象变量“RespiratorRecs”,注意要选中“是否为数组”。 单击画布中的“开始”图元,在右侧菜单选择,单击右上角“全局上下文”展开“全局上下文”页面,将变量num、变量hospital拖拽到“入参”中,将变量msg、对象变量RespiratorRecs拖拽到“出参”中。 图9 配置开始图元 编排该服务主要使用了三种图元,分别是“子服务编排”“赋值”、“决策”图元,按照下图将相关图元拖拽到画布中对应位置。 图10 拖拽图元 在画布上,把鼠标放在起点图元图元上,从“+”拖动鼠标,在起点图元和“子服务编排”图元Flow0间增加连线。 配置“子服务编排”图元Flow0。 单击画布中的“子服务编排”图元Flow0,在“基本信息”页面中配置图元标签为“查询呼吸机资源”,名称为“SelectRespirator”。 图11 配置“子服务编排”图元基本信息 如下图所示,单击,在“子服务编排”页面“服务编排实例”中选择查询对象数据创建的服务编排“SelectRespirator”。配置输出参数,从“全局上下文”页面拖拽变量到“目标”中。 图12 配置子服务编排图元Flow0 如上图配置,将调用查询对象数据中开发的查询对象记录服务编排,并将查询结果存放到对象变量RespiratorInfos中。 从“子服务编排”图元“SelectRespirator”连向“子服务编排”图元Flow1。 配置“子服务编排”图元Flow1。 单击画布中的“子服务编排”图元Flow1,在“基本信息”页面中配置图元标签为“处理呼吸机资源”,名称为“ProcessRespiratorResouce”。 如下图所示,单击,在“子服务编排”页面“服务编排实例”中选择如何使用服务编排开发业务的基本逻辑创建的服务编排“ProcessRespiratorResource”。配置入参和出参,其中变量是由展开的“全局上下文”页面拖拽来的。 图13 配置子服务编排图元Flow1 如上图配置,将调用如何使用服务编排开发业务的基本逻辑中开发的资源处理服务编排,并将查询对象记录服务编排中返回的空闲状态下呼吸机资源以及申请医院、资源数量作为入参传入,返回申请结果、被申请的呼吸机资源以及修改信息后的呼吸机资源数组存入相应对象变量。 从“子服务编排”图元“ProcessRespiratorResouce”连向“决策”图元Decision0。 配置“决策”图元Decision0。 单击画布中的“决策”图元Decision0,在“基本信息”页面中配置图元标签为“判断资源是否充足”,名称为“judgeResource”。 在“决策”页面中,单击“默认”结果,将名称设置为“ResourceEnough”,单击“新增”,新增一个名为“ResourceNotEnough”的结果,并如下图所示进行配置。 图14 配置默认结果 图15 新增“ResourceNotEnough” “ResourceNotEnough”结果表示当返回的资源数组为空时,代表资源不足,走向赋值图元设置错误信息;默认的“ResourceEnough”结果代表资源充足,将进行系统中数据的修改。 从“决策”图元“judgeResource”连向“子服务编排”图元Flow2,连线类型为“ResourceEnough”,从“决策”图元Decision0连向“赋值”图元Assignment0,连线类型为“ResourceNotEnough”。 配置“子服务编排”图元Flow2。 单击画布中的“子服务编排”图元Flow2,在“基本信息”页面中配置图元标签为“修改呼吸机资源状态”,名称为“UpdateRespiratorResource”。 如下图所示,单击,在“子服务编排”页面“服务编排实例”中选择修改对象数据中创建的服务编排“UpdateRespirator”,并配置输入参数。 图16 配置子服务编排图元Flow2 如上图配置,将调用修改对象数据中开发的修改对象记录服务编排,根据传入的对象变量RespiratorInfos对系统中的对象数据进行修改。 配置“赋值”图元Assignment0。 单击画布中的“赋值”图元Assignment0,在“基本信息”页面中配置图元标签为“设置错误信息”,名称为“setError1”。 如下图所示,单击,在“赋值”页面进行配置赋值语句,在资源不足的情况下设置相应的错误信息。 图17 配置赋值图元Assignment0 单击页面上方的,保存服务编排。 保存成功后,单击,运行服务编排。 进行测试。 当资源不足时,测试服务是否报错并返回相应错误信息。 设置输入参数,单击“运行”,人民第66医院需要申请5台呼吸机。 { "hospital": "人民第66医院", "num": 5} 检查输出页签的结果,是否符合预期。 返回如下信息,表示资源不足,申请失败。 图18 输出结果 测试当资源充足时,返回信息“资源充足,呼吸机申请成功!”,以及申请的呼吸机资源信息,并修改系统中对象数据。 打开创建对象数据中创建的服务编排“CreateRespirator”,单击页面上方的,运行服务编排。 设置输入参数,单击“运行”,创建5台某医院空闲的呼吸机。 其中,“CNAME”为命名空间名称,请替换为环境中实际配置的命名空间。 { "RespiratorInfos": [ { "name": "呼吸机1", "CNAME__hospital__ CS T": "第1人民医院", "CNAME__status__CST": "空闲" }, { "name": "呼吸机2", "CNAME__hospital__CST": "第1人民医院", "CNAME__status__CST": "空闲" }, { "name": "呼吸机3", "CNAME__hospital__CST": "第1人民医院", "CNAME__status__CST": "空闲" }, { "name": "呼吸机4", "CNAME__hospital__CST": "第1人民医院", "CNAME__status__CST": "空闲" }, { "name": "呼吸机5", "CNAME__hospital__CST": "第1人民医院", "CNAME__status__CST": "空闲" } ]} 打开本节开发的服务编排“RespiratorApply”,单击页面上方的,运行服务编排。 设置输入参数,单击“运行”,人民第66医院需要申请5台呼吸机。 { "hospital": "人民第66医院", "num": 5} 检查输出页签的结果,是否符合预期。 资源充足时,如下图所示返回信息“资源充足,呼吸机申请成功!”,以及申请的呼吸机资源信息。 图19 输出界面 在对象Respirator的“布局”页签,单击“Respirator Records”后的,查看到对象记录中状态已成功由“空闲”更新为“使用中”,且修改呼吸机资源所在的医院信息。 图20 查看布局页 图21 查看对象记录 单击页面上方的,启用服务编排。
  • 场景描述 实现场景:由于呼吸机资源缺乏,为了有效利用剩余的呼吸机,需要提供呼吸机申请服务进行资源调度。申请人调用服务接口提供医院信息和申请呼吸机资源数量,服务根据系统中处于空闲状态下的呼吸机资源判断资源是否充足,在资源充足的情况下返回被申请的呼吸机信息并修改系统中相应呼吸机的医院信息和状态。 实现方案:使用服务编排实现上述功能,实现逻辑如下: 通过调用查询对象数据中创建的服务编排,获取系统中空闲状态下的呼吸机信息。 通过调用如何使用服务编排开发业务的基本逻辑中创建的服务编排,进行资源是否充足的判断,返回被申请的呼吸机信息。 通过决策图元判断上一步骤返回的申请呼吸机信息,做出下一步操作。 走“ResourceEnough”分支:在资源满足的情况下调用修改对象数据中创建的服务编排,修改系统中被申请的呼吸机的医院信息和状态。 走“ResourceNotEnough”分支:在资源不足的情况下返回错误信息。 图1 呼吸机申请服务总体流程
  • 创建您的第一个服务编排 此处以创建一个根据传入的用户名,配置欢迎信息的简单业务场景为例,向您介绍如何创建一个服务编排。 参考如何创建服务编排中操作,创建名称和标签为“HelloFlow”的服务编排。 创建变量。 在服务编排设计器中,单击,进入全局上下文页面。 单击“变量”后的,创建表2中的变量。 图4 创建变量 表2 变量说明 变量名 类型 变量说明 userName 文本 传入的用户名 message 文本 欢迎信息 在全局上下文中,除了创建基本类型的变量,还可以创建“常量”、“公式”、“对象变量”、“系统变量”和“全局常量”,详情请参见变量及输入输出参数配置。 单击,配置服务编排的输入输出参数。 图5 配置输入输出参数 将“逻辑”中的“赋值”图元,拖拽到画布中。 赋值图元可以实现对全局上下文中变量等参数进行赋值,其他图元的详情介绍,请参见图元配置。 图6 选择赋值图元 配置图元。 选择赋值图元,单击。 在“赋值”页面中,单击“新增行”,参照下图将创建的变量拖拽到相应的位置。 将“"Hello,"”赋值给message变量,并将userName变量拼接到message变量中,赋值语句将从上往下依次执行。 图7 配置赋值图元 连接图元指定逻辑关系,即从开始图元连向赋值图元,表示服务编排开始执行后,执行赋值图元的赋值语句。 图8 连接图元 单击页面上方的,保存服务编排。 单击,进入服务编排调试页面。 在输入参数中,输入如下内容,并单击“运行”。 { "userName": "AstroZero"} 运行结果如下,输出“Hello,AstroZero”。 图9 运行结果 单击页面上方的,启用服务编排。 调试已创建的服务编排。 在经典版应用设计器中,单击页面下方的“服务”。 在公共接口中,单击“新建”,新建一个hellowFlow公共接口,单击“保存”。 图10 新建公共接口hellowFlow 在公共接口列表中,单击接口后的。 在预览页面,单击“测试一下”,输入示例模型,单击“运行”。 图11 测试接口 图12 查看API测试结果
  • 如何创建服务编排 参考如何登录经典应用设计器中操作,登录经典版应用设计器。 将鼠标放在Logic文件夹上,单击“+”,选择“服务编排”。 设置服务编排参数,单击“添加”。 图2 创建服务编排 创建一个新的服务编排:从零开始,创建一个新的服务编排。 使用已有的服务编排:基于同一租户或基线里已有的服务编排,来创建一个服务编排,方便用户快速继承已有服务编排的配置,增加效率。 类型:服务编排的类型。 Autolaunched Flow:自启动Flow,在接口调用后会立即执行服务编排模型定义的逻辑。 Event Trigger:事件触发的服务编排,在事件触发时才会开始执行服务编排模型定义的逻辑。当选择该类型时,您需要配置具体的事件以及条件规则。 标签:新建服务编排的标签名,用于在界面展示。 名称:服务编排在系统中的唯一标识,创建后不支持修改。系统会自动在名称前添加“{命名空间}__”,当其他功能调用服务编排时,调用的是服务编排的名称,而不是标签。 描述:新建服务编排的描述信息,通常设置为服务编排的功能。
  • 初识服务编排编辑器 服务编排编辑器页面由上方按钮区域、左侧图元面板区域、中间画布区域和右侧参数配置区域四部分组成。 图3 服务编排编辑器页面 表1 区域说明 区域 区域说明 按钮区域 功能按钮区域,包括启用(或者禁用)、保存、另存为新版本或者新服务编排、执行服务编排、操作回退、撤销回退等,支持快捷键操作,即可脱离鼠标直接用键盘操作。 服务编排启用后,单击页面右上角的,可查看该组件的调用关系图。 图元面板区域 图元面板区域呈现服务编排编辑器的图元算子。服务编排编辑器以图元算子为基础,可直接将图元算子拖入画布区域进行逻辑编排。图元算子包括如下五类: 基本:基本类型图元,能够实现在服务编排中进行脚本或者服务编排的调用,增/改/删/查对象记录,以及发送邮件、发送事件的功能。 逻辑:逻辑判断图元,能够实现在服务编排中进行变量赋值Assignment、循环Loop、跳出循环Break、决策Decision、等待Wait的功能。 BO:商业对象图元,即将封装好的BO能力作为服务编排中的一个节点,实现特定的业务功能图元。 Native服务:原生服务图元,用于调用原生服务提供的接口。 连接器:与第三方系统对接的图元,例如将短信发送、支付等第三方连接器作为当前服务编排中的一个节点图元。 画布区域 服务编排设计操作区域,在该区域可对服务编排进行具体流程设计、图元放置。 配置区域 整个服务编排或图元的属性设置区域。选择画布区域服务编排中具体图元时,右侧配置区域为该图元的属性设置区域。选择服务编排中空白区域或者开始图元时,右侧配置区域为该服务编排的设置区域。 :服务编排基本信息配置菜单。 :显示服务编排类型、是否启用。 :整个服务编排的入参、出参,可从“全局上下文”中,选择变量拖拽到服务编排的入参、出参中。 :服务编排使用的私有结构体。 :全局上下文变量,主要用于创建服务编排中需要使用的变量、公式以及结构体变量等。
  • Chart元素说明 ConfigMap 是一种用于存储工作负载所需配置信息的资源类型,内容由用户决定。配置项创建完成后,可在工作负载中作为文件或环境变量使用。允许将配置文件从容器镜像中解耦,从而增强容器工作负载的可移植性。 Secret(密钥) 是一种用于存储工作负载所需要认证信息、密钥的敏感信息等的资源类型,内容由用户决定。资源创建完成后,可在容器工作负载中作为文件或环境变量使用。其配置页面上参数含义与ConfigMap大体相同,差异的参数说明如下: “密钥类型”取值为“Opaque”,表示一般密钥类型。 “密钥数据”的“值”必须使用Base64编码。对字符串进行Base64加密,可以直接使用“echo -n 待编码内容 | base64”命令。 root@ubuntu:~# echo -n "待编码内容" | base64 无状态负载 等同于Kubernetes中的“Deployment”概念,所有Pod实例之间是对等的,互不依赖,少了任意一个Pod实例,并不影响整个工作负载的功能。 有状态负载 等同于Kubernetes中的“StatefulSet”概念,是用来管理有状态应用的工作负载API对象。和“无状态负载”相同的是,“有状态负载”管理了基于相同容器定义的一组Pod。和“无状态负载”不同的是,“有状态负载”为每个Pod维护了一个固定的ID。这些Pod是基于相同的声明来创建的,但是不能相互替换。无论怎么调度,每个Pod都有一个永久不变的ID。选择“有状态负载”时,必须要配置“实例间发现服务”。 实例间发现服务指的是Kubernetes的Headless Service,Headless Service用于控制Pod的网络域名,通过Pod的网络域名可以访问特定的Pod实例。例如,集群域名为cluster.local,有状态负载的名称为web,有3个Pod实例,则3个Pod的名称分别为web-0、web-1和web-2,Headless Service的名称为nginx,则3个Pod的域名分别是web-0.nginx.$(命名空间).svc.cluster.local、web-1.nginx.$(命名空间).svc.cluster.local、web-2.nginx.$(命名空间).svc.cluster.local,通过Pod域名访问到具体的Pod实例。
  • 服务编排基本能力 拖拉拽式编排流程 以往的传统编程,需要进行变量的声明并编写相应逻辑代码进行服务的开发。使用服务编排进行服务开发,能够通过拖拉拽的方式,将配置项创建的变量以及服务编排中提供的各种功能进行编排,并以流程的方式将服务所要实现的功能展现出来。整个开发过程中无需进行代码的编写,简单快捷,并能够图形化展示服务的逻辑。 逻辑处理 服务编排中提供了逻辑处理的图形化元件,包括赋值、循环、跳出循环、决策和等待。通过这些图元能够实现基本的逻辑处理,并图形化展示,便于开发者理解,详情可参考操作步骤中对逻辑处理图元的使用。 对象处理 服务编排中提供了对象处理的图形化元件,包括记录创建、记录查询、记录更新和记录删除。通过这些图元能够对通过平台创建的自定义对象或标准对象进行相应的增、删、改、查操作,简化处理对象数据的流程,提高开发效率,详情可参考如何使用服务编排开发数据的增删改查中对象处理图元的使用。 服务单元组合脚本、原生服务、BO、第三方服务 服务编排中提供了服务单元组合的图形化元件,包括脚本、子服务编排、原生服务、BO和连接器。通过这些图元能够将平台中已开发完成的服务集成到服务编排中,并重新进行组合,快速扩展出更丰富的业务功能。
  • 服务编排与模块间调用关系 服务编排将平台提供的部分功能模块进行了封装,并提供了平台其他模块调用服务编排的能力,下面介绍其他模块与服务编排是如何进行相互调用的。 脚本 在服务编排中可以通过配置脚本图元,选择当前应用中的脚本进行脚本的调用。 在脚本中可以通过引入sys库,然后执行sys.invokeFlow({Flow_Name}),进行服务编排的调用。其中,Flow_Name为服务编排的名称。 对象 在服务编排中,可以通过配置记录创建、查询、更新、删除图元,对当前应用中的对象记录进行增删改查的操作,详情请参考如何使用服务编排开发数据的增删改查。 标准页面 在标准页面的模型视图中新建服务模型,能够绑定服务编排,进行服务编排的调用。 BPM 在BPM中可以通过配置“调用服务编排”活动,选择相应的服务编排进行服务编排的调用。 API接口 在新建接口时选择资源类型为“服务编排”,并选择相应的服务编排,即可将服务编排绑定到服务接口上,通过API接口进行服务编排的调用。 BO 在服务编排中调用BO(BO是封装了完整的数据模型、业务逻辑、页面展现的软件单元)进行使用,详情请参考BO图元。 连接器 在服务编排中调用与第三方系统对接的接口,如对接短信发送、 云存储 、系统中已定义的Action等,详情请参考连接器图元。
  • 规则10:SELECT语句中谨慎使用order by SELECT语句中,请谨慎使用order by。如果需要使用order by,请为排序字段增加索引,以提高查询效率。如果无法增加索引,需要关注是否存在查询性能低下的风险。 错误代码示例 import * as db from 'db';let errorDemo = db.sql().exec("select object_name from object_demo where object_id = 'HuaWei' Orde by createdDate") 表“object_demo”中的“createdDate”,并没有创建索引。 正确代码示例 import * as db from 'db';let correctDemo = db.sql().exec("select object_name from object_demo where id = 'HuaWei' Order by createdDate") “object_demo”中的“createdDate”,创建了索引。
  • 规则4:SELECT语句中查询字段不在表的索引库中 如果SELECT语句where条件中,查询字段并未创建索引,请判断该字段是否需要创建索引,以提高代码查询效率。 错误代码示例 import * as db from 'db';let errorDemo = db.sql().exec("select object_name from object_demo where object_id = ?") 表“object_demo”中的“object_id”并没有创建索引。 正确代码示例 import * as db from 'db';let correctDemo = db.sql().exec("select object_name from object_demo where id = ?") 表“object_demo”中的“id”创建了索引。
  • 规则6:SELECT语句中聚集函数必须增加别名 SELECT语句中,聚合函数必须使用别名方式存储查询结果,以免因聚合函数返回的结果不一致,导致存在兼容性问题。 错误代码示例 import * as db from 'db';let errorDemo = db.sql().exec("select count(*) from object_demo where object_name = 'HuaWei'") 正确代码示例 import * as db from 'db';let correctDemo = db.sql().exec("select count(*) as count from object_demo where object_name = 'HuaWei'") 推荐代码示例 ***聚合函数示例 ****select count(*) as count_res,select max(*) as max_res,select min(*) as min_res,select avg(*) as avg_res,select sum(*) as sum_res
  • 规则7:SELECT语句中严禁使用“select from...”形式查询语句 严禁使用“select ...”形式查询语句,请指出select的具体字段。 错误代码示例 import * as db from 'db';let errorDemo = db.sql().exec("select from object_demo where object_name = 'test'") 正确代码示例 import * as db from 'db';let correctDemo = db.sql().exec("select id, object_type from object_demo where object_name = 'test'")
  • 属性 在属性中,设置翻牌器组件的位置、边框、背景等。 图2 属性 基础 组件标题:设置组件的标题。 组件名称:设置组件的名称。 位置 距离左端:组件到页面左侧的距离,单位为px。 距离顶端:组件到页面顶部的距离,单位为px。 宽度:组件的宽度,单位为px。 高度:组件的高度,单位为px。 堆叠顺序:设置组件层叠显示顺序。组件的堆叠顺序默认都是“1”,数字越大,显示越靠前。当需要让组件置底时,可设置堆叠顺序为“0”。 自适应高度:组件的高度是否随宽度改变。 边框:设置组件的边框样式,如全边框或角边框。 背景 样式:设置背景的样式,如普通、居中、拉伸等。 图片链接:背景图片URL。 颜色:设置背景的颜色。
  • 规则8:SELECT语句中拼接的参数值请谨慎使用入参变量 SELECT语句中,拼接的参数值请谨慎使用入参变量,以免引起SQL注入的风险。 错误代码示例 import * as db from 'db';let errorDemo = "select id,name from object_demo where id = ";errorDemo += input.parameter let errorDemoResult = db.sql().exec(errorDemo) 其中,“input.parameter”为脚本入参。 正确代码示例 import * as db from 'db';let correctDemo = "select id,name from object_demo where id = ?";let correctDemoResult = db.sql().exec(correctDemo, { params: [input.parameter] }) 其中,“input.parameter”为脚本入参。
  • 操作步骤 参考如何进入经典开发环境中操作,进入经典版开发环境。 单击对应的应用(如App、BO或Addon App),进入应用设计器。 在左侧菜单列表中,单击,进入自动保存恢复页面。 在自动保存恢复页面,可查看到AstroZero自动保存的数据。 注意数据不是实时刷新的。 单击“查看”,可查看每次自动保存的数据。 系统默认每15分钟自动保存一次,如果用户打开的服务编排等没有修改,则不会再自动保存一次而占用15次限额。 图1 查看自动保存的数据 单击“恢复”,提示“恢复操作将会另存一个新的标准页面/新版本,确认执行?”,单击“确定”,可将自动保存的数据另存为新页面或新版本。 图2 将自动保存的数据另存为新页面或新版本
  • 测试场景下创建证书和私钥的操作方法 该方法创建的证书通常只适用于测试场景。 执行如下命令生成密钥文件tls.key。 openssl genrsa -out tls.key 2048 命令执行后将在当前目录生成一个tls.key的私钥文件。 生成的密钥格式必须为: ----BEGIN RSA PRIVATE KEY-----……………………………………………..-----END RSA PRIVATE KEY----- 用此私钥去签发生成自己的证书文件tls.crt。 openssl req -new -x509 -key tls.key -out tls.crt -days 3650 根据提示输入国家、省、市、公司、部门、申请人和邮箱,按回车键确认。 生成的证书格式必须为: -----BEGIN CERTIFICATE-----……………………………………………………………-----END CERTIFICATE-----
  • 前提条件 已下载之前设计的Chart包。 在AstroZero开发环境的Native Service配置页面,选择“导航”。 在“Chart设计”页签版本列表区域,单击需要导出的Chart后的导出按钮。 图1 导出Chart包 操作列按钮分别提供编辑Chart包、修改Chart包状态(单击后,Chart包状态是“Published”,无法再编辑该Chart包。单击后,Chart包状态是“Draft”,可编辑该Chart包。该界面不提供发布功能,实际发布要去CCE部署和发布)、预览Chart配置、导出Chart包、克隆已有Chart包配置和删除功能。
  • 如何使用原生服务 租户线下开发了一些服务,服务运行在Docker容器中。租户希望可将线下开发的这些服务集成到AstroZero上,供AstroZero内部应用或者其他第三方系统调用。 Native Service在AstroZero内的使用场景包括但不限于: 在服务编排内部进行调用 租户线下开发的服务集成到AstroZero上,可以作为Native服务,被服务编排调用。 外部系统通过Restful接口调用 通过下面的REST接口,调用原生服务,输入参数在body中填写。 https://AstroZero域名/native/NativeService1/0.1.0/health 其中,“AstroZero域名”为AstroZero对外提供的默认域名,“/native/NativeService1/0.1.0/health”为该服务开放接口的URL,可以在开放接口详情中获取。该调用方式,只适用于外部接口。 图3 查看接口URL 在脚本中调用 租户线下开发的服务集成到AstroZero上,且在AstroZero上自定义该服务的开放接口后,可以在脚本中内部调用开放接口。 脚本部分示例如下: let resp3 = httpClient.post("https://AstroZero域名" + "/native/NativeService1/0.1.0/health", callOptions3);console.log(context.getHost())console.log(resp3.body);if (resp3.body.resCode == "0" && resp.body.result) {console.log('auth success, currrent user is: ', resp3.body.result.name)} 其中,“AstroZero域名”为AstroZero对外提供的开发态默认域名,“/native/NativeService1/0.1.0/health”为该服务开放接口的URL。该调用方式,只适用于外部接口。 在页面中调用 在高级页面的Widget代码中,调用原生服务的开放接口。标准页面则可在事件代码中直接调用原生服务的开放接口或通过定义服务模型,关联调用原生服务的服务编排,再在页面事件代码中,调用服务模型,从而来调用原生服务。 在标准页面上传组件中,还可以调用原生服务的自定义接口实现上传功能。标准页面中上传组件功能介绍,请参见上传。 在工作流中调用 在服务编排中调用原生服务后,向工作流设计页面的泳道中,拖入“调用服务编排”图元。选择,在服务编排配置页面,选择需要调用的服务编排。 在触发器中调用 在服务编排中调用原生服务后,在触发器中可调用该服务编排,当满足触发器规则时,系统会执行该服务编排。
  • 使用原生服务具备哪些优势 面向第三方技术开发人员,原有资产不用重新开发,复用原有的业务和技术能力,可快速接入AstroZero,实现与现网系统快速集成,提升系统粘性。 提升微服务构建能力,优化应用系统架构,助力伙伴基于AstroZero构建重量级行业应用。 自有资产可基于AstroZero资产市场,实现共享、共建合作生态。 使用CCE/CCE敏捷版部署,接入AstroZero,投资小、成本低。传统的IT实现,客户如果要构建应用系统,必须从硬件和软件全部一次性购买。使用AstroZero,像住酒店一样,按需入驻,不需要关注酒店的建筑、运营和维修。初始投资少、成本低、减少投资风险。
  • 相关概念 由于Native Service涉及的概念比较多,在做Native Service配置前,建议先提前了解如下相关概念。部分概念说明源于Kubernetes官网介绍,若需要了解更多Kubernetes相关内容,请参考Kubernetes资料。 Native Service 将租户已有的一些服务(服务为租户线下开发,运行在Docker容器中,并非在AstroZero上开发)的API集成到AstroZero上,供上层应用调用,帮助租户更加高效的构建应用。 Chart 在部署Native Service前,需要配置Chart,用于生成kubernetes(简称“K8s”)资源配置文件。配置Chart,其实是配置部署Docker容器时需要的资源、存储、网络等一系列参数,为容器的部署、服务的运行提供支撑。 Kubernetes(简称“K8s”) Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容和维护等功能。 节点(Node) 每一个节点对应一台服务器(可以是虚拟机实例或者物理服务器),容器应用运行在节点上。节点上运行着Agent代理程序(kubelet),用于管理节点上运行的容器实例。 实例(Pod) 实例(Pod)是 Kubernetes 部署应用或服务的最小的基本单位。一个Pod 封装多个应用容器(也可以只有一个容器)、存储资源、一个独立的网络 IP 以及管理控制容器运行方式的策略选项。 图1 实例(Pod) 容器 一个通过Docker镜像创建的运行实例,一个节点可运行多个容器。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。 图2 实例Pod、容器Container、节点Node的关系 Docker Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等,极大的简化了容器的创建和维护。使得Docker技术比虚拟机技术更为轻便、快捷。Docker是Kubernetes Pod中最常用的容器运行时,但Pod也能支持其他的容器运行时。若需要了解更多Docker相关内容,请参考Docker官网。 Docker镜像 Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 镜像(Image)和容器(Contianer)的关系,像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 云容器引擎(Cloud Container Engine,简称“CCE”) 云容器引擎提供高可靠高性能的企业级容器应用管理服务,支持Kubernetes社区原生应用和工具,简化云上自动化容器运行环境搭建。 密钥(Secret) 密钥是一种用于存储工作负载所需要认证信息、密钥的敏感信息等的资源类型,内容由用户决定。资源创建完成后,可在容器工作负载中作为文件或者环境变量使用。 ConfigMap ConfigMap是一种用于存储工作负载所需配置信息的资源类型,内容由用户决定。配置项创建完成后,可在容器工作负载中作为文件或者环境变量使用。允许您将配置文件从容器镜像中解耦,从而增强容器工作负载的可移植性。 无状态负载 等同于Kubernetes中的“Deployment”概念,所有Pod实例之间是对等的,互不依赖,少了任意一个Pod实例,并不影响整个工作负载的功能。 有状态负载 等同于Kubernetes中的“StatefulSet”概念,是用来管理有状态应用的工作负载API对象。和“无状态负载”相同的是,“有状态负载”管理了基于相同容器定义的一组Pod,和“无状态负载”不同的是,“有状态负载”为每个Pod维护了一个固定的ID。这些Pod是基于相同的声明来创建的,但是不能相互替换。无论怎么调度,每个Pod都有一个永久不变的ID。 Service 可以理解为使用标签选择器(selectors)标识的一组Pod,通过Service可以访问到这组Pod。 Ingress Ingress是对集群中服务的外部访问进行管理的API对象,访问方式是HTTP或者HTTPS。
  • 配置Chart时的规则约束 规则1:在配置Chart时,Chart中应尽量避免包含密码等敏感信息。若需要配置敏感信息,用户需要自行对敏感信息进行加密,且Chart中不能包含解密敏感信息需要的密钥。 规则2:将Chart中的易变参数定义为全局变量,可避免因为参数变更时,修改并重新生成Chart包。 全局变量将用于生成Chart包中的“values.yaml”文件。在华为云CCE上部署Chart时,“values.yaml”文件的内容可以通过界面进行修改。因此,应将和环境相关的信息或其他易变参数定义为全局参数,例如镜像地址、pod实例数等。 规则3: 必须要为Ingress资源配置注解,注解中键为“nginx.ingress.kubernetes.io/ssl-redirect”,值为“false”。 华为云CCE的Kubernetes集群默认部署Nginx控制器,需要在Ingress上添加注解。如何添加注解,请参考Kubernetes资料。 AstroZero平台在调用Native服务的接口时,无法处理重定向的响应,必须给Ingress添加表1中的注解。 表1 注解1 注解中键 注解中值 nginx.ingress.kubernetes.io/ssl-redirect false Nginx控制器默认后端service使用http协议,如果后端service使用的是https协议,请添加表2中的注解。 表2 注解2 注解中键 注解中值 nginx.ingress.kubernetes.io/backend-protocol HTTPS nginx.ingress.kubernetes.io/secure-backends true 建议1:保持Chart简洁,建议一个Chart中工作负载不超过3个。 保持Chart简洁,可以降低部署、升级失败的概率,在升级时能更有效地控制升级的范围。 建议2 :同一个Chart中,为所有图元的名称定义相同的前缀。 例如,某Chart中所有图元以“template-”为前缀,无状态负载的名称可以命名为“template-deployment”,ConfigMap的名称可以命名为“template-dbconfig”等。使用相同的前缀,可以使用户更方便识别Kubernetes资源的归属,同时降低命名冲突的可能性。 建议3:当全局变量的值是多行文本时,文本中出现的空行应不含任何空格字符。 全局变量将用于生成Chart包中的“values.yaml”文件,在yaml文件中,通过缩进表达层次关系,而空行中的空格字符会影响yaml文档的缩进排版。例如,当全局变量名为“dbConfig”,变量值为: jdbc.url: jdbc:mysql://127.0.0.1:3306/testdbjdbc.username: adminjdbc.password: {XXXXXXXX}jdbc.driver-class-name: org.mariadb.jdbc.Driver 生成的values.yaml内容为: dbConfig: |- jdbc.url: jdbc:mysql://127.0.0.1:3306/testdb jdbc.username: admin jdbc.password: {XXXXXXXX} jdbc.driver-class-name: org.mariadb.jdbc.Driver 当全局变量名为“dbConfig”,变量值为(第4行中包含一个空格字符)。 jdbc.url: jdbc:mysql://127.0.0.1:3306/testdbjdbc.username: adminjdbc.password: {XXXXXXXX} jdbc.driver-class-name: org.mariadb.jdbc.Driver 生成的values.yaml内容为: dbConfig: "jdbc.url: jdbc:mysql://127.0.0.1:3306/testdb\njdbc.username: admin\njdbc.password:\ \ changeit\n \njdbc.driver-class-name: org.mariadb.jdbc.Driver" 通过流水线部署Chart时,第一种格式的“values.yaml”文件,更容易通过脚本进行修改。
  • 配置API时的规则约束 规则:在“API设计”页签,单击“开始设计API”,创建API时,API的命名空间应选择“局部命名空间”。 在创建API时,“命名空间”支持选择“局部命名空间”和“全局命名空间”。使用“局部命名空间”,可保证API的名称不会和其他Native服务的API名称出现冲突。而“全局命名空间”,是为了版本向前兼容而保留的。在AstroZero 1.2.10及之前的版本中,API无命名空间的概念,相当于API定义在全局名称空间中,因此,不同Native服务的API命名出现冲突的可能性比较大。
  • 镜像开发中的规则约束 用户可自行开发镜像,并上传到CCE华为云容器中或使用第三方镜像仓库的镜像。在进行镜像开发时,需要遵循如下的规则约束: 规则1:容器镜像必须使用,1.11.2或以上版本的Docker客户端进行制作。 如何制作Docker镜像,请参考如何编写高效的Dockerfile。 规则2:Native服务向AstroZero平台开放的接口,必须是“application/json”格式的restful接口。 开放给AstroZero应用调用的Native服务接口,请求消息和响应消息的“Content-Type”都必须是“application/json”。 规则3:Native服务开放的接口应使用HTTP消息头进行认证,不要依赖于Cookie。 AstroZero会丢弃Native服务返回的Cookie信息,因此,Native不能使用Cookie来维持状态。 Native服务示例代码如下: LOG .info("Authentication begin.");String auth = request.getHeader("Authorization");// next: verify auth 建议:服务的日志建议输出到一个独立的目录,且日志文件命名以“.log”、“.trace”或“.out”后缀结尾,方便后续使用华为云的 应用运维管理 (简称 AOM ),采集日志文件,并将日志展示在AOM的界面上。
  • 如何编译发布应用 在AstroZero低代码平台中,编译发布应用主要包括如下三步。 属性设置。 在应用中,单击左下角的,选择“设置”。 图2 编译前属性设置入口 请根据实际用途,设置需要编译的应用包类型(资产包、源码包)以及相关组件的属性(例如,是否组件代码受保护、是否只读可写等)。 图3 软件包设置 编译。 设置完成后,单击左下角的图标,选择“编译”,启动应用编译。如果编译错误,则需要对错误组件进行修复,完成后才可进行下一步。 图4 编译成功页面 打包发布。 编译(资产包)完成后,单击,会出现如图5所示页面。请根据实际需要,选择发布方式。例如,发布到AstroZero下的“我的仓库”,也可以发布到其他平台。其中,发布到“我的仓库”主要用于后续的沙箱环境测试和生产环境运行。发布到其他平台主要用于应用分享和商业用途。编译发布应用更多介绍,请参见应用打包发布。 编译类型为“源码包”时,只有发布到“我的仓库”一种发布方式。 图5 发布应用
  • 如何设置应用 除了定义应用包含的页面、对象、后台处理逻辑,还支持定义应用的页面布局、导航等。 系统参数、选项列表、错误码这类配置的删除操作都属于全局范围的操作,如果是多个应用同时使用的配置项,建议不要在某一应用内随意删除。 设置布局与颜色 设置视图 自定义导航条 设置页面 设置宏 自定义选项列表 设置系统参数 设置定时任务 自定义错误码 设置字段多语言资源 配置数据导入模板 配置翻译任务 配置业务权限凭证 配置主题 管理运营配置 配置应用 父主题: 应用
  • 场景描述 本章节以开发网站中常用的标签切换页面为例,向您介绍如何基于组件模板在线开发组件。标签切换效果如图1所示,页面中主要包含标签栏和详情展示模块两部分,可以通过切换标签来控制详情展示模块中的展示内容。 图1 标签切换效果 本章节主要在高级页面中,通过两个组件(标签页组件、信息展示组件)复现上述场景。其中,标签页组件包含产品类别(手机、笔记本、平板等),信息展示组件用于展示不同产品类别的图片信息。两个组件通过事件-动作机制实现交互,在标签页组件中注册标签切换事件,此事件绑定信息展示组件中切换产品图片的动作。 本章节使用的示例组件开发过程中,使用了前端开发框架Vue及组件库Element。事件-动作机制的详情介绍,请参见如何实现组件交互。
  • 属性 在属性中,设置雷达图组件的位置、边框、背景等。 图2 属性 基础 组件标题:设置组件的标题。 组件名称:设置组件的名称。 位置 距离左端:组件到页面左侧的距离,单位为px。 距离顶端:组件到页面顶部的距离,单位为px。 宽度:组件的宽度,单位为px。 高度:组件的高度,单位为px。 堆叠顺序:设置组件层叠显示顺序。组件的堆叠顺序默认都是“1”,数字越大,显示越靠前。当需要让组件置底时,可设置堆叠顺序为“0”。 自适应高度:组件的高度是否随宽度改变。 边框:设置组件的边框样式,如全边框或角边框。 背景 样式:设置背景的样式,如普通、居中、拉伸等。 图片链接:背景图片URL。 颜色:设置背景的颜色。
  • 如何设置数据系列 选中基本饼图组件,单击鼠标右键选择“高级设置”。 展开数据系列配置,单击旁边的“+”,添加数据系列。 在右侧“数据”页签,配置该数据系列的数据。 例如,在使用系统预置的静态数据基础上,添加如下加粗代码,配置新增数据系列的数据。也可以使用“动态数据”调用后台接口URL返回如下结构模型数据。 图6 两个数据系列不用圆心坐标设置 {"resCode": "0","resMsg": "成功","result": [{"dataValue": [{"name": "关键事件","value": [{"value": 635,"name": "工程管理"},{"value": 310,"name": "社会环境"}]},{"name": "类别","value": [{"value": 435,"name": "计算机"},{"value": 210,"name": "文学"}]}]}]} 配置添加的数据系列圆心坐标,如果不配置,两个数据系列会重叠。 设置完成后,单击“确定”。
共100000条