5장. Fuse의 정책 확장을 사용하여 3scale API Management 메시지 콘텐츠 변환
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)을 사용하여 APIcast 정책 확장을 구현할 수 있습니다. 이를 통해 Java 또는 XML과 같은 친숙한 프로그래밍 언어를 사용하여 정책 확장을 작성할 수 있습니다. 이 주제의 예제에서는 Camel Netty4 HTTP 구성 요소를 사용하여 Java에서 HTTP 프록시를 구현합니다.
3scale API 백엔드에서 Fuse Camel 애플리케이션을 이미 사용하고 있는 경우에는 이 기능이 필요하지 않습니다. 이 경우 기존 Fuse Camel 애플리케이션을 사용하여 변환을 수행할 수 있습니다.
필수 소프트웨어 구성 요소
동일한 OpenShift 클러스터에 다음 Red Hat Integration 구성 요소가 배포되어 있어야 합니다.
- OpenShift 7.10의 Fuse.
- 3scale On-premises 2.14.
- APIcast 내장(기본 스테이징 및 프로덕션) 또는 APIcast 자체 관리.
3scale과는 다른 OpenShift 프로젝트에서 사용자 지정 Fuse 정책을 배포할 수 있지만 필수는 아닙니다. 그러나 두 프로젝트 간의 통신이 가능한지 확인해야 합니다. 자세한 내용은 OpenShift SDN을 사용하여 네트워크 정책 구성을 참조하십시오.
추가 리소스
5.1. Fuse에서 Apache Camel 변환과 APIcast 통합
OpenShift에서 Fuse에서 Apache Camel 애플리케이션으로 작성된 변환과 APIcast를 통합할 수 있습니다. 정책 확장 변환이 3scale로 구성 및 배포되면 3scale 트래픽이 Camel 정책 확장을 통해 메시지 콘텐츠를 변환합니다. 이 경우 Camel은 역방향 HTTP 프록시로 작동하며 APIcast에서 3scale 트래픽을 Camel로 보낸 다음 Camel에서 트래픽을 API 백엔드로 보냅니다.
이 주제의 예제에서는 Camel Netty4 HTTP 구성 요소를 사용하여 HTTP 프록시를 생성합니다.
- HTTP 프록시 프로토콜을 통해 수신된 요청은 HTTP 본문을 대문자로 변환하여 대상 서비스로 전달됩니다.
- 대상 서비스의 응답은 대문자로 변환한 다음 클라이언트로 반환하여 처리됩니다.
- 이 예에서는 HTTP 및 HTTPS 사용 사례에 필요한 구성을 보여줍니다.
사전 요구 사항
OpenShift 7.10 및 3scale 2.14에 Fuse가 동일한 OpenShift 클러스터에 배포되어 있어야 합니다. 설치에 대한 자세한 내용은 다음을 참조하십시오.
- OpenShift 및 3scale에 Fuse를 설치하고 프로젝트를 생성하려면 클러스터 관리자 권한이 있어야 합니다. 그러나 배포 구성을 생성하거나 Pod를 배포하거나 프로젝트당 액세스 권한을 편집하여 서비스를 생성할 수 있습니다.
절차
Camel
netty4-http
구성 요소를 사용하여 Java에 HTTP 프록시를 구현하도록 Apache Camel 애플리케이션을 작성합니다. 그런 다음 Camel 구성 요소를 사용하여 메시지를 변환할 수 있습니다.다음 간단한 예제에서는 서비스에서 요청 및 응답의 대문자 변환을 수행합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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"); } else { from = from("netty4-http:proxy://0.0.0.0:8080"); } from .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); } Path keystorePath() { return Path.of("/tls", "keystore.jks"); } 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)); } }
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 프록시 정책을 호출하면
HTTP_SCHEME
,HTTP_HOST
,HTTP_PORT
및HTTP_PATH
헤더의 값이 3scale의 백엔드 API에 대해 구성된 값에 따라 자동으로 설정됩니다. - 3
- 이 간단한 예제에서는 메시지 내용을 대문자로 변환합니다. Camel Enterprise Integration Patterns를 사용하여 요청 및 응답 메시지 콘텐츠(예: XML에서 JSON으로)에서 보다 복잡한 변환을 수행할 수 있습니다.
- OpenShift에 Camel 애플리케이션을 배포하고 서비스로 노출합니다. 자세한 내용은 OpenShift에서 Fuse에 애플리케이션 생성 및 배포를 참조하십시오.