
# 在服务编排或脚本中调用原生服务
#### 使用说明
Native Service部署成功且在AstroZero中接入服务实例后，系统会把在Native Service中配置的API接口生成相应的restaction。在服务编排中，可进行调用该restaction。
#### 前提条件
- 已接入服务实例，具体操作请参考[注册Native Service](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0269.html)。
- 已在需要调用原生服务的应用中，添加待调用的原生服务。添加后，在该应用的服务编排中，才可以调用Native服务。
  ![](https://support.huaweicloud.com/usermanual-astrozero/public_sys-resources/note_3.0-zh-cn.png)
  - "Internal dependencies"为内部依赖文件夹，导入的BO服务或者Native服务，在打包上层应用时也会随应用打包发布出去。
  
  - "External dependencies"为外部依赖文件夹，导入的BO服务或者Native服务，在打包上层应用时不会打包出去。
   
  图1应用中添加原生服务   
  ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887140.png) 
- 若AstroZero开启了根证书校验，请先上传原生服务的根证书，再调用原生服务。关于根证书的更多内容，请参考[开启根证书校验](https://support.huaweicloud.com/usermanual-astrozero/astrozero_06_0019.html#section1)。
 
#### 在服务编排中调用原生服务
1. 参考[如何登录经典应用设计器](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_5025.html)中操作，进入待调用原生服务的应用设计页面。
2. 鼠标放应用的某个文件夹（如Logic）上，单击"+"，选择"服务编排"。
3. 设置服务编排的标签和名称，单击"添加"。 
   图2添加一个空白的服务编排   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888592.png "点击放大")
   
   
4. 在服务编排设计页面左侧的"Native服务 \> Others"中，拖拽对应的原生服务图标至画布中。 
   图3拖拽对应的原生服务图标至画布中   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960287105.png "点击放大")
   
   
5. 单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960127289.png)，设置基本信息。
   
   图4设置基本信息   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888596.png "点击放大")
   
   
6. 单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888584.png)，设置调用的服务参数。
   
   图5配置服务   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960127321.png "点击放大")
   - 操作方法：原生服务中，已自定义好的API接口。原生服务发布后，如果需要修改API，需要在API配置界面单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888620.png)，取消发布后进行修改，修改后再保存并发布。已发布的API可能在服务编排中已使用，如果修改API会导致不兼容，请同步修改引用该API的服务编排。
   
   - 入参/目标：当选择具体操作方法（API）后，API的输入参数将会显示在入参的目标列。
   
   - 入参/源：服务编排中的变量，需要和目标的参数类型保持一致。该源会将服务编排中的变量，赋值给调用API的输入参数。
   
   - 出参/源：当选择具体操作方法（API）后，API的输入参数将会显示在出参的源列。
   
   - 出参/目标：服务编排中的变量，需要和输出参数的类型保持一致。API中的输出参数赋值给服务编排中的变量，供服务编排使用。
   
   
   
   
7. 连接开始和原生服务图元。 
   图6连接图元   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888580.png)
   
   
8. 在页面上方，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960127329.png)，保存服务编排。
9. 保存成功后，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960287133.png)，运行服务编排。
   
   显示下图信息，表示成功调用微服务。
   图7返回成功   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888604.png)
   
   
 
#### 在脚本中调用原生服务
1. 参考[开发一个简单脚本实例](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_5031.html)中操作，创建一个空白脚本。
   
   图8新建一个空白脚本   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888576.png "点击放大")
   
   
2. 在脚本编辑器中，输入如下示例代码。 
   ```
   import * as native from 'native';
   //namespace is needed for the service name
   let instance = native.getServiceInstance('test__NativeService1');
   //construct input params according to the method you invoke
   let params = {
       "access-token": context.getToken(),
       "title": "Hello",
       "price": 10.5,
       "author": "Lily",
       "description": "test"
   };
   let res = instance.invoke('health', params);
   console.log(res);
   ```
   脚本中加粗代码含义如下：
   - "**native**"是系统预置的调用原生服务的标准库。
   
   - "***test__** **NativeService1*** "为变量，表示Native Service的名称，该名称要加命名空间前缀，与[3](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0264.html#astrozero_05_0264__li18568511412)中配置的"名称"取值保持一致。
   
   - "***health*** "表示要调用的原生服务的方法名，与[5](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0266.html#astrozero_05_0266__zh-cn_topic_0112493169_li29194280135)中配置的"操作名称"取值保持一致。
   
   - "**params** "为原生服务的入参，请和[配置API](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0266.html)中方法"Header 参数"和"Body 参数"中的参数（参数名称和数据类型等）保持一致。如果没有入参，可像"let params = {};"示例代码一样传入空结构体。
   
   
   
   
3. 在脚本编辑器上方，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960287109.png)，保存脚本。
4. 保存成功后，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888600.png)，执行脚本。
5. 不用输入请求报文，直接单击测试窗口右上角的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888612.png)。
6. 在日志页签，可查看到如下信息，表明原生服务接口调用成功。 
   ```
   0909 11:18:26.546|debug|vm[75]>>> Astro Zero 1.2.13.1 f96c695 2020-09-08 10:32:45 +0800 release
   0909 11:18:26.546|debug|vm[75]>>> node: 4
   0909 11:18:26.546|debug|vm[75]>>> script: test__NativeServicejs 1.0.1 
   0909 11:18:26.546|debug|vm[75]>>> locale: zh_CN
   0909 11:18:26.546|debug|vm[75]>>> timezone: (GMT+08:00) China Standard Time (Asia/Shanghai)
   0909 11:18:26.547|debug|vm[75]>>> Hello World (test__NativeServicejs.ts:12)
   ```
   
   
 
