2장. 서비스 관리
2.1. OpenAPI 서비스 구성
OAS( OpenAPI Specification )는 HTTP API에 대한 표준 프로그래밍 언어와 무관한 인터페이스를 정의합니다. 소스 코드, 추가 문서 또는 네트워크 트래픽 검사에 액세스하지 않고도 서비스의 기능을 이해할 수 있습니다. OpenAPI를 사용하여 서비스를 정의할 때 최소한의 구현 논리를 사용하여 이해하고 상호 작용할 수 있습니다. 인터페이스 설명이 하위 수준 프로그래밍을 단순화하는 것과 마찬가지로 OpenAPI 사양 에서는 서비스 호출에 대한 추측을 제거합니다.
2.1.1. OpenAPI 함수 정의
OpenShift Serverless Logic을 사용하면 함수의 OpenAPI specfication 참조를 사용하여 워크플로우가 원격 서비스와 상호 작용할 수 있습니다.
OpenAPI 함수 정의의 예
{ "functions": [ { "name": "myFunction1", "operation": "classpath:/myopenapi-file.yaml#myFunction1" } ] }
operation
속성은 다음 매개변수로 구성된 문자열입니다
.
-
URI
: 엔진은 이를 사용하여classpath
와 같은 사양 파일을 찾습니다. - 운영 식별자: 이 ID는 OpenAPI 사양 파일에서 찾을 수 있습니다.
OpenShift Serverless Logic은 다음 URI 체계를 지원합니다.
-
classpath: 애플리케이션 프로젝트의
src/main/resources
폴더에 있는 파일에 이 값을 사용합니다.classpath
는 기본 URI 스키마입니다. URI 스키마를 정의하지 않으면 파일 위치는src/main/resources/myopenapifile.yaml
입니다. - 파일: 파일 시스템에 있는 파일에 이 값을 사용합니다.
- HTTP 또는 https: 원격 위치에 있는 파일에 이 값을 사용합니다.
빌드 시 OpenAPI 사양 파일을 사용할 수 있는지 확인합니다. OpenShift Serverless Logic은 내부 코드 생성 기능을 사용하여 런타임 시 요청을 보냅니다. 애플리케이션 이미지를 빌드하면 OpenShift Serverless Logic에 이러한 파일에 액세스할 수 없습니다.
워크플로우에 추가하려는 OpenAPI 서비스에 사양 파일이 없는 경우 파일을 생성하고 노출하도록 서비스를 하나 생성하거나 업데이트할 수 있습니다.
2.1.2. OpenAPI 사양을 기반으로 REST 요청 전송
OpenAPI 사양 파일을 기반으로 하는 REST 요청을 보내려면 다음 절차를 수행해야 합니다.
- 함수 참조 정의
- 워크플로우 상태의 정의된 함수에 액세스
사전 요구 사항
- OpenShift Serverless Logic Operator가 클러스터에 설치되어 있어야 합니다.
- OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성할 수 있는 적절한 역할 및 권한으로 OpenShift Serverless Logic 프로젝트에 액세스할 수 있습니다.
- OpenAPI 사양 파일에 액세스할 수 있습니다.
프로세스
OpenAPI 기능을 정의하려면 다음을 수행합니다.
- 호출하려는 서비스의 OpenAPI 사양 파일을 식별하고 액세스합니다.
OpenAPI 사양 파일을
src/main/resources/specs
와 같은 워크플로우 서비스 디렉터리에 복사합니다.다음 예제에서는 곱셈 REST 서비스에 대한 OpenAPI 사양을 보여줍니다.
곱셈 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
워크플로우에서 함수를 정의하려면 OpenAPI 사양의
operationId
를 사용하여 함수 정의에서 원하는 작업을 참조합니다.온도 변환 애플리케이션의 함수 정의 예
{ "functions": [ { "name": "multiplication", "operation": "specs/multiplication.yaml#doOperation" }, { "name": "subtraction", "operation": "specs/subtraction.yaml#doOperation" } ] }
-
함수 정의가
src/main/resources/specs
디렉터리에 저장된 OpenAPI 파일의 올바른 경로를 참조하는지 확인합니다.
워크플로우 상태에서 정의된 함수에 액세스하려면 다음을 수행합니다.
- 추가한 함수 정의를 호출하는 워크플로우 작업을 정의합니다. 각 작업이 이전에 정의한 함수를 참조하는지 확인합니다.
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 } } ] }
-
OpenAPI 사양의
Operation Object
섹션을 확인하여 요청의 매개변수를 구조화하는 방법을 알아봅니다. -
jq
표현식을 사용하여 페이로드에서 데이터를 추출하여 필요한 매개변수에 매핑합니다. OpenAPI 사양에 따라 엔진에서 매개변수 이름을 매핑하는지 확인합니다. 본문 대신 요청 경로에 매개 변수가 필요한 작업의 경우 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" } } } ] }
2.1.3. OpenAPI 서비스의 끝점 URL 구성
워크플로우 상태의 함수 정의에 액세스한 후 OpenAPI 서비스의 엔드포인트 URL을 구성할 수 있습니다.
사전 요구 사항
- OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성할 수 있는 적절한 역할 및 권한으로 OpenShift Serverless Logic 프로젝트에 액세스할 수 있습니다.
- OpenShift Serverless Logic 프로젝트를 생성했습니다.
- OpenAPI 사양 파일에 액세스할 수 있습니다.
- 워크플로우에서 함수 정의를 정의했습니다.
- 워크플로우 상태에서 정의된 함수에 액세스할 수 있습니다.
프로세스
-
구성할 OpenAPI 사양 파일을 찾습니다. 예를 들면
substraction.yaml
입니다. -
문자(예:
.
)를 밑줄로 바꾸고 문자를 소문자로 변환하여 파일 이름을 유효한 구성 키로 변환합니다. 예를 들어substraction.yaml
을substraction_yaml
로 변경합니다. 구성 키를 정의하려면 변환된 파일 이름을 REST 클라이언트 구성 키로 사용합니다. 다음 예와 같이 이 키를 환경 변수로 설정합니다.
quarkus.rest-client.subtraction_yaml.url=http://myserver.com
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
-
구성 키:
-
(SUBTRACTION_URL)
환경 변수가 시스템 또는 배포 환경에 설정되어 있는지 확인합니다. 변수를 찾을 수 없는 경우 애플리케이션은 대체 URL(http://myserver.com)
을 사용합니다. application.properties
파일에 구성 키와 URL 대체를 추가합니다.quarkus.rest-client.subtraction_yaml.url=${SUBTRACTION_URL:http://myserver.com}
- 애플리케이션을 배포하거나 다시 시작하여 새 구성 설정을 적용합니다.