第 6 章 使用 Fuse 中的策略扩展转换 3scale 消息内容
您可以使用 Red Hat Fuse 为 Red Hat 3scale API Management 创建高度灵活的策略扩展。您可以通过在 OpenShift 上的 Fuse 中创建策略扩展,并在 3scale 管理门户中配置它们。这可让您使用 APIcast 代理策略来执行复杂的转换来请求/响应消息内容(例如,XML 到 JSON),并在 Apache Camel 集成框架中实施。
这也允许您在 Camel 中动态添加或修改自定义策略扩展,而不是重建并重新部署静态 APIcast 容器镜像。您可以使用任何使用 Camel 域特定语言(DSL)提供的 Camel 企业集成模式(EIP)来实现 APIcast 策略扩展。这可让您使用熟悉的编程语言(如 Java 或 XML)编写策略扩展。本主题的示例使用 Camel Netty4 HTTP 组件在 Java 中实施 HTTP 代理。
所需的软件组件
您必须在同一 OpenShift 集群中部署以下 Red Hat 集成组件:
- OpenShift 7.6 上的 Fuse
- 3scale On-premises
- APIcast 自我管理或嵌入
您应该在同一 OpenShift 集群上安装这些组件,但不一定要在同一命名空间或项目中。Fuse 和 3scale 之间没有直接通信。所有通信均仅通过 OpenShift 进行。
从架构角度而言,最好将 Fuse 自定义代码在不同于 3scale 项目中运行。但是,您必须确保两个项目间的通信成为可能。详情请参阅使用 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 正文转换为大写。
- 目标服务的响应是通过将其转换为大写,然后返回到客户端来处理的。
先决条件
您必须在 OpenShift 7.6 和 3scale 2.8 上部署了 Fuse,并且部署在同一 OpenShift 集群上。有关安装详情,请参阅:
- 您将需要集群管理员特权,以便在 OpenShift 和 3scale 上安装 Fuse 并创建项目。但是,您可以创建部署配置、部署容器集,或者创建具有每个项目编辑访问权限的服务。
流程
在 Java 中编写 Apache Camel 应用程序,使用 Camel netty4-http 组件来实施 HTTP 代理。然后,您可以使用任何 Camel 组件转换消息。
以下简单示例执行请求的大写和来自服务的响应:
import java.util.Locale; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.builder.RouteBuilder; public class ProxyRoute extends RouteBuilder { @Override public void configure() throws Exception { from("netty4-http:proxy://0.0.0.0:8080") .process(ProxyRoute::uppercase) .toD("netty4-http:" + "${headers." + Exchange.HTTP_SCHEME + "}://" + "${headers." + Exchange.HTTP_HOST + "}:" + "${headers." + Exchange.HTTP_PORT + "}" + "${headers." + Exchange.HTTP_PATH + "}") .process(ProxyRoute::uppercase); } public static void uppercase(final Exchange exchange) { final Message message = exchange.getIn(); final String body = message.getBody(String.class); message.setBody(body.toUpperCase(Locale.US)); } }
- 按照 在 OpenShift 中创建和部署 Fuse 所述,部署您的 Camel 应用程序。
本例中不支持 HTTP over TLS(HTTPS)协议。