第 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.7 上的 Fuse
  • 3scale 内部部署的 2.9
  • 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.7 和 3scale 2.9。有关安装详情,请参阅:

  • 您必须具有集群管理员特权才能在 OpenShift 和 3scale 上安装 Fuse 并创建项目。但是,您可以创建部署配置、部署容器集,或者创建具有每个项目编辑访问权限的服务。

流程

  1. 使用 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));
        }
    
    }
    1
    在这个简单示例中,如果您的 Java 密钥存储文件挂载于 /tls/keystore.jks,侦听端口将设置为 8443
    2
    3scale 调用 Camel 代理策略时,会根据 3scale 中为后端 API 配置的值自动设置 HTTP_SCHEMEHTTP_HOST、HTTP_PORT 和 HTTP_PATH 标头的值。
    3
    这个简单示例将消息内容转换为大写。您可以使用 Camel Enterprise Integration Patterns 对请求和响应消息内容(例如 XML 到 JSON)执行更复杂的转换。
  2. 在 OpenShift 上部署您的 Camel 应用程序并将其公开为服务。如需了解更多详细信息,请参阅在 OpenShift 的 Fuse 上创建和部署应用程序