# API 全生命周期管理

    # API 设计

    在 Erda API 设计中心,您可以几乎零成本地学习 API 文档设计。

    平台提供可视化的编辑方式,以直观而友好的交互界面帮助您轻松编写出一份具有专业水准的 API 文档,且无需了解 REST API 规范标准或 API 描述语言。

    设计中心兼容标准的 OAS 协议,在其他平台托管的 API 文档、代码中生成的 Swagger 文件等,均可轻松迁移至 Erda。API 设计中心输出的文档符合 OAS 3.0 协议标准,随时可交付、迁出文档,一次设计,多次使用。

    Erda API 设计中心将 API 文档托管于代码仓库中,这一设计将接口描述与接口实现紧密地绑定在一起。

    // API 文档保存到 .erda/apidocs 目录下
    // 非侵入式目录, 不影响仓库目录主要结构
    // 如果应用下有多个微服务, 文档按服务名命名
    
    root_from_repo
        ├── .erda
        │   ├── apidocs
        │   │   ├── {micro_service_a}.yaml
        │   │   ├── {micro_service_b}.yaml
        │   │   └── {micro_service_c}.yaml
        │   │
        │   ├── migrations
        │   └── pipelines
        │
        ├── other_files
        └── other_dirs
    

    进入 我的应用 > 选择应用 > API 设计,通过目录树控件可展开应用下所有分支,打开任意文档开始编辑。若仓库当前暂无文档,可在有权限的分支下新建文档。

    同一时间下,平台仅允许一名用户对同一篇文档进行编辑。若他人正在编辑某一篇文档,打开该文档将提示文档已被锁定。

    文档在编辑过程中将自动保存。若出现意外中断编辑,平台将自动提交此前保存的文档至 Git 仓库中。用户也可手动保存文档,保存成功后将自动退出编辑状态。如需再次编辑,可点击 编辑 进入编辑状态。

    完成文档设计后,可将文档发布至 API 集市。

    # API 文档结构

    当前最流行的 API 文档标准为 OAS,主要有 Swagger 2.0 和 OpenAPI 3.0 两个版本,即 OAS2 和 OAS3 (opens new window)。API 设计中心输出的文档采用 OpenAPI 3.0 协议,API 集市则同时支持 Swagger 2.0 和 OpenAPI 3.0。

    在 API 设计中心,一篇文档主要由三部分组成:概况、接口列表和数据类型列表。

    • 概况包含当前文档名称、版本名称、基本介绍等内容。

    • 接口列表由一系列 PathItem 组成,每个 URL 确定一个 PathItem。单个 PathItem 下可添加 7 种 HTTP 方法:GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH。

      URL + HTTP Method 确定一个接口,又称为 Operation。一个接口一般由 Summary、Parameters、Headers、Body 和 Response 组成。

      • Summary 包含接口名称、描述等基本信息。
      • Parameters 表示 Query Parameters,即跟在 URL 后以“&”连接的“key=value”的键值对列表。
      • Headers 表示请求的 Header,同样为键值对列表。
      • Body 代表请求体,GET 和 HEAD Operation 无请求体。
      • Response 包含响应体信息。
    • 数据类型列表由一系列自定义数据类型组成,可在此定义数据类型,并在接口设计时进行引用。预定义的类型有 String、Number、Boolean、Array、Object 五类,所有的自定义类型均由这五种预定义类型复合而成。

    以上即一篇 API 文档的组织结构。

    # API 设计操作

    # 进入编辑状态

    点击 新建文档,选择对应分支并为文档命名。建议文档名称与文档所描述的服务名称保持一致。新建文档后将自动跳转至该文档的编辑页面,点击 编辑 进入编辑状态。您也可以从目录树控件中选择需编辑的分支文档。

    # 编辑 API 概况

    在左侧目录栏中选择 API 概况,填写 API 名称(建议与文件名保持一致)、版本名称以及文档描述信息。

    # 定义数据模型

    建议在定义接口前优先定义数据模型。

    在左侧目录栏中选择 数据类型,根据提示添加数据类型,并填写参数名称、类型、描述等基本信息。

    编辑数据结构时,可导入 .erda/migrations 目录中定义的库表字段,示例如下:

    root_from_repo
        ├── .erda
        │   ├── apidocs
        │   ├── migrations
        │   │   ├── micro_service_a
        │   │   │   ├── 2021-01-01-some-feature-1.sql
        │   │   │   └── 2021-01-02-some-feature-2.sql
        │   │   └── micro_service_b
        │   │       └── 2021-01-02-other-feature.sql
        │   │
        │   └── pipelines
        │
        ├── other_files
        └── other_dirs
    

    在以上目录结构中,module_a/2021-01-01-some-feature-1.sqlmodule_a/2021-01-02-some-feature-2.sql 定义了如下库表结构:

    • micro_service_a/2021-01-01-some-feature-1.sql
    CREATE TABLE t1 (
        id BIGINT PRIMARY KEY,
        created_at DATETIME,
        updated_at DATETIME,
        name VARCHAR(64) NOT NULL 
    );
    
    • micro_service_a/2021-01-02-some-feature-2.sql
    ALTER TABLE t1
    ADD COLUMN age INT NOT NULL ;
    

    编辑数据结构时,点击 导入参数 即可直接引用库表字段。

    提示

    设计 API 文档时引用库表字段,仅可引用与文档同名模块下的库表字段。

    # 定义接口

    在左侧目录栏中选择 API 列表,根据提示新建 URL 并填写 Path。URL 对应的结构被称为 PathItem。在 PathItem 中选择一个 HTTP 方法进行编辑。

    # 编写接口 Summary

    接口也被称为 Operation,URL + HTTP Method 即可确定一个接口。选择接口的 Summary Tab,填写接口名称、分组、描述等信息。接口名称为选填项,若选择填写,需保证该名称在文档中的唯一性。

    # 编写 Params、Headers

    Params 和 Headers 都是键值对,可以在 Params tab 和 Headers tab 下添加其参数。

    # 编写 Request Body

    GET 和 HEAD Method 均无 Request Body。对于有 Request Body 的方法,可在 Body Tab 下编辑。Body 通常为 Object 类型,其编写方式与定义数据类型相似。

    # 编写 Response Body

    可在 Response Tab 下进行编辑。其编辑方式与编写 Request Body 相似。

    # 引用数据类型

    定义接口的参数(Params、Headers、Body、Response 以及任意子字段)时,可自定义参数类型。若被引用类型的父类型为 Object,则可以在其基础上继续添加参数。

    # 导入参数

    若数据库模型同样托管于仓库中,可导入与 API 文档同名的服务下的库表模型字段。添加参数时,选择导入参数,再选择需导入的模型及其字段即可。

    # 发布至集市

    发布文档至集市前请先保存文档。

    填写 API 名称、ID 和语义化版本号,将文档发布至集市,随后即可在集市中查看和管理已发布的文档。

    # API 集市

    API 是服务对外提供能力的入口,API 集市可聚合服务的能力,在平台上统一展现,从而提升跨团队、跨组织之间共享通用的能力,改善产品研发效率,促进业务创新。

    # 发布文档

    # 方法一:上传本地文件发布文档

    进入 DevOps 平台 > API 管理 > API 集市,可查看 我负责的所有 的 API 集市资源。点击 新建资源 即可上传本地 Swagger 2.0 或 OpenAPI 3.0 文档。

    如需为已存在的 API 集市资源追加新版本的文档,可点击 添加版本 进行操作,或点击 管理 进入该 API 资源的管理页面,在 版本管理 中添加版本。

    # 方法二:通过流水线发布文档

    通过 publish-api-asset action 将 API 文档发布至 API 集市。

    参数名称 参数含义 是否必填
    display_name API 文档的展现名称,未填写时使用 asset_id
    asset_id API 文档的标识 ID
    version API 资源版本,需遵循 X.Y.Z 的格式,未填写时自动生成
    spec_path API 描述文档的路径,eg:${git-checkout}/swagger.json
    runtime_id runtime_id 值,eg:${dice:OUTPUT:runtimeID}
    service_name 服务名称,需与 dice.yml 中的名称保持一致

    示例如下:

    version: "1.1"
    stages:
      - stage:
          - git-checkout:
              alias: java-demo
              description: 代码仓库克隆
      - stage:
          - java:
              alias: build-java-demo
              description: 针对 java 工程的编译打包任务,产出可运行镜像
              version: "1.0"
              params:
                build_type: maven
                container_type: spring-boot
                jdk_version: "11"
                target: ./target/docker-java-app-example.jar
                workdir: ${java-demo}
      - stage:
          - release:
              alias: release-java-demo
              description: 用于打包完成时,向dicehub 提交完整可部署的dice.yml。
              params:
                dice_yml: ${java-demo}/dice.yml
                image:
                  java-demo: ${build-java-demo:OUTPUT:image}
      - stage:
          - dice:
              alias: dice
              description: 用于部署应用服务
              params:
                release_id: ${release-java-demo:OUTPUT:releaseID}
      - stage:
        - publish-api-asset:
            params:
              display_name: 测试                     # API 资源名称
              asset_id: test                        # API 资源 ID
              spec_path: ${java-demo}/swagger.json  # API 文档所在的路径
              runtime_id: ${dice:OUTPUT:runtimeID}  # 用于将 API 资源与实例关联起来
              service_name: test-service            # 服务名称, 与 dice.yml 中一致
    

    # 方法三:在 API 设计中发布文档

    请参见 发布至集市

    # 查看文档

    进入 DevOps 平台 > API 管理 > API 集市,点击列表中的任一条目进入该 API 文档的预览页面,在此可查看文档具体信息,包括每一个接口的描述细节,同时支持版本切换、接口搜索、文档下载等操作。

    # 管理文档

    进入 DevOps 平台 > API 管理 > API 集市,点击列表中任一条目的 管理 按钮即可进入该 API 资源的管理页面,在此可进行 API 资源信息编辑、将 API 资源设为公开或私有、删除 API 资源等操作。

    通过 关联关系,可将 API 资源关联至具体的项目和应用。通过流水线和 API 设计中心发布的文档将自动关联项目和应用,通过本地文件发布的文档则需手动关联。完成项目和应用关联后,将自动获取对应的权限配置:

    • 企业管理员、关联项目的管理员和关联应用的管理员拥有该 API 资源的管理权限。
    • 关联项目的成员拥有查看权限。
    • 所有项目成员均有公开 API 资源的查看权限。

    版本管理 中,可为 API 资源增删版本、标记版本为"弃用"、导出某版本的文档等,也可将不同版本的文档关联至服务实例。这类关联属于 Minor 级别,即一个 Minor 版本关联至一个实例,表明该 Minor 版本下的文档是对该服务实例接口的描述。下文中的访问管理将依赖此关联关系。

    # 访问管理

    # 创建访问管理条目

    进入 DevOps 平台 > API 管理 > 访问管理,即可查看访问管理列表。

    如需对目标 API 资源及其关联实例进行访问管理,请先创建一个访问管理条目,点击 创建 按钮进行操作。

    • API 名称:API 资源名称。
    • API 版本:API 版本名称,对应 Major 版本号。
    • 资源版本:语义化版本号,仅精确至 Minor 版本号。
    • 关联项目名称:该版本 API 文档关联的项目名称,不可修改。
    • 绑定域名:该 API 文档及其关联实例需绑定的域名。域名格式为“服务名称.平台泛域名后缀”,其中服务名称可自定义,平台泛域名由平台定义。若服务名称为"my-website",平台域名为 "terminus-org.app.terminus.io",则绑定域名为"my-website.app.terminus.io"。
    • API 网关:选择对应环境的 API 网关,若无 API 网关,将引导新建一个 API 网关。
    • 鉴权方式:外部访问域名时的鉴权方式,支持 Key 认证和参数签名认证。
    • 授权方式:访问服务需申请和授权,支持自动授权和手动授权。

    完成信息填写后,即可创建该 API 版本及其实例的访问管理条目,并自动进入访问管理后台页(即详情页)。在详情页,可根据需要重新编辑其基本信息、删除该条目、查看流量概览等。

    # 访问申请与审批

    API 使用者可在 API 集市页或 API 资源详情页对 API 资源提出申请调用。

    审批流程进入 API 访问管理后台,管理人员在客户端列表对调用申请进行审批。若授权方式为自动授权,申请人将自动获得授权,否则需管理人员手动授权。对已授权的客户端,可撤销授权或删除申请。若已提前配置 SLA,可更换 SLA 为该客户端设置特定的访问级别。

    # 配置 API 策略

    API 访问管理人员可从访问管理后台跳转至 API 策略页,为 API 开启安全策略和业务策略。

    # 配置 SLA

    SLA(service-level agreement),即服务级别协议。API 访问管理人员可添加若干 SLA 规则,用于限制客户端的访问级别。SLA 类别中需至少有一条默认的 "无限制 SLA"。

    # 访问 API

    若 API 管理人员对该 API 进行访问管理,则用户可在 API 集市页或预览页对该 API 提出申请调用,随后进入 API 管理 > 我的访问 > 客户端详情 查看申请情况。

    审批通过后,进入 API 资源预览页,通过客户端 ID 和密钥进行认证,随后即可在平台对接口进行调用测试。

    用户开发自己的应用程序时,可用该客户端 ID 和密钥访问服务。