Netty 란?
Netty는 TCP, UDP 소켓 서버 개발과 같은 네트워크 프로그래밍을 매우 간단하고 능률적으로 만들어주는
비동기 이벤트 드리븐 자바 네트워크 프레임워크다.
왜 사용할까?
성능이 좋다.
- Non-blocking Asynchronous 가 기본
- 적은 thread로 많은 요청 처리
- GC부하를 최소화하는 Zero-copy ByteBuf 지원
유연하고 쓰기 쉽다
- 각종 network protocol 기본 지원
- 필요한 부분을 쉽게 조립해 쓸 수 있는 구조
- multithread 처리 없이도 사용 가능
ChannelHandler의 메소드는 동시에 불리지 않는다.
Channel은 한 스레드에 할당되며 그 스레드에서만 호출
등록된 ChannelFutureListner도 그 스레드가 호출
핵심 interface
Channel
- read, write, connect, bind와 같은 I/O Operations를 할수 있는 component들이나
network socket들의 복합
- Channel의 모든 I/O는 비동기이다. (ChannelFuture를 통해 결과를 받을 수 있음)
ChannelFuture
- ChannelFeture interface를 통해 처리가 완료 되었는지 확인하고 결과를 받을 수 있다.
- addListener(), channel(), isSuccess(), cause(), await(), sync()...
ChannelHandler
- netty의 I/O event를 처리하는 interface
ChannelInboundHandler(인바운드), ChannelOutboundHandler(아웃바운드)
- exceptionCaught(), handlerAdded(), handlerRemoved()...
ChannelHandlerContext
- ChannelHandler는 ChannelHandlerContext를 통해 다음 ChannelHandler에게 이벤트를 넘기거나
동적으로 ChannelPipeline을 변경할수 있다.
- channel(), pipeline(), write(), fireChannelActive(), fireChannelRead()
ChannelPipeline
- Channel에 드나드는 inbound, outbound event를 처리
- addLast(), remove()...
- 각각의 채널에는 ChannelPipeline이 있고 한 ChannelPipeline에는 ChannelHandler 여러개를
다양하게 조립해서 사용한다.
EventLoop
- 채널에 등록된 모든 i/o 작업을 처리하는 Interface
- 구현체인 NioEventLoopGroup 을 주로 사용
- isEventLoop(), submit(), newPromise(), schedule()...
특징
- NIO ByteBuffer 대신 자신만의 Buffer API(ChannelBuffer)를 사용하여 Byte를 표현한다.
ChannelBuffer는 종종 ByteBuffer보다 빠르고 flip() 메서드를 호출할 필요 없으며
StringBuffer 처럼 동적 버퍼 타입이 제공되며 zero copy를 수행한다.
- 단순하든 복잡하든 바이너리든 아니든 상관없이 프로토콜 코덱을 작성할 때 마주하게 될 대부분의 이슈를
해결할 수 있도록 기본적인 코덱과 고급 코델을 제공한다.
- NIO 이면서도 SSL을 지원한다.
- Google Protobuf 와 통합이 가능하다.
구성요소
Bootstrap
- Channel을 초기화해주는 Helper class.
- ClientBootstrap: 새로운 Client-side channel을 생성해주고 연결을 시도하는 helper class.
- ServerBootstrap: Serverside channel을 생성하고 들어오는 연겨시도를 받아주는 helper class.
- ServerBootstrap의 부모 channel은 들어오는 여녈을 받아주고 성공적으로 bound 된
client 연결은 자식 channel 이 된다.
- ConnectionlessBootstrap: UDP와 같은 비연결성 전송을 위한 Server side 채널을 생성해 주는 helper class.
Codec
- 네트워크 통신에 필요한 Codec을 지원하여 개발자가 decoder와 encoder를 구현해야할 필요를 줄여준다.
'IT > JAVA' 카테고리의 다른 글
Netty(3) - Byte array 로 받기 - ByteArrayDecoder is not a @Sharable handler (0) | 2021.02.05 |
---|---|
Netty(2) - Bootstrap (0) | 2021.02.04 |
jmap 오류 발생할 경우 - Unable to open socket file, HotSpot VM not loaded (0) | 2020.12.01 |
webclient - bodyToMono 예외 처리 (0) | 2020.11.20 |
Synchronized 잘 알고 사용하기 (0) | 2020.11.05 |