12.2. 开发 Quarkus 功能
创建 Quarkus 功能项目后,您可以修改提供的模板文件,以将业务逻辑添加到您的功能中。这包括配置功能调用和返回的标头和状态代码。
12.2.1. 先决条件
- 在开发功能前,您必须完成 配置 OpenShift Serverless 功能 中的设置步骤。
12.2.2. Quarkus 功能模板结构
					使用 Knative (kn) CLI 创建 Quarkus 功能时,项目目录类似于典型的 Maven 项目。另外,项目还包含用于配置功能的 func.yaml 文件。
				
					http 和 event 触发器功能具有相同的模板结构:
				
模板结构
12.2.3. 关于调用 Quarkus 功能
您可以创建一个 Quarkus 项目来响应云事件,或创建响应简单 HTTP 请求的 Quarkus 项目。Knative 中的云事件作为 POST 请求通过 HTTP 传输,因此任一功能类型都可以侦听和响应传入的 HTTP 请求。
收到传入请求时,通过允许类型的实例调用 Quarkus 函数。
| 调用方法 | 实例中包含的数据类型 | 数据示例 | 
|---|---|---|
| HTTP POST 请求 | 请求正文中的 JSON 对象 | 
									 | 
| HTTP GET 请求 | 查询字符串中的数据 | 
									 | 
| 
									 | 
									 | 
									 | 
					以下示例显示了接收并处理上表中列出的 customerId 和 productId 购买数据的函数:
				
Quarkus 功能示例
					包含购买数据的对应 Purchase JavaBean 类如下:
				
类示例
public class Purchase {
    private long customerId;
    private long productId;
    // getters and setters
}
public class Purchase {
    private long customerId;
    private long productId;
    // getters and setters
}12.2.3.1. 调用示例
						以下示例代码定义了名为 withBeans、withCloudEvent 和 withBinary 的三个功能;
					
示例
						Functions 类的 withBeans 功能可以通过以下方法调用:
					
- 带有 JSON 正文的 HTTP POST 请求: - curl "http://localhost:8080/withBeans" -X POST \ -H "Content-Type: application/json" \ -d '{"message": "Hello there."}'- $ curl "http://localhost:8080/withBeans" -X POST \ -H "Content-Type: application/json" \ -d '{"message": "Hello there."}'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 带有查询参数的 HTTP GET 请求: - curl "http://localhost:8080/withBeans?message=Hello%20there." -X GET - $ curl "http://localhost:8080/withBeans?message=Hello%20there." -X GET- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 二进制编码中的 - CloudEvent对象:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 结构化编码中的 - CloudEvent对象:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
						与 withBeans 函数类似,可以利用 CloudEvent 对象来调用 Functions 类的 withCloudEvent 功能。但是,与 Beans 不同,CloudEvent 无法通过普通 HTTP 请求来调用。
					
						Functions 类的 withBinary 功能可通过以下方式调用:
					
- 二进制编码中的 - CloudEvent对象:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 结构化编码中的 - CloudEvent对象:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
12.2.4. CloudEvent 属性
					如果您需要读取或写入 CloudEvent 的属性,如 type 或 subject,您可以使用 CloudEvent<T> 通用接口和 CloudEventBuilder 构建器。<T> 类型参数必须是允许的类型之一。
				
					在以下示例中,CloudEventBuilder 用于返回处理订购的成功或失败:
				
12.2.5. Quarkus 功能返回值
					功能可以从允许类型列表中返回任何类型的实例。另外,他们可以返回 Uni<T> 类型,其中 <T> 类型参数可以是允许的类型的任何类型。
				
					如果函数调用异步 API,因为返回的对象以与接收对象相同的格式序列化,Uni<T> 类型很有用。例如:
				
- 如果函数收到 HTTP 请求,则返回的对象将在 HTTP 响应的正文中发送。
- 
							如果函数通过二进制编码收到 CloudEvent对象,则返回的对象将在二进制编码的CloudEvent对象的 data 属性中发送。
以下示例显示了获取购买列表的功能:
示例命令
- 通过 HTTP 请求调用此功能将生成 HTTP 响应,其中包含响应正文中的订购列表。
- 
							通过传入的 CloudEvent对象调用此功能可生成CloudEvent响应,并在data属性中包括一个订购列表。
12.2.5.1. 允许的类型
						功能的输入和输出可以是 void、String、或 byte[] 类型。此外,它们也可以是原语类型及其打包程序,例如 int 和 Integer。它们也可以是以下复杂的对象:Javabeans、映射、列表、数组和特殊的 CloudEvents<T> 类型。
					
						映射、列出、数组、CloudEvents<T> 类型的 <T> 类型参数以及 Javabeans 的属性只能是此处列出的类型。
					
示例
12.2.6. 测试 Quarkus 功能
					Quarkus 功能可以在您的计算机上进行本地测试。在使用 kn func create 创建功能时创建的默认项目中,有 src/test/ 目录,其中包含基本的 Maven 测试。这些测试可以根据需要扩展。
				
先决条件
- 您已创建了 Quarkus 功能。
- 
							已安装 Knative (kn) CLI。
流程
- 导航到您的功能的项目文件夹。
- 运行 Maven 测试: - ./mvnw test - $ ./mvnw test- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
12.2.7. 覆盖存活度和就绪度探测值
					您可以覆盖 Quarkus 功能的   值。这可让您配置在功能上执行的健康检查。
				存活度和就绪度探测 
先决条件
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Serving。
- 
							已安装 Knative (kn) CLI。
- 
							已使用 kn func create创建功能。
流程
- 使用您自己的值覆盖 - /health/liveness和- /health/readiness路径。您可以通过更改功能源中的属性,或者在- func.yaml文件中设置- QUARKUS_SMALLRYE_HEALTH_LIVENESS_PATH和- QUARKUS_SMALLRYE_HEALTH_READINESS_PATH环境变量来实现。- 要使用功能源覆盖路径,请更新 - src/main/resources/application.properties文件中的 path 属性:- quarkus.smallrye-health.root-path=/health quarkus.smallrye-health.liveness-path=alive quarkus.smallrye-health.readiness-path=ready - quarkus.smallrye-health.root-path=/health- 1 - quarkus.smallrye-health.liveness-path=alive- 2 - quarkus.smallrye-health.readiness-path=ready- 3 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 要使用环境变量覆盖路径,请在 - func.yaml文件的- build块中定义路径变量:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- 在 - func.yaml文件中添加新端点,以便它们被正确绑定到 Knative 服务的容器:- deploy: healthEndpoints: liveness: /health/alive readiness: /health/ready- deploy: healthEndpoints: liveness: /health/alive readiness: /health/ready- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow