Netty HTTP 컴포넌트
Netty HTTP 컴포넌트 (Netty HTTP)
Netty HTTP 컴포넌트는 Netty 컴포넌트를 확장해서 HTTP 전송을 간편하게 다룰 수 있게 해 주는 컴포넌트예요. producer와 consumer를 모두 지원하고, Netty의 스트림 기반 특성을 그대로 살리면서 HTTP 레벨의 설정과 보안 기능을 제공해요.
출처: 문서
본문
Camel 2.14부터 지원
producer와 consumer를 모두 지원해요
Netty HTTP 컴포넌트는 Netty 컴포넌트를 확장해서 HTTP 전송을 간편하게 다룰 수 있게 해 준 컴포넌트예요.
참고 스트림 (Stream)
Netty는 스트림 기반이라서 받은 입력을 스트림으로 Camel에 넘겨요. 그래서 스트림의 내용은 한 번만 읽을 수 있어요. 메시지 본문이 비어 보이거나 데이터를 여러 번 접근해야 하는 상황(예: 멀티캐스팅, 재전송 에러 처리)이라면 Stream caching을 쓰거나, 여러 번 다시 읽어도 안전한
String으로 메시지 본문을 변환해야 해요.Netty HTTP는
io.netty.handler.codec.http.HttpObjectAggregator로 전체 스트림을 메모리에 읽어 들여 완전한 http 메시지를 만들어요. 다만 만들어진 메시지는 여전히 스트림 기반 메시지라서 한 번만 읽을 수 있어요.
Maven 사용자라면 이 컴포넌트를 쓰려고 pom.xml에 다음 의존성을 추가해야 해요:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty-http</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI 형식 (URI format)
netty 컴포넌트의 URI 스킴은 다음과 같아요
netty-http:http://0.0.0.0:8080[?options]
참고 쿼리 파라미터 vs. 엔드포인트 옵션
Camel이 URI 쿼리 파라미터와 엔드포인트 옵션을 어떻게 구분하는지 궁금할 수 있어요. 예컨대 엔드포인트 URI를
netty-http:http//example.com?myParam=myValue&compression=true처럼 만들었다고 해 보죠. 이 예에서myParam은 HTTP 파라미터이고,compression은 Camel 엔드포인트 옵션이에요. Camel은 이런 상황에서 사용 가능한 엔드포인트 옵션을 해석해서 URI에서 제거하는 전략을 써요. 그래서 위 예에서 Netty HTTP producer가 엔드포인트로 보내는 HTTP 요청은http//example.com?myParam=myValue가 돼요.compression엔드포인트 옵션이 해석돼서 대상 URL에서 제거되기 때문이에요.또한 동적 헤더(
CamelHttpQuery같은 것)로 엔드포인트 옵션을 지정할 수 없다는 점도 기억하세요. 엔드포인트 옵션은to나fromDSL 요소 같은 엔드포인트 URI 정의 수준에서만 지정할 수 있어요.
중요 훨씬 더 많은 옵션
이 컴포넌트는 Netty의 모든 옵션을 물려받기 때문에, Netty 문서도 꼭 살펴 보세요. 다만 UDP 전송 관련 옵션처럼 이 Netty HTTP 컴포넌트에서는 적용되지 않는 Netty 옵션도 있다는 점에 유의하세요.
옵션 설정 방법 (Configuring Options)
Camel 컴포넌트는 두 단계로 나눠 설정합니다:
-
컴포넌트(component) 레벨
-
엔드포인트(endpoint) 레벨
컴포넌트 옵션 설정 (Configuring Component Options)
컴포넌트 레벨에서는 엔드포인트들이 이어서 물려받는 일반적이고 공유되는 설정을 해요. 가장 상위의 설정 레벨이죠.
예를 들어 컴포넌트에는 보안 설정, 인증용 자격 증명, 네트워크 연결 URL 같은 것들이 있을 수 있어요.
컴포넌트에 따라 옵션이 몇 개뿐인 것도 있고 아주 많은 것도 있어요. 컴포넌트는 보통 널리 쓰이는 기본값이 미리 설정되어 있어서, 몇 가지 옵션만 설정하거나 아예 하나도 건드리지 않아도 되는 경우가 많아요.
컴포넌트는 다음 방법으로 설정할 수 있어요:
-
the Component DSL.
-
in a configuration file (
application.properties,*.yamlfiles, etc). -
directly in the Java code.
엔드포인트 옵션 설정 (Configuring Endpoint Options)
엔드포인트는 옵션이 많아서 설정에 시간을 더 쓰게 될 거예요. 이 옵션들이 엔드포인트가 원하는 일을 하도록 커스터마이즈해 줘요. 옵션은 엔드포인트가 consumer(from)로 쓰이는지, producer(to)로 쓰이는지, 둘 다인지에 따라 분류되기도 해요.
엔드포인트 설정은 대부분 엔드포인트 URI에 _path_와 query 파라미터로 바로 하는 경우가 많아요. Java에서 엔드포인트와 데이터 포맷을 _타입 세이프_하게 설정하려면 Endpoint DSL과 DataFormat DSL을 쓸 수도 있어요.
옵션을 설정할 때 좋은 습관은 Property Placeholders를 사용하는 거예요.
프로퍼티 플레이스홀더는 이런 장점이 있어요:
-
URL, 포트 번호, 민감한 정보 같은 설정을 하드코딩하는 걸 막아 줘요.
-
설정을 코드 밖으로 분리할 수 있어요.
-
코드가 더 유연해지고 재사용하기 좋아져요.
다음 두 섹션에서 모든 옵션을 나열해요. 먼저 컴포넌트 옵션, 그다음 엔드포인트 옵션 순서예요.
컴포넌트 옵션 (Component Options)
Netty HTTP 컴포넌트가 지원하는 옵션은 아래와 같아요.
| Name | Description | Default | Type |
|---|---|---|---|
| configuration (common) | 엔드포인트를 만들 때 설정으로 NettyConfiguration을 사용해요. | NettyConfiguration | |
| disconnect (common) | 사용 직후 Netty 채널에서 연결을 끊을지(close) 여부예요. | false | boolean |
| keepAlive (common) | 활동이 없어서 소켓이 닫히지 않도록 보장하는 설정이에요. | true | boolean |
| reuseAddress (common) | 소켓 멀티플렉싱을 돕는 설정이에요. | true | boolean |
| reuseChannel (common) | 이 옵션은 producer와 consumer(클라이언트 모드)가 Exchange를 처리하는 라이프사이클 동안 같은 Netty 채널을 재사용할 수 있게 해 줘요. Camel 라우트에서 같은 서버를 여러 번 호출하면서 같은 네트워크 연결을 쓰고 싶을 때 유용해요. 이 옵션을 쓰면 Exchange가 끝나기 전까지는 채널이 연결 풀로 반환되지 않고, disconnect 옵션이 true로 설정돼 있으면 연결이 끊겨요. 재사용되는 채널은 CamelNettyChannel 키를 가진 exchange 프로퍼티로 Exchange에 저장돼서, 라우팅 중에 채널을 꺼내 쓸 수도 있어요. | false | boolean |
| sync (common) | 엔드포인트를 one-way(false)로 쓸지 request-response(true)로 쓸지 정하는 설정이에요. | true | boolean |
| tcpNoDelay (common) | TCP 프로토콜 성능을 개선하기 위한 설정이에요. | true | boolean |
| networkInterface (common (advanced)) | UDP를 쓸 때 이 옵션으로 멀티캐스트 그룹에 조인할 네트워크 인터페이스를 eth0 같은 이름으로 지정할 수 있어요. | String | |
| bridgeErrorHandler (consumer) | 컨슈머를 Camel 라우팅 에러 핸들러(Error Handler)에 브리지할 수 있게 해 줘요. 즉, Camel 컨슈머가 들어오는 메시지를 집어 올리는 동안 등에서 예외가 발생하면(가능한 경우), 그 예외를 메시지로 처리해서 라우팅 에러 핸들러가 다루게 돼요. 중요: 이것은 서드파티 컴포넌트가 예외가 던져졌을 때 Camel에 알릴 수 있도록 허용하는 경우에만 가능해요. 일부 컴포넌트는 내부에서만 처리하기 때문에 bridgeErrorHandler를 쓸 수 없어요. 다른 상황에서는 Camel 컴포넌트를 개선해서 서드파티 컴포넌트에 연결(hook)해 이를 가능하게 만들 수도 있어요. 기본으로 컨슈머는 org.apache.camel.spi.ExceptionHandler로 예외를 처리하는데, WARN 또는 ERROR 레벨로 로그를 남기고 무시해요. | false | boolean |
| clientMode (consumer) | clientMode가 true이면 netty consumer가 주소에 TCP 클라이언트로 접속해요. | false | boolean |
| muteException (consumer) | 활성화하면 consumer 쪽에서 Exchange 처리가 실패했을 때 응답 본문에 예외의 스택 트레이스가 담기지 않아요. | true | boolean |
| reconnect (consumer) | consumer의 clientMode에서만 쓰는 옵션이에요. 활성화하면 연결이 끊겼을 때 consumer가 재접속을 시도해요. | true | boolean |
| reconnectInterval (consumer) | reconnect와 clientMode가 활성화됐을 때 쓰여요. 재접속을 시도하는 간격(밀리초)이에요. | 10000 | int |
| backlog (consumer (advanced)) | netty consumer(서버)의 백로그(backlog)를 설정할 수 있게 해 줘요. 백로그는 OS에 따라 다른 최선 노력(best effort)에 불과하다는 점에 유의하세요. 200, 500, 1000 같은 값을 설정하면 TCP 스택에 accept 큐의 길이를 알려 줘요. 이 옵션을 설정하지 않으면 백로그는 OS 설정에 따라요. | int | |
| bossCount (consumer (advanced)) | netty가 nio 모드로 동작할 때는 Netty의 기본 bossCount 파라미터(1)를 써요. 이 옵션으로 Netty의 기본 bossCount를 재정의할 수 있어요. | 1 | int |
| bossGroup (consumer (advanced)) | NettyEndpoint 전반에서 서버 측 새 연결을 처리하는 데 쓸 BossGroup을 설정해요. | EventLoopGroup | |
| broadcast (consumer (advanced)) | UDP로 멀티캐스트(Multicast)를 선택하는 설정이에요. | false | boolean |
| disconnectOnNoReply (consumer (advanced)) | sync가 활성화돼 있으면, 돌려줄 응답(reply)이 없을 때 NettyConsumer가 연결을 끊을지 이 옵션이 결정해요. | true | boolean |
| executorService (consumer (advanced)) | 지정한 커스텀 EventExecutorGroup을 사용해요. | EventExecutorGroup | |
| maximumPoolSize (consumer (advanced)) | netty consumer의 순차(ordered) 스레드 풀 최대 크기를 설정해요. 기본 크기는 2 x cpu_core + 1이에요. 예컨대 이 값을 10으로 설정하면 2 x cpu_core + 1이 더 큰 값이 아닌 한 10개 스레드를 써요. 더 크면 그 값이 우선해서 쓰여요. 예를 들어 코어가 8개면 consumer 스레드 풀은 17이 돼요. 이 스레드 풀은 Netty에서 받은 메시지를 Camel이 라우팅할 때 쓰여요. 메시지 순서를 보장하고, 일부 메시지가 블록되더라도 netty의 워커 스레드(event loop)가 영향을 받지 않도록 별도의 스레드 풀을 써요. | int | |
| nettyServerBootstrapFactory (consumer (advanced)) | 커스텀 NettyServerBootstrapFactory를 사용해요. | NettyServerBootstrapFactory | |
| noReplyLogLevel (consumer (advanced)) | |||
| sync가 활성화돼 있으면, 돌려줄 응답이 없음을 로그로 남길 때 NettyConsumer가 쓸 로깅 레벨을 이 옵션이 결정해요. |
Enum values:
-
TRACE
-
DEBUG
-
INFO
-
WARN
-
ERROR
-
OFF
| WARN | LoggingLevel | | serverClosedChannelExceptionCaughtLogLevel (consumer (advanced)) |
서버(NettyConsumer)가 java.nio.channels.ClosedChannelException을 잡으면 이 로깅 레벨로 로그를 남겨요. 클라이언트가 갑자기 연결을 끊어서 Netty 서버에 closed 예외가 쏟아지는 상황에서 그 예외 로그를 피하려고 쓰는 옵션이에요.
Enum values:
-
TRACE
-
DEBUG
-
INFO
-
WARN
-
ERROR
-
OFF
| DEBUG | LoggingLevel | | serverExceptionCaughtLogLevel (consumer (advanced)) |
서버(NettyConsumer)가 예외를 잡으면 이 로깅 레벨로 로그를 남겨요.
Enum values:
-
TRACE
-
DEBUG
-
INFO
-
WARN
-
ERROR
-
OFF
| WARN | LoggingLevel | | serverInitializerFactory (consumer (advanced)) | 커스텀 ServerInitializerFactory를 사용해요. | | ServerInitializerFactory | | usingExecutorService (consumer (advanced)) | 같은 채널에서 이벤트가 순서대로 처리되도록 순차(ordered) 스레드 풀을 쓸지 여부예요. | true | boolean | | connectTimeout (producer) | 소켓 연결을 사용할 수 있을 때까지 기다리는 시간이에요. 값은 밀리초 단위예요. | 10000 | int | | lazyStartProducer (producer) | producer를 lazy(첫 메시지 시점)로 시작할지 여부예요. lazy 시작을 쓰면 producer가 시작 중 실패해서 라우트 시작이 실패하는 상황에서도 CamelContext와 라우트를 시작할 수 있고, 시작 실패 처리를 Camel의 라우팅 에러 핸들러로 넘길 수 있어요. 다만 첫 메시지를 처리하는 시점에 producer를 만들고 시작하는 데 시간이 조금 걸려서 전체 처리 시간이 길어질 수 있다는 점은 유의하세요. | false | boolean | | requestTimeout (producer) | 원격 서버를 호출할 때 Netty producer에 타임아웃을 둘 수 있게 해 줘요. 기본으로는 타임아웃을 쓰지 않아요. 값은 밀리초 단위라서 예컨대 30000은 30초예요. requestTimeout은 Netty의 ReadTimeoutHandler를 써서 타임아웃을 트리거해요. | | long | | clientInitializerFactory (producer (advanced)) | 커스텀 ClientInitializerFactory를 사용해요. | | ClientInitializerFactory | | correlationManager (producer (advanced)) | netty producer로 request/reply를 쓸 때 요청과 응답 메시지가 어떻게 매핑되는지 관리하는 커스텀 correlation manager를 사용해요. 요청과 응답 메시지 양쪽에 correlation id가 있는 것처럼 요청과 응답을 짝지을 방법이 있을 때만 써야 해요. netty에서 같은 채널(연결)로 동시 메시지를 멀티플렉싱하고 싶을 때 쓸 수 있어요. 이럴 때는 요청과 응답 메시지를 연결 지을 방법이 있어야 라우팅이 계속되기 전에 inflight Camel Exchange에 올바른 응답을 저장할 수 있어요. 커스텀 correlation manager를 만들 때는 TimeoutCorrelationManagerSupport를 확장하는 걸 권장해요. 타임아웃 등 직접 구현해야 하는 복잡한 부분을 대신 지원해 주거든요. 자세한 내용은 producerPoolEnabled 옵션도 참고하세요. | | NettyCamelStateCorrelationManager | | lazyChannelCreation (producer (advanced)) | Camel producer가 시작될 때 원격 서버가 아직 떠 있지 않아도 예외를 피하도록 채널을 lazy하게 만들 수 있어요. | true | boolean | | producerPoolBlockWhenExhausted (producer (advanced)) | blockWhenExhausted 설정 속성값을 지정해요. 풀이 고갈돼서(활성 객체의 최대 수에 도달해서) borrowObject() 메서드가 호출됐을 때 블록할지 결정해요. | true | boolean | | producerPoolEnabled (producer (advanced)) | producer 풀을 사용할지 여부예요. 중요: 이걸 끄면 request/reply를 하고 있을 때도 producer가 하나의 공유 연결을 써요. 그러면 응답이 순서대로 돌아오지 않을 때 응답이 뒤섞이는 잠재적 문제가 생겨요. 그래서 요청과 응답 메시지 양쪽에 correlation id를 담아서, Camel에서 메시지를 계속 처리하는 콜백에 응답을 제대로 연결 지을 수 있어야 해요. 이러려면 correlation manager로 NettyCamelStateCorrelationManager를 구현하고 correlationManager 옵션으로 설정해야 해요. 자세한 내용은 correlationManager 옵션도 참고하세요. | true | boolean | | producerPoolMaxIdle (producer (advanced)) | 풀에 둘 수 있는 idle 인스턴스 수의 상한을 설정해요. | 100 | int | | producerPoolMaxTotal (producer (advanced)) | 주어진 시점에 풀이 할당할 수 있는 객체 수(클라이언트에 대여 중이거나 대여를 기다리며 idle인)의 상한을 설정해요. 제한 없음은 음수로 설정해요. 재시도를 수행할 때처럼 producer를 만들 공간이 풀에 필요하니 이 값을 너무 낮게(예: 1) 잡지 않도록 주의하세요. producerPoolBlockWhenExhausted 옵션은 기본값이 true라서 공간이 없으면 풀이 블록하고, 그러면 애플리케이션이 멈출(hang) 수 있다는 점도 유의하세요. | -1 | int | | producerPoolMaxWait (producer (advanced)) | 풀이 고갈됐고 producerPoolBlockWhenExhausted가 true일 때 borrowObject() 메서드가 예외를 던지기 전까지 블록하는 최대 시간(밀리초)을 설정해요. 0보다 작으면 borrowObject() 메서드가 무기한 블록할 수 있어요. | -1 | long | | producerPoolMinEvictableIdle (producer (advanced)) | idle 객체 이벤터(evictor)의 제거 대상이 되기 전까지 객체가 풀에서 idle로 있어도 되는 최소 시간(밀리초)을 설정해요. | 300000 | long | | producerPoolMinIdle (producer (advanced)) | 이벤터 스레드(동작 중이라면)가 새 객체를 만들기 전에 producer 풀에 있어도 되는 최소 인스턴스 수를 설정해요. | | int | | udpConnectionlessSending (producer (advanced)) | 이 옵션은 진짜 fire-and-forget인 connectionless UDP 전송을 지원해요. 연결된(connected) UDP 전송은 수신 포트에서 아무도 listen하지 않으면 PortUnreachableException을 받아요. | false | boolean | | useByteBuf (producer (advanced)) | useByteBuf가 true이면 netty producer가 보내기 전에 메시지 본문을 ByteBuf로 바꿔요. | false | boolean | | allowSerializedHeaders (advanced) | transferExchange가 true일 때 TCP에서만 쓰여요. true로 설정하면 헤더와 프로퍼티의 직렬화 가능 객체가 exchange에 추가돼요. 그렇지 않으면 Camel이 직렬화 불가능 객체를 제외하고 WARN 레벨로 로그를 남겨요. | false | boolean | | autowiredEnabled (advanced) | autowiring을 사용할지 여부예요. 레지스트리에서 일치하는 타입의 인스턴스가 하나뿐인지 찾아 보고, 있으면 컴포넌트에 설정하는 자동 autowiring 옵션(옵션이 autowired로 표시돼 있어야 함)에 쓰여요. JDBC 데이터 소스, JMS 커넥션 팩토리, AWS 클라이언트 등의 자동 설정에 활용할 수 있어요. | true | boolean | | channelGroup (advanced) | 명시적인 ChannelGroup을 사용해요. | | ChannelGroup | | headerFilterStrategy (advanced) | 헤더를 걸러 내려고 커스텀 org.apache.camel.spi.HeaderFilterStrategy를 사용해요. | | HeaderFilterStrategy | | nativeTransport (advanced) | NIO 대신 네이티브 트랜스포트를 쓸지 여부예요. 네이티브 트랜스포트는 호스트 운영체제를 활용하고 일부 플랫폼에서만 지원돼요. 사용 중인 호스트 운영체제용 netty JAR을 추가해야 해요. 자세한 내용은 http://netty.io/wiki/native-transports.html를 참고하세요. | false | boolean | | nettyHttpBinding (advanced) | Netty와 Camel Message API 사이의 바인딩에 커스텀 org.apache.camel.component.netty.http.NettyHttpBinding을 사용해요. | | NettyHttpBinding | | options (advanced) | option. 접두어로 추가 netty 옵션을 설정할 수 있게 해 줘요. 예를 들면 option.child.keepAlive=false죠. 쓸 수 있는 옵션은 Netty 문서를 참고하세요. option. 접두어를 쓰는 멀티 밸류 옵션이에요. | | Map | | receiveBufferSize (advanced) | 인바운드 통신에 쓸 TCP/UDP 버퍼 크기예요. 단위는 바이트예요. | 65536 | int | | receiveBufferSizePredictor (advanced) | 버퍼 크기 예측기(predictor)를 설정해요. 자세한 내용은 Jetty 문서와 이 메일 스레드를 참고하세요. | | int | | sendBufferSize (advanced) | 아웃바운드 통신에 쓸 TCP/UDP 버퍼 크기예요. 단위는 바이트예요. | 65536 | int | | shutdownTimeout (advanced) | 종료 대기(shutdown await) 타임아웃(밀리초)이에요. | 100 | int | | transferExchange (advanced) | TCP에서만 쓰여요. 본문만이 아니라 exchange 전체를 와이어로 전송할 수 있어요. 전송되는 필드는 In body, Out body, fault body, In headers, Out headers, fault headers, exchange 프로퍼티, exchange 예외예요. 객체가 직렬화 가능해야 해요. Camel은 직렬화 불가능 객체를 제외하고 WARN 레벨로 로그를 남겨요. | false | boolean | | udpByteArrayCodec (advanced) | UDP 전용이에요. 활성화하면 Java 직렬화 프로토콜 대신 바이트 배열 코덱을 써요. | false | boolean | | unixDomainSocketPath (advanced) | inet 소켓 대신 쓸 유닉스 도메인 소켓 경로예요. host와 port 파라미터는 쓰이지 않지만 필수예요. 더미 값으로 채워도 괜찮아요. 반드시 nativeTransport=true, clientMode=false와 함께 써야 해요. | | String | | workerCount (advanced) | netty가 nio 모드로 동작할 때는 Netty의 기본 workerCount 파라미터(cpu_core_threads x 2)를 써요. 이 옵션으로 Netty의 기본 workerCount를 재정의할 수 있어요. | | int | | workerGroup (advanced) | boss 스레드 풀로 명시적인 EventLoopGroup을 사용해요. 예컨대 여러 consumer나 producer가 스레드 풀을 공유하게 할 때죠. 기본적으로 각 consumer와 producer는 2 x CPU 코어 수만큼의 스레드를 가진 자기만의 워커 풀을 가져요. | | EventLoopGroup | | allowDefaultCodec (codec) | encoder/decoder가 둘 다 null이고 textline이 false이면 netty 컴포넌트가 기본 코덱을 설치해요. allowDefaultCodec를 false로 설정하면 netty 컴포넌트가 필터 체인의 첫 요소로 기본 코덱을 설치하지 않아요. | true | boolean | | autoAppendDelimiter (codec) | textline 코덱으로 보낼 때 빠진 종료 구분자(end delimiter)를 자동으로 붙일지 여부예요. | true | boolean | | decoderMaxLineLength (codec) | textline 코덱에 쓸 최대 라인 길이예요. | 1024 | int | | decoders (codec) | 사용할 디코더 목록이에요. 콤마로 구분한 값을 가진 String을 쓸 수 있고, 그 값들은 레지스트리에서 찾아 보게 돼요. Camel이 찾아 보도록 하려면 값을 # 접두어로 시작해야 한다는 점만 기억하세요. | | String | | delimiter (codec) |
textline 코덱에 쓸 구분자(delimiter)예요. 가능한 값은 LINE과 NULL이에요.
Enum values:
-
LINE
-
NULL
| LINE | TextLineDelimiter | | encoders (codec) | 사용할 인코더 목록이에요. 콤마로 구분한 값을 가진 String을 쓸 수 있고, 그 값들은 레지스트리에서 찾아 보게 돼요. Camel이 찾아 보도록 하려면 값을 # 접두어로 시작해야 한다는 점만 기억하세요. | | String | | encoding (codec) | textline 코덱에 쓸 인코딩(문자셋 이름)이에요. 지정하지 않으면 Camel이 JVM 기본 Charset을 써요. | | String | | textline (codec) | TCP에서만 쓰여요. 코덱을 지정하지 않았다면 이 플래그로 텍스트 라인 기반 코덱을 쓴다고 표시할 수 있어요. 지정하지 않았거나 값이 false이면 TCP 위에서 객체 직렬화(Object Serialization)를 가정해요. 다만 기본적으로 String만 직렬화할 수 있어요. | false | boolean | | enabledProtocols (security) | SSL을 사용할 때 활성화할 프로토콜이에요. | TLSv1.2,TLSv1.3 | String | | hostnameVerification (security) | SSLEngine에서 호스트명 검증(hostname verification)을 켜거나 끕니다. | false | boolean | | keyStoreFormat (security) | 페이로드 암호화에 쓸 키스토어 포맷이에요. 설정하지 않으면 JKS가 기본값이에요. | | String | | keyStoreResource (security) | 암호화에 쓸 클라이언트 측 인증서 키스토어예요. 기본으로 classpath에서 불러오지만, classpath:, file:, http: 접두어를 붙여서 다른 시스템에서 리소스를 불러올 수 있어요. | | String | | needClientAuth (security) | SSL을 사용할 때 서버가 클라이언트 인증을 요구할지 설정해요. | false | boolean | | passphrase (security) | keyStore와 trustStore에 쓸 비밀번호예요. 두 리소스에 같은 비밀번호를 설정해야 해요. | | String | | securityConfiguration (security) | 보안 웹 리소스를 설정하려고 org.apache.camel.component.netty.http.NettyHttpSecurityConfiguration을 참조해요. | | NettyHttpSecurityConfiguration | | securityProvider (security) | 페이로드 암호화에 쓸 보안 프로바이더예요. 설정하지 않으면 SunX509가 기본값이에요. | | String | | ssl (security) | 이 엔드포인트에 SSL 암호화를 적용할지 정하는 설정이에요. | false | boolean | | sslClientCertHeaders (security) | 활성화하고 SSL 모드일 때 Netty consumer가 subject 이름, issuer 이름, 일련번호, 유효 기간 같은 클라이언트 인증서 정보를 담은 헤더로 Camel 메시지를 풍부하게(enrich) 만들어요. | false | boolean | | sslContextParameters (security) | SSLContextParameters로 보안을 설정해요. | | SSLContextParameters | | sslHandler (security) | SSL 핸들러를 돌려주는 데 쓸 수 있는 클래스에 대한 참조예요. | | SslHandler | | trustStoreResource (security) | 암호화에 쓸 서버 측 인증서 키스토어예요. 기본으로 classpath에서 불러오지만, classpath:, file:, http: 접두어를 붙여서 다른 시스템에서 리소스를 불러올 수 있어요. | | String | | useGlobalSslContextParameters (security) | 전역 SSL 컨텍스트 파라미터 사용을 활성화해요. | false | boolean |
엔드포인트 옵션 (Endpoint Options)
Netty HTTP 엔드포인트는 다음 URI 문법으로 설정해요:
netty-http:protocol://host:port/path
다음 _path_와 query 파라미터를 씁니다:
경로 파라미터 (Path Parameters)
| Name | Description | Default | Type |
|---|---|---|---|
| protocol (common) | |||
| 필수 사용할 프로토콜이에요. http, https 또는 proxy(consumer 전용) 중 하나예요. |
Enum values:
-
http
-
https
-
proxy
| | String | | host (common) | 필수 호스트명이에요. consumer일 때는 localhost 또는 0.0.0.0 같은 로컬 호스트명을 쓰고, producer일 때는 접속할 원격 HTTP 서버의 호스트명을 써요. | | String | | port (common) | 호스트 포트 번호예요. | | int | | path (common) | 리소스 경로예요. | | String |
쿼리 파라미터 (Query Parameters)
| Name | Description | Default | Type |
|---|---|---|---|
| bridgeEndpoint (common) | 이 옵션이 true면 producer가 NettyHttpConstants.HTTP_URI 헤더를 무시하고 요청에 엔드포인트의 URI를 사용해요. throwExceptionOnFailure를 false로 설정해서 producer가 모든 fault 응답을 그대로 돌려보내게 할 수도 있어요. 브리지 모드로 동작하는 consumer는 gzip 압축과 WWW URL 폼 인코딩을 건너뛰어요(소비한 exchange에 Exchange.SKIP_GZIP_ENCODING과 Exchange.SKIP_WWW_FORM_URLENCODED 헤더를 추가해요). | false | boolean |
| disconnect (common) | 사용 직후 Netty 채널에서 연결을 끊을지(close) 여부예요. | false | boolean |
| keepAlive (common) | 활동이 없어서 소켓이 닫히지 않도록 보장하는 설정이에요. | true | boolean |
| reuseAddress (common) | 소켓 멀티플렉싱을 돕는 설정이에요. | true | boolean |
| reuseChannel (common) | 이 옵션은 producer와 consumer(클라이언트 모드)가 Exchange를 처리하는 라이프사이클 동안 같은 Netty 채널을 재사용할 수 있게 해 줘요. Camel 라우트에서 같은 서버를 여러 번 호출하면서 같은 네트워크 연결을 쓰고 싶을 때 유용해요. 이 옵션을 쓰면 Exchange가 끝나기 전까지는 채널이 연결 풀로 반환되지 않고, disconnect 옵션이 true로 설정돼 있으면 연결이 끊겨요. 재사용되는 채널은 CamelNettyChannel 키를 가진 exchange 프로퍼티로 Exchange에 저장돼서, 라우팅 중에 채널을 꺼내 쓸 수도 있어요. | false | boolean |
| sync (common) | 엔드포인트를 one-way(false)로 쓸지 request-response(true)로 쓸지 정하는 설정이에요. | true | boolean |
| tcpNoDelay (common) | TCP 프로토콜 성능을 개선하기 위한 설정이에요. | true | boolean |
| matchOnUriPrefix (consumer) | 정확히 일치하는 consumer를 못 찾으면 URI 접두어로 대상 consumer를 찾아 볼지 여부예요. | false | boolean |
| muteException (consumer) | 활성화하면 consumer 쪽에서 Exchange 처리가 실패했을 때 응답 본문에 예외의 스택 트레이스가 담기지 않아요. | true | boolean |
| send503whenSuspended (consumer) | consumer가 중단(suspend)됐을 때 HTTP 상태 코드 503을 돌려줄지 여부예요. 이 옵션이 false면 consumer가 중단됐을 때 Netty Acceptor가 언바인드돼서 클라이언트가 더 이상 연결할 수 없어요. | true | boolean |
| backlog (consumer (advanced)) | netty consumer(서버)의 백로그(backlog)를 설정할 수 있게 해 줘요. 백로그는 OS에 따라 다른 최선 노력(best effort)에 불과하다는 점에 유의하세요. 200, 500, 1000 같은 값을 설정하면 TCP 스택에 accept 큐의 길이를 알려 줘요. 이 옵션을 설정하지 않으면 백로그는 OS 설정에 따라요. | int | |
| bootstrapConfiguration (consumer (advanced)) | 이 엔드포인트를 설정하려고 커스텀으로 구성된 NettyServerBootstrapConfiguration을 사용해요. URI로 설정하면(예: \{code bootstrapConfiguration=#myBean}) 그 프로퍼티들이 NettyHttpComponent.createEndpoint()에 의해 엔드포인트 설정으로 병합돼요. 참고: 이 파라미터는 컴포넌트가 URI로 해석하고, 이 세터로 프로그래밍 방식으로 설정하면 적용되지 않아요. | NettyServerBootstrapConfiguration | |
| bossCount (consumer (advanced)) | netty가 nio 모드로 동작할 때는 Netty의 기본 bossCount 파라미터(1)를 써요. 이 옵션으로 Netty의 기본 bossCount를 재정의할 수 있어요. | 1 | int |
| bossGroup (consumer (advanced)) | NettyEndpoint 전반에서 서버 측 새 연결을 처리하는 데 쓸 BossGroup을 설정해요. | EventLoopGroup | |
| bridgeErrorHandler (consumer (advanced)) | 컨슈머를 Camel 라우팅 에러 핸들러(Error Handler)에 브리지할 수 있게 해 줘요. 즉, Camel 컨슈머가 들어오는 메시지를 집어 올리는 동안 등에서 예외가 발생하면(가능한 경우), 그 예외를 메시지로 처리해서 라우팅 에러 핸들러가 다루게 돼요. 중요: 이것은 서드파티 컴포넌트가 예외가 던져졌을 때 Camel에 알릴 수 있도록 허용하는 경우에만 가능해요. 일부 컴포넌트는 내부에서만 처리하기 때문에 bridgeErrorHandler를 쓸 수 없어요. 다른 상황에서는 Camel 컴포넌트를 개선해서 서드파티 컴포넌트에 연결(hook)해 이를 가능하게 만들 수도 있어요. 기본으로 컨슈머는 org.apache.camel.spi.ExceptionHandler로 예외를 처리하는데, WARN 또는 ERROR 레벨로 로그를 남기고 무시해요. | false | boolean |
| chunkedMaxContentLength (consumer (advanced)) | Netty HTTP 서버가 받는 chunked 프레임 하나당 최대 콘텐츠 길이(바이트)예요. | 1048576 | int |
| compression (consumer (advanced)) | 클라이언트가 HTTP 헤더로 지원을 밝히면 Netty HTTP 서버에서 gzip/deflate 압축을 쓸 수 있게 해 줘요. | false | boolean |
| disconnectOnNoReply (consumer (advanced)) | sync가 활성화돼 있으면, 돌려줄 응답(reply)이 없을 때 NettyConsumer가 연결을 끊을지 이 옵션이 결정해요. | true | boolean |
| exceptionHandler (consumer (advanced)) | 컨슈머가 커스텀 ExceptionHandler를 쓰게 할 수 있어요. bridgeErrorHandler 옵션이 활성화되어 있으면 이 옵션은 사용되지 않는다는 점에 주의하세요. 기본으로 컨슈머는 예외를 처리하는데, WARN 또는 ERROR 레벨로 로그를 남기고 무시해요. | ExceptionHandler | |
| exchangePattern (consumer (advanced)) | |||
| 컨슈머가 교환(exchange)을 만들 때 교환 패턴을 설정해요. |
Enum values:
-
InOnly
-
InOut
| | ExchangePattern | | httpMethodRestrict (consumer (advanced)) | Netty HTTP consumer에서 특정 HTTP 메서드를 막아요. 쉼표로 구분해서 여러 개를 지정할 수 있어요. | | String | | logWarnOnBadRequest (consumer (advanced)) | HTTP 요청 디코딩이 실패해서 HTTP 상태 400(bad request)이 돌아갈 때 Netty HTTP 서버가 WARN을 남길지 여부예요. | true | boolean | | mapHeaders (consumer (advanced)) | 이 옵션이 활성화되면 Netty에서 Camel Message로 바인딩할 때 헤더도 함께 매핑해요(예: Camel Message에 헤더로도 추가돼요). 이 기능을 끄려면 이 옵션을 꺼요. 헤더는 org.apache.camel.component.netty.http.NettyHttpMessage 메시지에서 getHttpRequest() 메서드로 여전히 접근할 수 있는데, 이 메서드는 Netty HTTP 요청인 io.netty.handler.codec.http.HttpRequest 인스턴스를 돌려줘요. | true | boolean | | maxChunkSize (consumer (advanced)) | 콘텐츠 또는 각 청크의 최대 길이예요. 콘텐츠 길이(또는 각 청크의 길이)가 이 값을 넘으면 콘텐츠나 청크가 최대 maxChunkSize 길이의 io.netty.handler.codec.http.HttpContents 여러 개로 나뉘어요. 자세한 내용은 io.netty.handler.codec.http.HttpObjectDecoder를 참고하세요. | 8192 | int | | maxHeaderSize (consumer (advanced)) | 모든 헤더의 최대 길이예요. 각 헤더 길이의 합이 이 값을 넘으면 io.netty.handler.codec.TooLongFrameException이 발생해요. | 8192 | int | | maxInitialLineLength (consumer (advanced)) | 초기 라인(initial line)의 최대 길이예요(예: \{code GET / HTTP/1.0} 또는 \{code HTTP/1.0 200 OK}). 초기 라인 길이가 이 값을 넘으면 TooLongFrameException이 발생해요. 자세한 내용은 io.netty.handler.codec.http.HttpObjectDecoder를 참고하세요. | 4096 | int | | nettyServerBootstrapFactory (consumer (advanced)) | 커스텀 NettyServerBootstrapFactory를 사용해요. | | NettyServerBootstrapFactory | | nettySharedHttpServer (consumer (advanced)) | 공유 Netty HTTP 서버를 사용해요. 자세한 내용은 Netty HTTP Server Example을 참고하세요. | | NettySharedHttpServer | | noReplyLogLevel (consumer (advanced)) |
sync가 활성화돼 있으면, 돌려줄 응답이 없음을 로그로 남길 때 NettyConsumer가 쓸 로깅 레벨을 이 옵션이 결정해요.
Enum values:
-
TRACE
-
DEBUG
-
INFO
-
WARN
-
ERROR
-
OFF
| WARN | LoggingLevel | | serverClosedChannelExceptionCaughtLogLevel (consumer (advanced)) |
서버(NettyConsumer)가 java.nio.channels.ClosedChannelException을 잡으면 이 로깅 레벨로 로그를 남겨요. 클라이언트가 갑자기 연결을 끊어서 Netty 서버에 closed 예외가 쏟아지는 상황에서 그 예외 로그를 피하려고 쓰는 옵션이에요.
Enum values:
-
TRACE
-
DEBUG
-
INFO
-
WARN
-
ERROR
-
OFF
| DEBUG | LoggingLevel | | serverExceptionCaughtLogLevel (consumer (advanced)) |
서버(NettyConsumer)가 예외를 잡으면 이 로깅 레벨로 로그를 남겨요.
Enum values:
-
TRACE
-
DEBUG
-
INFO
-
WARN
-
ERROR
-
OFF
| WARN | LoggingLevel | | serverInitializerFactory (consumer (advanced)) | 커스텀 ServerInitializerFactory를 사용해요. | | ServerInitializerFactory | | traceEnabled (consumer (advanced)) | 이 Netty HTTP consumer에서 HTTP TRACE를 활성화할지 지정해요. 기본으로 TRACE는 꺼져 있어요. | false | boolean | | urlDecodeHeaders (consumer (advanced)) | 이 옵션이 활성화되면 Netty에서 Camel Message로 바인딩할 때 헤더 값이 URL 디코딩돼요(예: %20은 공백 문자가 돼요). 이 옵션은 기본 org.apache.camel.component.netty.http.NettyHttpBinding이 쓰는 옵션이라서, 커스텀 org.apache.camel.component.netty.http.NettyHttpBinding을 직접 구현한다면 이 옵션에 맞춰 헤더를 디코딩해야 해요. | false | boolean | | usingExecutorService (consumer (advanced)) | 같은 채널에서 이벤트가 순서대로 처리되도록 순차(ordered) 스레드 풀을 쓸지 여부예요. | true | boolean | | connectTimeout (producer) | 소켓 연결을 사용할 수 있을 때까지 기다리는 시간이에요. 값은 밀리초 단위예요. | 10000 | int | | cookieHandler (producer) | HTTP 세션을 유지하려고 cookie handler를 설정해요. | | CookieHandler | | requestTimeout (producer) | 원격 서버를 호출할 때 Netty producer에 타임아웃을 둘 수 있게 해 줘요. 기본으로는 타임아웃을 쓰지 않아요. 값은 밀리초 단위라서 예컨대 30000은 30초예요. requestTimeout은 Netty의 ReadTimeoutHandler를 써서 타임아웃을 트리거해요. | | long | | throwExceptionOnFailure (producer) | 원격 서버의 실패 응답에 HttpOperationFailedException을 던지지 않도록 끄는 옵션이에요. 이렇게 하면 HTTP 상태 코드와 무관하게 모든 응답을 받을 수 있어요. | true | boolean | | clientInitializerFactory (producer (advanced)) | 커스텀 ClientInitializerFactory를 사용해요. | | ClientInitializerFactory | | lazyChannelCreation (producer (advanced)) | Camel producer가 시작될 때 원격 서버가 아직 떠 있지 않아도 예외를 피하도록 채널을 lazy하게 만들 수 있어요. | true | boolean | | lazyStartProducer (producer (advanced)) | producer를 lazy(첫 메시지 시점)로 시작할지 여부예요. lazy 시작을 쓰면 producer가 시작 중 실패해서 라우트 시작이 실패하는 상황에서도 CamelContext와 라우트를 시작할 수 있고, 시작 실패 처리를 Camel의 라우팅 에러 핸들러로 넘길 수 있어요. 다만 첫 메시지를 처리하는 시점에 producer를 만들고 시작하는 데 시간이 조금 걸려서 전체 처리 시간이 길어질 수 있다는 점은 유의하세요. | false | boolean | | okStatusCodeRange (producer (advanced)) | 성공 응답으로 간주할 상태 코드예요. 값은 경계를 포함해요. 여러 범위를 쉼표로 구분해 정의할 수 있어요(예: 200-204,209,301-304). 각 범위는 단일 숫자이거나 대시를 포함한 from-to 형태여야 해요. 기본 범위는 200-299예요. | 200-299 | String | | producerPoolBlockWhenExhausted (producer (advanced)) | blockWhenExhausted 설정 속성값을 지정해요. 풀이 고갈돼서(활성 객체의 최대 수에 도달해서) borrowObject() 메서드가 호출됐을 때 블록할지 결정해요. | true | boolean | | producerPoolEnabled (producer (advanced)) | producer 풀을 사용할지 여부예요. 중요: 이걸 끄면 request/reply를 하고 있을 때도 producer가 하나의 공유 연결을 써요. 그러면 응답이 순서대로 돌아오지 않을 때 응답이 뒤섞이는 잠재적 문제가 생겨요. 그래서 요청과 응답 메시지 양쪽에 correlation id를 담아서, Camel에서 메시지를 계속 처리하는 콜백에 응답을 제대로 연결 지을 수 있어야 해요. 이러려면 correlation manager로 NettyCamelStateCorrelationManager를 구현하고 correlationManager 옵션으로 설정해야 해요. 자세한 내용은 correlationManager 옵션도 참고하세요. | true | boolean | | producerPoolMaxIdle (producer (advanced)) | 풀에 둘 수 있는 idle 인스턴스 수의 상한을 설정해요. | 100 | int | | producerPoolMaxTotal (producer (advanced)) | 주어진 시점에 풀이 할당할 수 있는 객체 수(클라이언트에 대여 중이거나 대여를 기다리며 idle인)의 상한을 설정해요. 제한 없음은 음수로 설정해요. 재시도를 수행할 때처럼 producer를 만들 공간이 풀에 필요하니 이 값을 너무 낮게(예: 1) 잡지 않도록 주의하세요. producerPoolBlockWhenExhausted 옵션은 기본값이 true라서 공간이 없으면 풀이 블록하고, 그러면 애플리케이션이 멈출(hang) 수 있다는 점도 유의하세요. | -1 | int | | producerPoolMaxWait (producer (advanced)) | 풀이 고갈됐고 producerPoolBlockWhenExhausted가 true일 때 borrowObject() 메서드가 예외를 던지기 전까지 블록하는 최대 시간(밀리초)을 설정해요. 0보다 작으면 borrowObject() 메서드가 무기한 블록할 수 있어요. | -1 | long | | producerPoolMinEvictableIdle (producer (advanced)) | idle 객체 이벤터(evictor)의 제거 대상이 되기 전까지 객체가 풀에서 idle로 있어도 되는 최소 시간(밀리초)을 설정해요. | 300000 | long | | producerPoolMinIdle (producer (advanced)) | 이벤터 스레드(동작 중이라면)가 새 객체를 만들기 전에 producer 풀에 있어도 되는 최소 인스턴스 수를 설정해요. | | int | | useRelativePath (producer (advanced)) | HTTP 요청에서 상대 경로를 쓸지 설정해요. | true | boolean | | allowSerializedHeaders (advanced) | transferExchange가 true일 때 TCP에서만 쓰여요. true로 설정하면 헤더와 프로퍼티의 직렬화 가능 객체가 exchange에 추가돼요. 그렇지 않으면 Camel이 직렬화 불가능 객체를 제외하고 WARN 레벨로 로그를 남겨요. | false | boolean | | channelGroup (advanced) | 명시적인 ChannelGroup을 사용해요. | | ChannelGroup | | configuration (advanced) | 이 엔드포인트를 설정하려고 커스텀으로 구성된 NettyHttpConfiguration을 사용해요. | | NettyHttpConfiguration | | disableStreamCache (advanced) | Netty HttpRequest#getContent()나 HttpResponset#getContent()에서 온 원시 입력 스트림을 캐시할지 여부를 정해요(Camel이 스트림을 읽어 가벼운 메모리 기반 Stream caching에 넣어요). 기본적으로 Camel은 Netty 입력 스트림을 캐시해서 여러 번 읽을 수 있게 하고, 스트림에서 모든 데이터를 가져올 수 있도록 보장해요. 다만 원시 스트림에 직접 접근해야 할 때, 예를 들어 파일이나 다른 영구 저장소로 바로 스트리밍할 때는 이 옵션을 true로 설정할 수 있어요. 이 옵션을 켜면 기본 상태로는 Netty 스트림을 여러 번 읽을 수 없고, Netty 원시 스트림의 reader 인덱스를 수동으로 리셋해야 한다는 점에 유의하세요. 또 Netty는 Netty HTTP 서버/HTTP 클라이언트가 처리를 마치면 Netty 스트림을 자동으로 닫아요. 그래서 비동기 라우팅 엔진이 동작 중이면 org.apache.camel.Exchange를 계속 라우팅하려는 비동기 스레드가 Netty가 닫아 버린 스트림을 읽지 못할 수 있어요. | false | boolean | | headerFilterStrategy (advanced) | 헤더를 걸러 내려고 커스텀 org.apache.camel.spi.HeaderFilterStrategy를 사용해요. | | HeaderFilterStrategy | | nativeTransport (advanced) | NIO 대신 네이티브 트랜스포트를 쓸지 여부예요. 네이티브 트랜스포트는 호스트 운영체제를 활용하고 일부 플랫폼에서만 지원돼요. 사용 중인 호스트 운영체제용 netty JAR을 추가해야 해요. 자세한 내용은 http://netty.io/wiki/native-transports.html를 참고하세요. | false | boolean | | nettyHttpBinding (advanced) | Netty와 Camel Message API 사이의 바인딩에 커스텀 org.apache.camel.component.netty.http.NettyHttpBinding을 사용해요. | | NettyHttpBinding | | options (advanced) | option. 접두어로 추가 netty 옵션을 설정할 수 있게 해 줘요. 예를 들면 option.child.keepAlive=false죠. 쓸 수 있는 옵션은 Netty 문서를 참고하세요. option. 접두어를 쓰는 멀티 밸류 옵션이에요. | | Map | | receiveBufferSize (advanced) | 인바운드 통신에 쓸 TCP/UDP 버퍼 크기예요. 단위는 바이트예요. | 65536 | int | | receiveBufferSizePredictor (advanced) | 버퍼 크기 예측기(predictor)를 설정해요. 자세한 내용은 Jetty 문서와 이 메일 스레드를 참고하세요. | | int | | sendBufferSize (advanced) | 아웃바운드 통신에 쓸 TCP/UDP 버퍼 크기예요. 단위는 바이트예요. | 65536 | int | | shutdownTimeout (advanced) | 종료 대기(shutdown await) 타임아웃(밀리초)이에요. | 100 | int | | synchronous (advanced) | 동기(synchronous) 처리를 엄격하게 쓸지 설정해요. | false | boolean | | transferException (advanced) | 활성화하면 consumer 쪽에서 Exchange 처리가 실패했을 때, 발생한 예외를 application/x-java-serialized-object 콘텐츠 타입으로 직렬화해서 응답에 담아 돌려보내요. producer 쪽에서는 그 예외를 역직렬화해서 HttpOperationFailedException 대신 그대로 던져요. 발생한 예외는 직렬화 가능해야 해요. 기본적으로 꺼져 있어요. 이 옵션을 켜면 Java가 요청으로 들어온 데이터를 역직렬화한다는 점을 유의하세요. 잠재적인 보안 위험이 될 수 있어요. | false | boolean | | transferExchange (advanced) | TCP에서만 쓰여요. 본문만이 아니라 exchange 전체를 와이어로 전송할 수 있어요. 전송되는 필드는 In body, Out body, fault body, In headers, Out headers, fault headers, exchange 프로퍼티, exchange 예외예요. 객체가 직렬화 가능해야 해요. Camel은 직렬화 불가능 객체를 제외하고 WARN 레벨로 로그를 남겨요. | false | boolean | | unixDomainSocketPath (advanced) | inet 소켓 대신 쓸 유닉스 도메인 소켓 경로예요. host와 port 파라미터는 쓰이지 않지만 필수예요. 더미 값으로 채워도 괜찮아요. 반드시 nativeTransport=true, clientMode=false와 함께 써야 해요. | | String | | workerCount (advanced) | netty가 nio 모드로 동작할 때는 Netty의 기본 workerCount 파라미터(cpu_core_threads x 2)를 써요. 이 옵션으로 Netty의 기본 workerCount를 재정의할 수 있어요. | | int | | workerGroup (advanced) | boss 스레드 풀로 명시적인 EventLoopGroup을 사용해요. 예컨대 여러 consumer나 producer가 스레드 풀을 공유하게 할 때죠. 기본적으로 각 consumer와 producer는 2 x CPU 코어 수만큼의 스레드를 가진 자기만의 워커 풀을 가져요. | | EventLoopGroup | | decoders (codec) | 사용할 디코더 목록이에요. 콤마로 구분한 값을 가진 String을 쓸 수 있고, 그 값들은 레지스트리에서 찾아 보게 돼요. Camel이 찾아 보도록 하려면 값을 # 접두어로 시작해야 한다는 점만 기억하세요. | | String | | encoders (codec) | 사용할 인코더 목록이에요. 콤마로 구분한 값을 가진 String을 쓸 수 있고, 그 값들은 레지스트리에서 찾아 보게 돼요. Camel이 찾아 보도록 하려면 값을 # 접두어로 시작해야 한다는 점만 기억하세요. | | String | | deserializationFilter (security) | Content-Type이 application/x-java-serialized-object인 HTTP 응답에서 Java 객체를 역직렬화할 때 적용할 ObjectInputFilter 패턴(jdk.serialFilter 문법)을 설정해요. transferException이 활성화돼 있고 원격 쪽이 직렬화된 예외를 돌려줄 때 쓰여요. 설정하지 않으면 JVM 시스템 프로퍼티 jdk.serialFilter로 설정된 필터가 있을 때 그걸 쓰고, 없으면 java.net.을 거부하고 java., javax., org.apache.camel. 패키지를 허용하는 보수적인 기본 필터가 적용돼요. | | String | | enabledProtocols (security) | SSL을 사용할 때 활성화할 프로토콜이에요. | TLSv1.2,TLSv1.3 | String | | hostnameVerification (security) | SSLEngine에서 호스트명 검증(hostname verification)을 켜거나 끕니다. | false | boolean | | keyStoreFormat (security) | 페이로드 암호화에 쓸 키스토어 포맷이에요. 설정하지 않으면 JKS가 기본값이에요. | | String | | keyStoreResource (security) | 암호화에 쓸 클라이언트 측 인증서 키스토어예요. 기본으로 classpath에서 불러오지만, classpath:, file:, http: 접두어를 붙여서 다른 시스템에서 리소스를 불러올 수 있어요. | | String | | needClientAuth (security) | SSL을 사용할 때 서버가 클라이언트 인증을 요구할지 설정해요. | false | boolean | | oauthProfile (security) | 들어오는 Authorization: Bearer 토큰을 검증할 OAuth 프로파일 이름이에요. 설정하면 라우트가 처리되기 전에 요청을 인증해요. OAuthTokenValidationFactory가 필요하고, camel-oauth가 기본 구현을 제공해요. usingExecutorService=true와 sync=true(기본값)를 요구하고, nettySharedHttpServer에서는 지원하지 않아요. | | String | | passphrase (security) | keyStore와 trustStore에 쓸 비밀번호예요. 두 리소스에 같은 비밀번호를 설정해야 해요. | | String | | securityConfiguration (security) | 보안 웹 리소스를 설정하려고 org.apache.camel.component.netty.http.NettyHttpSecurityConfiguration을 참조해요. | | NettyHttpSecurityConfiguration | | securityOptions (security) | 맵의 키/값 쌍으로 NettyHttpSecurityConfiguration을 설정해요. securityConfiguration 접두어를 쓰는 멀티 밸류 옵션이에요. | | Map | | securityProvider (security) | 페이로드 암호화에 쓸 보안 프로바이더예요. 설정하지 않으면 SunX509가 기본값이에요. | | String | | ssl (security) | 이 엔드포인트에 SSL 암호화를 적용할지 정하는 설정이에요. | false | boolean | | sslClientCertHeaders (security) | 활성화하고 SSL 모드일 때 Netty consumer가 subject 이름, issuer 이름, 일련번호, 유효 기간 같은 클라이언트 인증서 정보를 담은 헤더로 Camel 메시지를 풍부하게(enrich) 만들어요. | false | boolean | | sslContextParameters (security) | SSLContextParameters로 보안을 설정해요. | | SSLContextParameters | | sslHandler (security) | SSL 핸들러를 돌려주는 데 쓸 수 있는 클래스에 대한 참조예요. | | SslHandler | | trustStoreResource (security) | 암호화에 쓸 서버 측 인증서 키스토어예요. 기본으로 classpath에서 불러오지만, classpath:, file:, http: 접두어를 붙여서 다른 시스템에서 리소스를 불러올 수 있어요. | | String |
메시지 헤더 (Message Headers)
Netty HTTP 컴포넌트가 지원하는 메시지 헤더는 아래와 같아요:
| Name | Description | Default | Type |
|---|---|---|---|
CamelHttpAuthentication (common) Constant: HTTP_AUTHENTICATION |
사용자가 HTTP Basic으로 인증됐다면 값이 Basic인 이 헤더가 추가돼요. | String | |
Content-Type (common) Constant: CONTENT_TYPE |
HTTP 본문의 content-type을 설정해요. 예: text/plain; charset=UTF-8. | String | |
connection (common) Constant: CONNECTION |
쓸 HTTP 헤더 connection의 값이에요. | String | |
CamelNettyCloseChannelWhenComplete (common) Constant: NETTY_CLOSE_CHANNEL_WHEN_COMPLETE |
처리가 끝난 뒤 채널을 닫아야 하는지 나타내요. | Boolean | |
CamelHttpResponseCode (common) Constant: HTTP_RESPONSE_CODE |
쓸 HTTP 상태 코드를 설정할 수 있게 해 줘요. 기본으로 성공은 200, 실패는 500을 써요. | Integer | |
CamelHttpProtocolVersion (common) Constant: HTTP_PROTOCOL_VERSION |
HTTP 프로토콜의 버전이에요. | HTTP/1.1 | String |
CamelHttpMethod (common) Constant: HTTP_METHOD |
쓰이는 HTTP 메서드예요. GET, POST, TRACE 등이에요. | GET | String |
CamelHttpQuery (common) Constant: HTTP_QUERY |
쿼리 파라미터예요. foo=bar&beer=yes 같은 형태예요. | String | |
CamelHttpPath (common) Constant: HTTP_PATH |
엔드포인트 설정을 덮어쓰는 String 값으로 URI context-path와 쿼리 파라미터를 지정할 수 있게 해 줘요. 같은 원격 http 서버를 호출하는 같은 producer를 재사용하면서 동적인 context-path와 쿼리 파라미터를 쓸 수 있어요. | String | |
CamelHttpRawQuery (common) Constant: HTTP_RAW_QUERY |
쿼리 파라미터예요. foo=bar&beer=yes 같은 형태예요. consumer에 도착한 그대로(URL 디코딩 전)의 원시 형태로 저장돼요. | String | |
CamelHttpUrl (common) Constant: HTTP_URL |
프로토콜, host, port 등을 포함한 URL이에요: http://0.0.0.0:8080/myapp. | String | |
CamelHttpCharacterEncoding (common) Constant: HTTP_CHARACTER_ENCODING |
content-type 헤더에서 온 문자셋이에요. | String | |
CamelHttpUri (common) Constant: HTTP_URI |
프로토콜, host, port 등을 제외한 URI예요: /myapp. | String | |
CamelNettyChannelHandlerContext (common) Constant: NETTY_CHANNEL_HANDLER_CONTEXT |
채널 핸들러 컨텍스트예요. | ChannelHandlerContext | |
CamelNettyRemoteAddress (common) Constant: NETTY_REMOTE_ADDRESS |
원격 주소예요. | SocketAddress | |
CamelNettyLocalAddress (common) Constant: NETTY_LOCAL_ADDRESS |
로컬 주소예요. | SocketAddress | |
CamelNettySSLSession (common) Constant: NETTY_SSL_SESSION |
SSL 세션이에요. | SSLSession | |
CamelNettySSLClientCertSubjectName (common) Constant: NETTY_SSL_CLIENT_CERT_SUBJECT_NAME |
SSL 클라이언트 인증서의 subject 이름이에요. | String | |
CamelNettySSLClientCertIssuerName (common) Constant: NETTY_SSL_CLIENT_CERT_ISSUER_NAME |
SSL 클라이언트 인증서의 issuer 이름이에요. | String | |
CamelNettySSLClientCertSerialNumber (common) Constant: NETTY_SSL_CLIENT_CERT_SERIAL_NO |
SSL 클라이언트 인증서의 일련번호(serial number)예요. | String | |
CamelNettySSLClientCertNotBefore (common) Constant: NETTY_SSL_CLIENT_CERT_NOT_BEFORE |
SSL 클라이언트 인증서의 not before(유효 시작) 날짜예요. | Date | |
CamelNettySSLClientCertNotAfter (common) Constant: NETTY_SSL_CLIENT_CERT_NOT_AFTER |
SSL 클라이언트 인증서의 not after(유효 만료) 날짜예요. | Date | |
CamelNettyRequestTimeout (common) Constant: NETTY_REQUEST_TIMEOUT |
읽기 타임아웃이에요. | Long | |
CamelNettyChannel (common) Constant: NETTY_CHANNEL |
Netty Channel 객체예요. | Channel |
사용법 (Usage)
OAuth Bearer 토큰 검증 (OAuth Bearer token validation)
Netty HTTP consumer는 oauthProfile 엔드포인트 옵션을 설정해서 들어오는 Authorization: Bearer 토큰을 검증할 수 있어요. 프로파일은 Camel의 OAuthTokenValidationFactory SPI로 해석돼요. camel-oauth 컴포넌트가 단독(standalone) Camel 애플리케이션용 기본 구현을 제공해요. 검증 프로파일 옵션과 프로덕션 강화(기대하는 issuer와 audience, JWKS용 HTTPS, OIDC discovery, introspection 엔드포인트)는 이 컴포넌트 문서를 참고하세요. 런타임이 자체 구현을 제공할 수도 있어요.
참고
oauthProfile을 설정했는데OAuthTokenValidationFactory를 쓸 수 없으면 라우트 시작이 실패해요. 기본 프로바이더로는camel-oauth를 추가하거나, 플랫폼 통합이 제공하는 런타임 전용 프로바이더를 포함하세요.
-
Java
-
XML
-
YAML
from("netty-http:http://0.0.0.0:8080/secure?oauthProfile=myprofile")
.to("direct:businessLogic");
<route>
<from uri="netty-http:http://0.0.0.0:8080/secure?oauthProfile=myprofile"/>
<to uri="direct:businessLogic"/>
</route>
- route:
from:
uri: netty-http:http://0.0.0.0:8080/secure
parameters:
oauthProfile: myprofile
steps:
- to:
uri: direct:businessLogic
oauthProfile을 설정하면 정적 프로파일 구성이 라우트 시작 시점에 해석되고 검증돼요. OAuth 프로파일 프로퍼티를 바꾸면 효력이 생기기 전에 라우트나 Camel 컨텍스트를 재시작해야 해요. Bearer 토큰이 없거나 유효하지 않은 요청은 라우트가 처리되기 전에 HTTP 401로 거부돼요. 자격 증명이 없으면 WWW-Authenticate: Bearer 응답 헤더를 받고, 유효하지 않은 토큰은 WWW-Authenticate: Bearer error="invalid_token"을 받아요. Authorization 헤더가 잘못된 형태면 HTTP 400과 WWW-Authenticate: Bearer error="invalid_request"로 거부돼요. 토큰 검증 인프라 장애는 HTTP 503으로 거부돼요. 유효한 토큰이라면 토큰 검증 결과가 CamelOAuthTokenValidationResult exchange 프로퍼티로 exchange에 저장돼요. 원시 Authorization 헤더는 라우트가 호출되기 전에 제거돼요.
OAuth 검증은 JWKS 갱신, OIDC discovery, 토큰 introspection 과정에서 identity-provider 인프라로 블로킹 호출을 할 수 있어요. 그래서 netty-http consumer는 usingExecutorService=false일 때 oauthProfile을 거부해요. 검증이 Netty event-loop 스레드에서 돌지 않도록 usingExecutorService=true를 유지하세요. 여러 consumer가 같은 host와 port를 공유할 때는 첫 consumer가 실제 파이프라인 구성을 결정해요. 그래서 어떤 엔드포인트가 먼저 usingExecutorService=false로 공유 서버를 초기화했다면, oauthProfile을 쓰는 consumer도 시작 시점에 실패해요. oauthProfile 옵션은 공유 파이프라인이 엔드포인트 executor 서비스를 쓰지 않기 때문에 nettySharedHttpServer에서는 지원되지 않아요. oauthProfile 옵션은 토큰 검증 거부 응답을 클라이언트에 돌려줄 수 있도록 sync=true(기본값)도 요구해요.
참고 자동
OPTIONS처리는 OAuth 검증보다 먼저 돌아가요. 브라우저 CORS preflight 요청을 포함한OPTIONS요청은, 엔드포인트가httpMethodRestrict로OPTIONS메서드에 한정되어 있지 않다면 인증 없이Allow헤더로 응답받고 라우트도 호출되지 않아요.oauthProfile이 설정돼 있으면 다른 모든 HTTP 메서드는 인증을 거쳐요.
Netty 타입 접근 (Access to Netty types)
이 컴포넌트는 Exchange의 메시지 구현체로 org.apache.camel.component.netty.http.NettyHttpMessage를 써요. 덕분에 최종 사용자는 필요할 때 아래처럼 원본 Netty request/response 인스턴스에 접근할 수 있어요. 다만 원본 응답이 언제나 접근 가능한 것은 아니라는 점에 유의하세요.
Java 전용: 기반 Netty HTTP 요청 객체에 접근하기
io.netty.handler.codec.http.HttpRequest request = exchange.getIn(NettyHttpMessage.class).getHttpRequest();
HTTP Basic 인증 사용 (Using HTTP Basic Authentication)
Netty HTTP consumer는 아래처럼 사용할 보안 realm 이름을 지정해서 HTTP basic 인증을 지원해요
-
Java
-
XML
-
YAML
from("netty-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=someRealm")
.to("direct:secured");
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=someRealm"/>
<to uri="direct:secured"/>
</route>
- route:
from:
uri: netty-http:http://0.0.0.0:{{port}}/foo
parameters:
securityConfiguration.realm: someRealm
steps:
- to:
uri: direct:secured
basic 인증을 켜려면 realm 이름이 필수예요. 기본으로 JAAS 기반 인증자가 쓰이는데, 지정한 realm 이름(위 예에서는 _someRealm_)을 사용하고 그 realm의 JAAS realm과 JAAS \{{LoginModule}}s를 인증에 사용해요.
웹 리소스에 ACL 지정 (Specifying ACL on web resources)
org.apache.camel.component.netty.http.SecurityConstraint로 웹 리소스에 제약을 정의할 수 있어요. 그리고 org.apache.camel.component.netty.http.SecurityConstraintMapping이 기본 제공되어서 역할(roles)과 함께 inclusions와 exclusions를 쉽게 정의할 수 있어요.
예를 들어 아래 XML DSL처럼 constraint 빈을 정의해요:
<bean id="constraint" class="org.apache.camel.component.netty.http.SecurityConstraintMapping">
<!-- inclusions defines url -> roles restrictions -->
<!-- a * should be used for any role accepted (or even no roles) -->
<property name="inclusions">
<map>
<entry key="/*" value="*"/>
<entry key="/admin/*" value="admin"/>
<entry key="/guest/*" value="admin,guest"/>
</map>
</property>
<!-- exclusions is used to define public urls, which requires no authentication -->
<property name="exclusions">
<set>
<value>/public/*</value>
</set>
</property>
</bean>
위 constraint는 이렇게 동작하도록 정의했어요:
-
/* 접근은 제한되고 어떤 역할이든 허용돼요(사용자가 역할이 없어도 마찬가지예요).
-
/admin/* 접근에는 admin 역할이 필요해요.
-
/guest/* 접근에는 admin 또는 guest 역할이 필요해요.
-
/public/* 접근은 exclusion이라서 인증이 필요 없고, 로그인 없이 누구나 접근할 수 있는 공개 영역이에요.
inclusion의 roles는 역할 이름을 쉼표로 구분한 목록이에요. 사용자의 역할 중 하나가 나열된 이름 중 하나와 같으면 그 역할에 속한 것으로 봐요. 비교는 대소문자를 구분하고, 각 이름 주변의 공백과 빈 항목은 무시해요. * 값은 어떤 역할이든 허용해요.
이 constraint를 쓰려면 아래처럼 bean id만 참조하면 돼요:
-
Java
-
XML
-
YAML
from("netty-http:http://0.0.0.0:{{port}}/foo?matchOnUriPrefix=true&securityConfiguration.realm=someRealm&securityConfiguration.securityConstraint=#constraint")
.to("direct:secured");
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?matchOnUriPrefix=true&securityConfiguration.realm=someRealm&securityConfiguration.securityConstraint=#constraint"/>
<to uri="direct:secured"/>
</route>
- route:
from:
uri: netty-http:http://0.0.0.0:{{port}}/foo
parameters:
matchOnUriPrefix: true
securityConfiguration.realm: someRealm
securityConfiguration.securityConstraint: "#constraint"
steps:
- to:
uri: direct:secured
예제 (Examples)
아래 라우트에서는 Netty HTTP를 HTTP 서버로 써서 하드코딩된 "Bye World" 메시지를 돌려줘요.
-
Java
-
XML
-
YAML
from("netty-http:http://0.0.0.0:8080/foo")
.transform().constant("Bye World");
<route>
<from uri="netty-http:http://0.0.0.0:8080/foo"/>
<transform>
<constant>Bye World</constant>
</transform>
</route>
- route:
from:
uri: netty-http:http://0.0.0.0:8080/foo
steps:
- transform:
constant: "Bye World"
그리고 이 HTTP 서버를 Camel에서도 호출할 수 있어요. 아래처럼 ProducerTemplate을 쓰면 돼요:
Java 전용: ProducerTemplate 테스트 API
String out = template.requestBody("netty-http:http://0.0.0.0:8080/foo", "Hello World", String.class);
System.out.println(out);
그러면 출력으로 _"Bye World"_를 받아요.
Netty가 와일드카드로 매칭하게 하려면? (How do I let Netty match wildcards?)
기본적으로 Netty HTTP는 정확히 일치하는 uri에만 매칭해요. 하지만 Netty에게 접두어 매칭을 하도록 지시할 수도 있어요. 예를 들면:
-
Java
-
XML
-
YAML
from("netty-http:http://0.0.0.0:8123/foo").to("mock:foo");
<route>
<from uri="netty-http:http://0.0.0.0:8123/foo"/>
<to uri="mock:foo"/>
</route>
- route:
from:
uri: netty-http:http://0.0.0.0:8123/foo
steps:
- to:
uri: mock:foo
위 라우트에서 Netty HTTP는 uri가 정확히 일치할 때만 매칭해요. 그래서
http://0.0.0.0:8123/foo를 입력하면 매칭되지만, http://0.0.0.0:8123/foo/bar로 하면 매칭되지 않아요.
그래서 와일드카드 매칭을 켜고 싶다면 아래처럼 하면 돼요:
-
Java
-
XML
-
YAML
from("netty-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true").to("mock:foo");
<route>
<from uri="netty-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true"/>
<to uri="mock:foo"/>
</route>
- route:
from:
uri: netty-http:http://0.0.0.0:8123/foo
parameters:
matchOnUriPrefix: true
steps:
- to:
uri: mock:foo
이제 Netty는 foo로 시작하는 모든 엔드포인트와 매칭해요.
어떤 엔드포인트든 매칭하려면 이렇게 할 수 있어요:
-
Java
-
XML
-
YAML
from("netty-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");
<route>
<from uri="netty-http:http://0.0.0.0:8123?matchOnUriPrefix=true"/>
<to uri="mock:foo"/>
</route>
- route:
from:
uri: netty-http:http://0.0.0.0:8123
parameters:
matchOnUriPrefix: true
steps:
- to:
uri: mock:foo
같은 포트에서 여러 라우트 사용 (Using multiple routes with same port)
같은 CamelContext 안에서 Netty HTTP 라우트 여러 개가 같은 포트(예: 하나의 io.netty.bootstrap.ServerBootstrap 인스턴스)를 공유할 수 있어요. 이러려면 라우트들이 같은 io.netty.bootstrap.ServerBootstrap 인스턴스를 공유하기 때문에 몇몇 bootstrap 옵션이 라우트들에서 동일해야 해요. 인스턴스는 처음 만들어진 라우트의 옵션으로 설정돼요.
라우트들이 동일하게 설정해야 하는 옵션은 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 설정 클래스에 정의된 모든 옵션이에요. 다른 옵션으로 설정된 라우트가 하나 더 있으면 Camel이 시작 시점에 옵션이 동일하지 않다는 예외를 던져요. 이를 피하려면 모든 옵션을 동일하게 맞춰야 해요.
같은 포트를 공유하는 두 라우트 예제예요.
같은 포트를 공유하는 두 라우트
-
Java
-
XML
-
YAML
from("netty-http:http://0.0.0.0:{{port}}/foo")
.to("mock:foo")
.transform().constant("Bye World");
from("netty-http:http://0.0.0.0:{{port}}/bar")
.to("mock:bar")
.transform().constant("Bye Camel");
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo"/>
<to uri="mock:foo"/>
<transform>
<constant>Bye World</constant>
</transform>
</route>
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/bar"/>
<to uri="mock:bar"/>
<transform>
<constant>Bye Camel</constant>
</transform>
</route>
- route:
from:
uri: netty-http:http://0.0.0.0:{{port}}/foo
steps:
- to:
uri: mock:foo
- transform:
constant: "Bye World"
- route:
from:
uri: netty-http:http://0.0.0.0:{{port}}/bar
steps:
- to:
uri: mock:bar
- transform:
constant: "Bye Camel"
그리고 첫 라우트와 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 옵션이 동일하지 않은, 잘못 설정된 두 번째 라우트 예제도 있어요. 이러면 Camel이 시작 시점에 실패해요.
두 라우트가 같은 포트를 공유하지만, 두 번째 라우트 설정이 틀려서 시작 시점에 실패하는 경우
Java 전용: 시작 실패를 일으키는 설정 오류 예시
from("netty-http:http://0.0.0.0:{{port}}/foo")
.to("mock:foo")
.transform().constant("Bye World");
// we cannot have a 2nd route on the same port with SSL enabled, when the 1st route is NOT
from("netty-http:http://0.0.0.0:{{port}}/bar?ssl=true")
.to("mock:bar")
.transform().constant("Bye Camel");
여러 라우트에서 같은 서버 bootstrap 설정 재사용 (Reusing the same server bootstrap configuration with multiple routes)
공통 서버 bootstrap 옵션을 org.apache.camel.component.netty.NettyServerBootstrapConfiguration 타입 인스턴스 하나에 설정해 두면, Netty HTTP consumer들이 bootstrapConfiguration 옵션으로 그 인스턴스를 참조해서 모든 consumer가 같은 옵션을 재사용하게 할 수 있어요.
<bean id="nettyHttpBootstrapOptions" class="org.apache.camel.component.netty.NettyServerBootstrapConfiguration">
<property name="backlog" value="200"/>
<property name="connectionTimeout" value="20000"/>
<property name="workerCount" value="16"/>
</bean>
그리고 라우트에서는 아래처럼 이 옵션을 참조해요
-
Java
-
XML
-
YAML
from("netty-http:http://0.0.0.0:{{port}}/foo?bootstrapConfiguration=#nettyHttpBootstrapOptions")
.to("direct:foo");
from("netty-http:http://0.0.0.0:{{port}}/bar?bootstrapConfiguration=#nettyHttpBootstrapOptions")
.to("direct:bar");
from("netty-http:http://0.0.0.0:{{port}}/beer?bootstrapConfiguration=#nettyHttpBootstrapOptions")
.to("direct:beer");
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
<to uri="direct:foo"/>
</route>
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/bar?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
<to uri="direct:bar"/>
</route>
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/beer?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
<to uri="direct:beer"/>
</route>
- route:
from:
uri: netty-http:http://0.0.0.0:{{port}}/foo
parameters:
bootstrapConfiguration: "#nettyHttpBootstrapOptions"
steps:
- to:
uri: direct:foo
- route:
from:
uri: netty-http:http://0.0.0.0:{{port}}/bar
parameters:
bootstrapConfiguration: "#nettyHttpBootstrapOptions"
steps:
- to:
uri: direct:bar
- route:
from:
uri: netty-http:http://0.0.0.0:{{port}}/beer
parameters:
bootstrapConfiguration: "#nettyHttpBootstrapOptions"
steps:
- to:
uri: direct:beer
리버스 프록시 구현 (Implementing a reverse proxy)
Netty HTTP 컴포넌트는 리버스 프록시로 동작할 수도 있어요. 이때 Exchange.HTTP_SCHEME, Exchange.HTTP_HOST, Exchange.HTTP_PORT 헤더는 HTTP 요청의 request line에서 받은 절대 URL로 채워져요.
아래는 원본(origin) 서버의 응답을 단순히 대문자로 바꿔 주는 HTTP 프록시 예제예요.
Java 전용: 동적 toD와 Netty 응답 처리를 쓰는 리버스 프록시
from("netty-http:proxy://0.0.0.0:8080")
.toD("netty-http:"
+ "${headers." + Exchange.HTTP_SCHEME + "}://"
+ "${headers." + Exchange.HTTP_HOST + "}:"
+ "${headers." + Exchange.HTTP_PORT + "}")
.process(this::processResponse);
void processResponse(final Exchange exchange) {
final NettyHttpMessage message = exchange.getIn(NettyHttpMessage.class);
final FullHttpResponse response = message.getHttpResponse();
final ByteBuf buf = response.content();
final String string = buf.toString(StandardCharsets.UTF_8);
buf.resetWriterIndex();
ByteBufUtil.writeUtf8(buf, string.toUpperCase(Locale.US));
}
더 알아보기 (Learn more)
- Netty 공식 문서 — 채널, 이벤트 루프, 코덱 등 Netty 자체 개념의 근거예요. bootstrap 옵션이나 파이프라인 동작이 궁금할 때 참고하세요.
- Netty HTTP Server Example — 공유
nettySharedHttpServer와 bootstrap 설정 재사용을 보여 주는 공식 예제예요. - Apache Camel Netty HTTP 컴포넌트 문서 — 이 번역문의 출처예요. 최신 옵션 목록은 여기서 확인하세요.