第 6 章 使用 Fuse 中的策略扩展转换 3scale 消息内容
您可以使用红帽 Fuse 为红帽 3scale API 管理创建高度灵活的策略扩展。您可以通过在 OpenShift 上的 Fuse 中创建策略扩展,然后将它们配置为 3scale 管理门户中的策略。使用 APIcast Camel 代理策略,您可以对请求和响应消息内容执行复杂的转换,例如 XML 到 JSON,它们在 Apache Camel 集成框架中实施。
此外,您可以在 Camel 中动态添加或修改自定义策略扩展,而不是重新构建和重新部署静态 APIcast 容器镜像。您可以使用任何使用 Camel 域特定语言(DSL)编写的 Camel 企业集成模式(EIP)来实施 APIcast 策略扩展。这可让您使用熟悉的编程语言(如 Java 或 XML)编写策略扩展。本主题的示例使用 Camel Netty4 HTTP 组件在 Java 中实施 HTTP 代理。
如果您已在 3scale API 后端中使用 Fuse Camel 应用程序,则不需要此功能。在这种情况下,您可以使用现有的 Fuse Camel 应用程序来执行转换。
所需的软件组件
您必须在同一 OpenShift 集群中部署以下 Red Hat 集成组件:
- OpenShift 7.10 上的 Fuse
- 3scalepremise-premises 2.12
- APIcast 嵌入式(默认暂存和生产)或 APIcast 自管理
您可以在 3scale 之外的其他 OpenShift 项目中部署自定义 Fuse 策略,但这不是必需的。但是,您必须确保两个项目间的通信成为可能。详情请参阅使用 OpenShift SDN 配置网络策略。
其他资源
6.1. 在 Fuse 中集成 APIcast 与 Apache Camel 转换
您可以将 APIcast 与在 OpenShift 上的 Fuse 中编写为 Apache Camel 应用程序转换进行集成。当在 3scale 中配置和部署策略扩展后,3scale 流量将经由 Camel 策略扩展,该扩展将转换消息内容。在这种情况下,Camel 充当反向 HTTP 代理,APIcast 将 3scale 流量发送到 Camel,然后 Camel 会将流量发送到 API 后端。
本主题的示例使用 Camel Netty4 HTTP 组件创建 HTTP 代理:
- 通过 HTTP 代理协议接收的请求将转发到目标服务,并将 HTTP 正文转换为大写。
- 目标服务的响应是通过将其转换为大写,然后返回到客户端来处理的。
- 本例显示了 HTTP 和 HTTPS 用例所需的配置。
先决条件
您必须在同一 OpenShift 集群上部署 Fuse on OpenShift 7.10 和 3scale 2.12。有关安装详情,请参阅:
- 您必须具有集群管理员特权才能在 OpenShift 和 3scale 上安装 Fuse 并创建项目。但是,您可以创建部署配置、部署容器集,或者创建具有每个项目编辑访问权限的服务。
步骤
使用 Camel
netty4-http
组件以 Java 编写 Apache Camel 应用程序,以实施 HTTP 代理。然后,您可以使用任何 Camel 组件转换消息。以下简单示例从服务执行请求和响应的大写转换:
import java.nio.file.Files; import java.nio.file.Path; import java.util.Locale; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.model.RouteDefinition; public class ProxyRoute extends RouteBuilder { @Override public void configure() throws Exception { final RouteDefinition from; if (Files.exists(keystorePath())) { from = from("netty4-http:proxy://0.0.0.0:8443?ssl=true&keyStoreFile=/tls/keystore.jks&passphrase=changeit&trustStoreFile=/tls/keystore.jks"); 1 } else { from = from("netty4-http:proxy://0.0.0.0:8080"); } from .process(ProxyRoute::uppercase) .toD("netty4-http:" + "${headers." + Exchange.HTTP_SCHEME + "}://" 2 + "${headers." + Exchange.HTTP_HOST + "}:" + "${headers." + Exchange.HTTP_PORT + "}" + "${headers." + Exchange.HTTP_PATH + "}") .process(ProxyRoute::uppercase); } Path keystorePath() { return Path.of("/tls", "keystore.jks"); } public static void uppercase(final Exchange exchange) { 3 final Message message = exchange.getIn(); final String body = message.getBody(String.class); message.setBody(body.toUpperCase(Locale.US)); } }
- 在 OpenShift 上部署您的 Camel 应用程序并将其公开为服务。如需了解更多详细信息,请参阅在 OpenShift 的 Fuse 上创建和部署应用程序。