
# 什么是原生服务
原生服务（Native Service）是指用户自主选择编程语言和开发工具开发的软件系统，该软件系统运行于AstroZero平台之外，并面向AstroZero中的应用提供API编程接口，开发者可以基于这些接口进行二次开发，从而构建复杂的行业应用。
AstroZero平台提供了创建原生服务工程的能力，原生服务工程本质上起到一种桥接的作用，用于将原生服务的API集成到AstroZero，使得运行于AstroZero之上的应用，更容易地使用原生服务的API。
理论上，原生服务可以运行于任何地方，只要保证AstroZero平台和原生服务之间的网络是连通的即可。但从最佳实践上，建议您采取容器化的部署方式，将原生服务托管在华为云上，保证AstroZero和原生服务的网络距离保持在合理的范围内。华为云提供了非常完整的容器引擎能力，支持您部署、管理和扩展容器化应用程序。
#### 相关概念
由于Native Service涉及的概念比较多，在做Native Service配置前，建议先提前了解如下相关概念。部分概念说明源于Kubernetes官网介绍，若需要了解更多Kubernetes相关内容，请参考[Kubernetes资料](https://kubernetes.io/zh/docs/concepts/)。
- 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）   
  ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888876.png) 
- 容器 一个通过Docker镜像创建的运行实例，一个节点可运行多个容器。容器的实质是进程，但与直接在宿主执行的进程不同，容器进程运行于属于自己的独立的命名空间。
  图2实例Pod、容器Container、节点Node的关系   
  ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888860.png "点击放大") 
- Docker Docker在容器的基础上，进行了进一步的封装，从文件系统、网络互联到进程隔离等，极大的简化了容器的创建和维护。使得Docker技术比虚拟机技术更为轻便、快捷。Docker是Kubernetes Pod中最常用的容器运行时，但Pod也能支持其他的容器运行时。若需要了解更多Docker相关内容，请参考Docker官网。
  
- Docker镜像 Docker镜像是一个特殊的文件系统，除了提供容器运行时所需的程序、库、资源、配置等文件外，还包含了一些为运行时准备的一些配置参数（如匿名卷、环境变量、用户等）。镜像不包含任何动态数据，其内容在构建之后也不会被改变。
  镜像（Image）和容器（Container）的关系，像是面向对象程序设计中的类和实例一样，镜像是静态的定义，容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  
- 云容器引擎（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。
  
 
#### 如何使用原生服务
租户线下开发了一些服务，服务运行在Docker容器中。租户希望可将线下开发的这些服务集成到AstroZero上，供AstroZero内部应用或者其他第三方系统调用。
![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932888872.png "点击放大")
Native Service在AstroZero内的使用场景包括但不限于：
- 在服务编排内部进行调用 租户线下开发的服务集成到AstroZero上，可以作为Native服务，被服务编排调用。
  ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933048252.png "点击放大")
  
- 外部系统通过Restful接口调用 通过下面的REST接口，调用原生服务，输入参数在body中填写。
  ```
  https://AstroZero域名/native/NativeService1/0.1.0/health
  ```
  其中，"AstroZero域名"为AstroZero对外提供的默认域名，"/native/NativeService1/0.1.0/health"为该服务开放接口的URL，可以在开放接口详情中获取。该调用方式，只适用于外部接口。
  图3查看接口URL   
  ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960127581.png "点击放大") 
- 在脚本中调用 租户线下开发的服务集成到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" && resp3.body.result) {
  console.log('auth success, currrent user is: ', resp3.body.result.name)
  }
  ```
  其中，"*AstroZero* *域名* "为AstroZero对外提供的开发态默认域名，"*/* *native/NativeService1/0.1.0/health*"为该服务开放接口的URL。该调用方式，只适用于外部接口。
  
- 在页面中调用 在高级页面的Widget代码中，调用原生服务的开放接口。标准页面则可在事件代码中直接调用原生服务的开放接口或通过定义服务模型，关联调用原生服务的服务编排，再在页面事件代码中，调用服务模型，从而来调用原生服务。
  在标准页面上传组件中，还可以调用原生服务的自定义接口实现上传功能。标准页面中上传组件功能介绍，请参见[上传](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0143.html)。
  
- 在工作流中调用 在服务编排中调用原生服务后，向工作流设计页面的泳道中，拖入"调用服务编排"图元。选择![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960287381.png)，在服务编排配置页面，选择需要调用的服务编排。
  ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960287373.png "点击放大")
  
- 在触发器中调用 在服务编排中调用原生服务后，在触发器中可调用该服务编排，当满足触发器规则时，系统会执行该服务编排。
  ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960287385.png "点击放大")
  
 
#### 使用原生服务具备哪些优势
- 面向第三方技术开发人员，原有资产不用重新开发，复用原有的业务和技术能力，可快速接入AstroZero，实现与现网系统快速集成，提升系统粘性。
- 提升微服务构建能力，优化应用系统架构，助力伙伴基于AstroZero构建重量级行业应用。
- 自有资产可基于AstroZero资产市场，实现共享、共建合作生态。
- 使用CCE/CCE敏捷版部署，接入AstroZero，投资小、成本低。传统的IT实现，客户如果要构建应用系统，必须从硬件和软件全部一次性购买。使用AstroZero，像住酒店一样，按需入驻，不需要关注酒店的建筑、运营和维修。初始投资少、成本低、减少投资风险。
 
