通过华为云Astro轻应用连接器对接第三方数据库
应用场景
连接器是华为云Astro轻应用提供的,调用第三方服务的集成工具。通过使用华为云Astro轻应用连接器,开发者无需关注具体的代码实现,只需要配置集成服务的地址和鉴权信息,即可快速将第三方服务集成到应用中,大大提高了开发效率,降低了开发成本。
本实践将为您介绍如何通过自定义连接器将第三方数据库集成到华为云Astro轻应用中。
方案优势
用户可以自主定义数据库的操作和鉴权接口, 独立控制第三方数据库的网络。
前提条件
- db-adapter是用于操作第三方数据库的后端java demo代码。resources目录下的datasource.json文件用于配置第三方数据库的地址链接以及用户名、密码,用户可以基于自己的第三方数据库进行配置。DBExecuteController.java用于连接上数据库后,处理外部请求,返回数据库数据。
图2 datasource.json图3 DBExecuteController.java
- 基于db-adapter生成jar包,把编出的jar包放在“build”目录下,构建docker镜像。已将制作好的镜像包上传到容器镜像服务SWR,如何上传镜像包请参见页面上传镜像。
使用docker save制作镜像压缩包时,请使用“{image}:{tag}”命令,不要使用“image id”,否则无法在容器镜像服务SWR页面上传。镜像上传失败时,可参考为什么通过页面上传镜像失败?中操作处理。
图4 使用maven install,将db-adapter打成jar包图5 构建镜像
步骤一:使用镜像包创建无状态工作负载
- 登录CCE控制台,参考购买Standard/Turbo集群中操作,购买所需的集群。
- 集群购买成功后,参考创建节点中操作,为集群添加节点。
- 创建一个无状态工作负载。
- 节点添加后,在左侧导航栏中选择 。
- 单击“创建工作负载”,创建一个无状态工作负载。
图6 创建无状态工作负载图7 选择镜像
表1仅介绍本实践中使用到的参数,其他参数的解释请参见创建无状态负载(Deployment)。
表1 无状态工作负载参数说明 参数
说明
示例
负载类型
选择创建工作负载的类型。
无状态负载
负载名称
新建工作负载的名称。命名要求如下:
- 长度不能超过63字符。
- 可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。
astro-deployment
实例数量
填写实例的数量,即工作负载Pod的数量。
1
容器名称
输入容器的名称。
astro-container
镜像名称
单击后方的“选择镜像”,选择容器使用的镜像,即前提条件中上传的镜像。
db_adapter
- 为工作负载添加服务。
- 在“无状态负载”页签,单击已创建工作负载的名称,进入负载详情页。
图8 单击负载名称
- 在“访问方式”页签中,单击“创建服务”,创建一个服务配置访问接口。
图9 创建服务
表2 服务参数说明 参数
说明
示例
Service名称
输入新建服务的名称,也可以保持默认。
astro-deployment-service
访问类型
选择服务的访问类型。
节点访问
端口配置 > 协议
请根据业务的协议类型选择。
TCP
端口配置 > 容器端口
业务容器进程监听的端口,端口范围为1-65535。
8086
端口配置 > 服务端口
通过Service访问的端口,端口范围为1-65535。
8086
端口配置 > 节点端口
即NodePort,可以选择“自动生成”,也可以指定端口,默认范围为30000-32767。
30280
- 在“无状态负载”页签,单击已创建工作负载的名称,进入负载详情页。
- 测试接口的连通性。
将2中添加节点的IP地址和4.b中配置的节点端口拼接成完整的访问地址,访问地址由CCE节点IP端口部分、db-adapter中的context-path以及rest接口拼接而成,如http://10.10.10.1:30280/astro/native/demo/dbadapter/mysql/datasource1/read。
图10 context-path图11 context-path及rest接口在Body页签中输入具体的SQL语句,单击“Send”,查看接口状态。状态为“200 OK”,表明接口调测通过。
图12 测试接口的连通性
步骤二:创建连接器对接第三方数据库
- 创建一个低代码应用。
- 参考授权用户使用华为云Astro轻应用并购买实例中操作,申请华为云Astro轻应用免费试用或购买商业实例。
- 实例购买后,在华为云Astro轻应用服务控制台的“主页”中,单击“进入首页”,进入应用开发页面。
- 在“应用”中,单击“新建低代码应用”或单击
,进入新建低代码应用页面。
- 在新建低代码应用页面,应用类型选择“标准应用”,单击“确定”。
- 输入应用的标签和名称,单击“新建”,即可进入应用设计器。
图13 创建一个空白应用
- 在应用设计器中,选择“集成”,单击“连接器”下的“连接器实例”。
- 在类型中,选择“自定义连接器”,进入自定义连接器页面。
- 单击“+”,配置连接器信息,单击“保存”。
图14 创建自定义连接器
- 为自定义连接器新建认证信息。
- 在“认证信息”页签,单击“新建”,进入添加认证信息页面。
- 设置认证信息,单击“保存”。
图15 添加认证信息
表5仅介绍本实践中使用到的参数,其他参数解释请参见使用自定义连接器调用第三方接口。
- 为自定义连接器添加动作。
- 在“动作”页签中,单击“新建”。
- 设置动作的基本信息,单击“下一步”。
图16 设置基本信息
表6 动作基本信息参数说明 参数
说明
示例
标签
新建动作的标签名,用于在页面显示。
取值范围:1~64个字符。
demoSql
名称
新建动作的名称,名称是动作在系统中的唯一标识。命名要求如下:
demoSql
URL
第三方提供的协议服务的URL地址,即5中调试成功的地址。
http://10.10.10.1:30280/astro/native/demo/dbadapter/mysql/datasource1/read
方法
选择请求的方法。
POST
内容类型
输入内容的类型,该值取决于第三方支持哪种类型,是在HTTP标准协议中定义的。
application/json
返回类型
选择返回类型。
取值为“application/json”时,表示会忽略第三方实际返回的“content-type”,使用第三方配置的“content-type”来解析第三方返回的内容。
如果该参数取值为空,表示使用HTTP返回中的“content-type”,来解析第三方返回的内容。
application/json
- 本示例无需设置消息头入参,请单击
删除第一行参数,再单击“下一步”。
- 设置输入参数,单击“下一步”。
图17 输入参数配置页面
表7仅介绍本实践中使用到的参数,其他参数解释请参见使用自定义连接器调用第三方接口。
- 本示例无需设置输出参数,请单击
删除第一行参数,再单击“保存”。
- 返回动作页签,单击该动作所在行的
,启用该动作。
步骤三:从第三方数据库获取数据
- 在自定义连接器的“动作”页签中,单击6中添加的动作,进入动作列表页。
图18 单击动作名称
- 在页面右上方,单击“测试”,进入测试页面。
- “认证信息”选择5中创建的noauth,设置输入参数,单击“测试”。
图19 测试
例如,从第三方数据库的“indexes”表中,获取1条数据。其中,“sql”为8中添加的输入参数,“indexes”为第三方数据库中某个表的名称。单击“测试”,返回如下数据:
{ "result": { "content": [ { "created_by": "10gd000000bHFh7DZ9iS", "created_date": "2021-04-09T00:59:20.000+00:00", "description": null, "field_id1": "cust000000hDkpq2Puy0", "field_id2": null, "index_id": "cust000000inMlDAbr6X", "index_name": "HWAC__applicationId__CST", "index_type": 3, "label": null, "last_modified_by": null, "last_modified_date": "2021-04-09T00:59:20.000+00:00", "obj_id": "cust000000hBjuCHLJom", "status": 0, "tenant_id": "0000000000bHFh7DZ9iT" } ] }, "dataForm": "2006-01-02", "dataTimeFormat": "2006-01-02 15:04:05", "reqMsg": "", "respMsg": "{\"url\":\"http://10.10.10.1:30280/astro/native/demo/dbadapter/mysql/datasource1/read\",\"method\":\"POST\",\"parameters\":{\"content\":\"******\"},\"tenantID\":\"000000000142c5UhjFvk\",\"statusCode\":200}", "timeElapsed": 207722711, "statusCode": 200, "headers": { "Connection": "keep-alive", "Content-Type": "application/json", "Date": "Fri, 13 Dec 2024 08:55:24 GMT", "Server": "nginx" } }
步骤四:通过脚本调用连接器获取数据
- 在应用设计器中,选择“逻辑”,单击脚本后的“+”。
- 新建一个空白的脚本,名称设置为“dbscript”,单击“添加”。
图20 创建脚本dbscript
- 在脚本编辑器中,输入示例代码。
示例代码中,“命名空间__demoDB”为4中定义的连接器名称,“命名空间__noauth”为3中添加的认证信息,“命名空间__demoSql”为6中添加的动作。
import * as connector from 'connector'; import * as context from 'context';//导入上下文相关的标准库 //定义入参结构 @action.object({ type: "param" }) export class ActionInput { @action.param({ type: 'String', required: false, label: 'String' }) sql: string; } //定义出参结构 @action.object({ type: "param" }) export class ActionOutput { @action.param({ type: 'any' }) res: any; } @action.object({ type: "method" }) export class CreateWorkOrder { //定义接口类,接口的入参为ActionInput,出参为ActionOutput @action.method({ input: 'ActionInput', output: 'ActionOutput' }) public createWorkOrder(input: ActionInput): ActionOutput { let out = new ActionOutput(); //新建出参ActionOutput类型的实例,作为返回值 let error = new Error(); //新建错误类型的实例,用于在发生错误时保存错误信息 try { // 页面上自己创建的自定义连接器的调用方法,第一个参数是创建的自定义连接器名称,第二个参数是认证信息名称 let client = connector.newClient("命名空间__demoDB", "命名空间__noauth"); //入参 let input = { "sql": "select * from flowinstance limit 1" }; // 第一个入参是动作名称, 第二个参数是入参 let resp = client.invoke("命名空间__demoSql", input); // 打印输出结果 console.log(resp); out.res = resp; } catch (error) { console.error(error.name, error.message); context.setError(error.name, error.message); } return out; } }
- 单击页面上方的
,保存脚本。
- 单击编辑器上方的
,执行脚本。
- 在页面底部单击测试窗口右上角的
,在“输出参数”中可以查看到返回的数据库数据。
图21 查看返回数据