第 2 章 管理服务


2.1. 配置 OpenAPI 服务

OpenAPI 规格 (OAS)为 HTTP API 定义了一个标准的编程语言无关接口。您可以在不访问源代码、额外文档或网络流量检查的情况下了解服务的功能。当使用 OpenAPI 定义服务时,您可以使用最小实施逻辑理解并与之交互。正如接口描述简化了低级别编程一样,OpenAPI 规格 消除了调用服务中的猜测工作。

2.1.1. OpenAPI 功能定义

OpenShift Serverless Logic 允许工作流使用函数中的 OpenAPI 规格引用与远程服务交互。

OpenAPI 功能定义示例

{
   "functions": [
      {
         "name": "myFunction1",
         "operation": "classpath:/myopenapi-file.yaml#myFunction1"
      }
   ]
}

operation 属性是由以下参数组成的 字符串

  • URI :引擎使用它来定位规范文件,如 classpath
  • 操作标识符 :您可以在 OpenAPI 规格文件中找到此标识符。

OpenShift Serverless Logic 支持以下 URI 方案:

  • classpath :将它用于位于应用程序项目的 src/main/resources 文件夹中的文件。classpath 是默认的 URI 方案。如果没有定义 URI 方案,则文件位置为 src/main/resources/myopenapifile.yaml
  • file:将它用于位于文件系统中的文件。
  • HTTP 或 https :将它们用于远程找到的文件。

确保 OpenAPI 规格文件在构建期间可用。OpenShift Serverless Logic 使用内部代码生成功能在运行时发送请求。构建应用程序镜像后,OpenShift Serverless Logic 将无法访问这些文件。

如果要添加到工作流的 OpenAPI 服务没有规格文件,您可以创建一个或多个服务来生成和公开该文件。

2.1.2. 根据 OpenAPI 规格发送 REST 请求

要发送基于 OpenAPI 规格文件的 REST 请求,您必须执行以下步骤:

  • 定义功能引用
  • 访问工作流状态中定义的功能

先决条件

  • 已在集群中安装了 OpenShift Serverless Logic Operator。
  • 您可以使用适当的角色和权限访问 OpenShift Serverless Logic 项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
  • 您可以访问 OpenAPI 规格文件。

流程

  1. 定义 OpenAPI 功能:

    1. 识别并访问您要调用的服务的 OpenAPI 规格文件。
    2. 将 OpenAPI 规格文件复制到工作流服务目录中,如 src/main/resources/specs

      以下示例显示了 multiplication REST 服务的 OpenAPI 规格:

      multiplication REST 服务 OpenAPI 规格示例

      openapi: 3.0.3
      info:
        title: Generated API
        version: "1.0"
      paths:
        /:
          post:
            operationId: doOperation
            parameters:
              - in: header
                name: notUsed
                schema:
                  type: string
                required: false
            requestBody:
              content:
                application/json:
                  schema:
                    $ref: '#/components/schemas/MultiplicationOperation'
            responses:
              "200":
                description: OK
                content:
                  application/json:
                    schema:
                      type: object
                      properties:
                        product:
                          format: float
                          type: number
      components:
        schemas:
          MultiplicationOperation:
            type: object
            properties:
              leftElement:
                format: float
                type: number
              rightElement:
                format: float
                type: number

    3. 要在工作流中定义功能,请使用 OpenAPI 规格中的 operationId 来引用功能定义中的所需操作。

      温度转换应用中的函数定义示例

      {
         "functions": [
           {
             "name": "multiplication",
             "operation": "specs/multiplication.yaml#doOperation"
           },
           {
             "name": "subtraction",
             "operation": "specs/subtraction.yaml#doOperation"
           }
         ]
      }

    4. 确保您的功能定义引用存储在 src/main/resources/specs 目录中的 OpenAPI 文件的正确路径。
  2. 访问工作流状态中定义的功能:

    1. 定义工作流操作来调用您添加的功能定义。确保每个操作引用之前定义的函数。
    2. 使用 functionRef 属性根据其名称引用特定功能。使用 OpenAPI 规格中定义的参数来映射 functionRef 中的参数。

      以下示例演示了在请求路径而不是请求正文中映射参数,您可以参考以下 PetStore API 示例:

      工作流中的映射功能参数示例

      {
         "states": [
          {
            "name": "SetConstants",
            "type": "inject",
            "data": {
              "subtractValue": 32.0,
              "multiplyValue": 0.5556
            },
            "transition": "Computation"
          },
          {
            "name": "Computation",
            "actionMode": "sequential",
            "type": "operation",
            "actions": [
              {
                "name": "subtract",
                "functionRef": {
                  "refName": "subtraction",
                  "arguments": {
                    "leftElement": ".fahrenheit",
                    "rightElement": ".subtractValue"
                  }
                }
              },
              {
                "name": "multiply",
                "functionRef": {
                  "refName": "multiplication",
                  "arguments": {
                     "leftElement": ".difference",
                     "rightElement": ".multiplyValue"
                  }
                }
              }
            ],
            "end": {
              "terminate": true
            }
          }
        ]
      }

    3. 检查 OpenAPI 规格的 Operation Object 部分,以了解如何在请求中结构参数。
    4. 使用 jq 表达式从有效负载中提取数据并将其映射到所需参数。确保引擎根据 OpenAPI 规格映射参数名称。
    5. 对于在请求路径而不是正文中需要参数的操作,请参阅 OpenAPI 规格中的参数定义。

      有关请求路径而不是请求正文中映射参数的更多信息,您可以参阅以下 PetStore API 示例:

      映射路径参数示例

      {
        "/pet/{petId}": {
          "get": {
            "tags": ["pet"],
            "summary": "Find pet by ID",
            "description": "Returns a single pet",
            "operationId": "getPetById",
            "parameters": [
              {
                "name": "petId",
                "in": "path",
                "description": "ID of pet to return",
                "required": true,
                "schema": {
                  "type": "integer",
                  "format": "int64"
                }
              }
            ]
          }
        }
      }

      以下是调用函数的示例,在请求路径中只添加了一个名为 petId 的参数:

      调用 PetStore 功能的示例

      {
        "name": "CallPetStore", 1
        "actionMode": "sequential",
        "type": "operation",
        "actions": [
          {
            "name": "getPet",
            "functionRef": {
              "refName": "getPetById", 2
              "arguments": { 3
                "petId": ".petId"
              }
            }
          }
        ]
      }

      1
      状态定义,如 CallPetStore
      2
      功能定义参考。在上例中,函数定义 getPetById 用于 PetStore OpenAPI 规格。
      3
      参数定义。OpenShift Serverless Logic 在发送请求前将参数 petId 添加到请求路径中。

2.1.3. 配置 OpenAPI 服务的端点 URL

在访问工作流状态中的函数定义后,您可以配置 OpenAPI 服务的端点 URL。

先决条件

  • 您可以使用适当的角色和权限访问 OpenShift Serverless Logic 项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
  • 您已创建了 OpenShift Serverless Logic 项目。
  • 您可以访问 OpenAPI 规格文件。
  • 您已在工作流中定义了函数定义。
  • 您可以访问工作流状态中定义的功能。

流程

  1. 找到您要配置的 OpenAPI 规格文件。例如,substraction.yaml
  2. 通过将特殊字符(如 . )替换为下划线并将字母转换为小写,将文件名转换为有效的配置键。例如,将 substraction.yaml 更改为 substraction_yaml
  3. 要定义配置密钥,请使用转换的文件名作为 REST 客户端配置密钥。将此键设置为环境变量,如下例所示:

    quarkus.rest-client.subtraction_yaml.url=http://myserver.com
  4. 要防止 application.properties 文件中的硬编码 URL,请使用环境变量替换,如下例所示:

    quarkus.rest-client.subtraction_yaml.url=${SUBTRACTION_URL:http://myserver.com}

    在本例中:

    • 配置密钥: quarkus.rest-client.subtraction_yaml.url
    • 环境变量:SUBTRACTION_URL
    • 回退 URL: http://myserver.com
  5. 确保在系统或部署环境中设置了 (SUBTRACTION_URL) 环境变量。如果没有找到变量,应用程序将使用回退 URL (http://myserver.com)
  6. 将配置键和 URL 替换添加到 application.properties 文件中:

    quarkus.rest-client.subtraction_yaml.url=${SUBTRACTION_URL:http://myserver.com}
  7. 部署或重启您的应用程序以应用新的配置设置。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.