6장. Fuse의 정책 확장을 사용하여 3scale 메시지 컨텐츠 변환

Red Hat Fuse를 사용하여 Red Hat 3scale API Management를 위한 매우 유연한 정책 확장을 만들 수 있습니다. OpenShift의 Fuse에 정책 확장을 만든 다음 3scale 관리 포털에서 정책으로 구성하여 이 작업을 수행할 수 있습니다. APIcast Camel 프록시 정책을 사용하면 요청 및 응답 메시지 콘텐츠(예: Apache Camel 통합 프레임워크에 구현된 XML에서 JSON)에 대한 복잡한 변환을 수행할 수 있습니다.

또한 정적 APIcast 컨테이너 이미지를 다시 빌드하고 재배포하는 대신 Camel에서 사용자 지정 정책 확장을 동적으로 추가하거나 수정할 수 있습니다. Camel DSL(Domain Specific Language)으로 작성된 Camel EIP(Enterprise Integration Pattern)를 사용하여 APIcast 정책 확장을 구현할 수 있습니다. 이를 통해 Java 또는 XML과 같은 친숙한 프로그래밍 언어를 사용하여 정책 확장을 작성할 수 있습니다. 이 주제의 예제에서는 Camel Netty4 HTTP 구성 요소를 사용하여 Java에서 HTTP 프록시를 구현합니다.

참고

3scale API 백엔드에서 Fuse Camel 애플리케이션을 이미 사용하고 있는 경우에는 이 기능이 필요하지 않습니다. 이 경우 기존 Fuse Camel 애플리케이션을 사용하여 변환을 수행할 수 있습니다.

필수 소프트웨어 구성 요소

다음과 같은 Red Hat 통합 구성 요소가 동일한 OpenShift 클러스터에 배포되어야 합니다.

  • OpenShift 7.10의 Fuse
  • 3scale 온-프레미스 2.11
  • APIcast 내장(기본 스테이징 및 생산) 또는 APIcast 자체 관리

3scale과 다른 OpenShift 프로젝트에 사용자 지정 Fuse 정책을 배포할 수 있지만 필수는 아닙니다. 그러나 두 프로젝트 간의 통신이 가능한지 확인해야 합니다. 자세한 내용은 OpenShift SDN을 사용하여 네트워크 정책 구성을 참조하십시오.

추가 리소스

6.1. Fuse에서 Apache Camel 변환과 APIcast 통합

OpenShift의 Fuse에서 Apache Camel 애플리케이션으로 작성된 변환과 APIcast를 통합할 수 있습니다. 정책 확장 변환이 3scale에 구성되고 배포되면 3scale 트래픽은 메시지 콘텐츠를 변환하는 Camel 정책 확장을 거칩니다. 이 경우 Camel은 APIcast에서 3scale 트래픽을 Camel로 전송한 다음 Camel이 API 백엔드로 트래픽을 전송하는 역방향 HTTP 프록시로 작동합니다.

이 주제의 예제에서는 Camel Netty4 HTTP 구성 요소를 사용하여 HTTP 프록시를 생성합니다.

  • HTTP 프록시 프로토콜을 통해 수신된 요청은 HTTP 본문을 대문자로 변환하여 대상 서비스로 전달됩니다.
  • target 서비스의 응답은 대문자로 변환한 다음 클라이언트로 반환하여 처리됩니다.
  • 이 예에서는 HTTP 및 HTTPS 사용 사례에 필요한 구성을 보여줍니다.

사전 요구 사항

  • 동일한 OpenShift 클러스터에 배포된 OpenShift 7.10 및 3scale 2.11에 Fuse가 배포되어 있어야 합니다. 설치 세부 사항은 다음을 참조하십시오.

  • OpenShift 및 3scale에 Fuse를 설치하고 프로젝트를 만들려면 클러스터 관리자 권한이 있어야 합니다. 그러나 배포 구성을 생성하거나, Pod를 배포하거나, 프로젝트당 편집 액세스 권한을 사용하여 서비스를 생성할 수 있습니다.

절차

  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
    Camel 프록시 정책을 3scale에서 호출하면 3scale의 백엔드 API에 대해 구성된 값에 따라 HTTP_SCHEME, HTTP_HOST, HTTP_PORT 및 HTTP_PATH 헤더의 값이 자동으로 설정됩니다.
    3
    이 간단한 예제에서는 메시지 내용을 대문자로 변환합니다. Camel Enterprise Integration Patterns를 사용하여 요청 및 응답 메시지 콘텐츠(예: XML에서 JSON으로)에서 더 복잡한 변환을 수행할 수 있습니다.
  2. OpenShift에 Camel 애플리케이션을 배포하고 서비스로 노출합니다. 자세한 내용은 OpenShift에서 Fuse에서 애플리케이션 생성 및 배포를 참조하십시오.