第 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 并创建项目。但是,您可以创建部署配置、部署容器集,或者创建具有每个项目编辑访问权限的服务。

流程

  1. 在 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));
        }
    }
  2. 按照 在 OpenShift 中创建和部署 Fuse 所述,部署您的 Camel 应用程序
注意

本例中不支持 HTTP over TLS(HTTPS)协议。