네티서버에 필요한 요소
- ChannelHandler :이 컴포넌트는 클라이언트로부터 받은 데이터를 서버측에서 처리하는 비지니스 논리를 구현.
- Bootstrap : 서버를 구성하는 시동코드를 의미한다. 최소한 서버가 연결요청을 수신하는 포트에 서버와 바인당하는 코드가 있어야함.
Netty networking 대표적인 추상화 클래스
1. Channel : 소켓(Socket)
- Channel 인터페이스는 Socket으로 직접 작업할 때의 복잡성을 완화하는 API를 제공하고 미리정의된 클래스 계층의 루트임
1-1. 종류
- EmbeddedChannel
- LocalServerChannel
- NioDatagramChannel
- NioSctpChannel
- NioSocketChannel
2. EventLoop :흐름제어, 멀티스레딩, 동시성 제어
- 연결의 수명주기중 발생하는 이벤트를 처리하는 핵심 추상화를 정의함
2-1. 관계
- EventLoop, Thread, EventLoopGroup
- EventLoopGroup은 하나 이상의 EventLoop를 포함한다.
- EventLoop는 수명주기동안 한 Thread를 바인딩한다.
- EventLoop에서 처리되는 모든 입출력 이벤트는 해당 전용 스레드에서 처리됨
- Channel은 수명주기동안 EventLoop에 등록할 수 있다.
- EventLoop를 하나 이상의 Channel로 할당할 수 있다.
ex) 과정
1) EventLoop 4개가 들어있는 EventLoopGroup
2) EventLoopGroup에 들어있는 EventLoop를 이용
3) Channel 생성
4) EventLoop를 Channel에 등록
5) EventLoop의 전체 수명주기 중 입출력을 처리
3. ChannelFuture : 비동기알림
- 비동기는 작업이 즉시 반환되지 않을 수 있기 때문에 나중에 결과를 확인하는 방법이 필요
ChannelFutre는 미래에 실행될 작업의 결과를 알려준다.
4. ChannelHandler와 ChannelPipeline
4-1. ChannelHandler 인터페이스
- 인바운드 아웃바운드 데이터의 처리에 적용되는 모든 애플리케이션 논리 컨테이너 역할을 한다.
4-2. ChannelHandler의 Adapter 종류
- ChannelHandlerAdapter
- SimpleChannelInboundHandlerAdapter<T>
- ChannelInboundHandlerAdapter
- ChannelOutboundHandlerAdapter
- ChannelDuplexHandlerAdapter
4-3. ChannelPipeline 인터페이스
- ChannelHandler 체인을 위한 컨테이너를 제공하고, 체인상에서 인바운드와 아웃바운드 이벤트를 전파하는 API를 정의한다.
5. 디코더, 인코더
- 메시지를 수신하거나 전송할때 데이터를 변환하는 것.
인바운드 메시지는 바이트에서 다른 포맷(자바객체등)으로 변환되는 디코딩을 거친다
아웃바운드 메시지는 현재 포에서 바이트로 디코딩된다.
5-1. 종류
바이트 -> 메시지 : ByteToMessageDecoder, MessageToByteEncoder
구글 프로토콜 : ProtobufEncoder, ProtobufDecoder
6. SimpleChannelInboundHandler 추상클래스
- 기본 클래스의 메서드를 하나 이상 정의하고 모든 핸들러 메서드에 입력인수로 전달되는 ChannelHandlerContext에 대한 참조를 얻는 것.
(현재 입출력 스레드를 블로킹 하지 않아야함)
7. 부트스트랩(Bootstrap)
- 프로세스를 지정된 포트로 바인딩하거나 지정된 호스트, 포트에서 실행중인 다른 호스트로 연결하는 일을 하는 애플리케이션의 네트워크 레이어를 구성하는 컨테이너
1) BootStrap: 원격 피어로 연결해야하므로 client에서 정의
- 네트워크 기능 : 원격 호스트와 포트로 연결
- EventLoopGroup의 수 : 1개
1) BootStrap: 연결요청을 수신해야하므로 server에서 정의
- 네트워크 기능 : 로컬 포트로 바인딩
- EventLoopGroup의 수 : 2개
'Back-End > Netty' 카테고리의 다른 글
[Netty] @Sharable (0) | 2017.04.13 |
---|---|
[Netty] 1. 네티 프레임워크 (0) | 2017.04.13 |
[Netty] Netty에서 Object객체 전송 및 ByteBuf로 변환하여 전송하기 (0) | 2016.06.01 |
[Netty] 네티 ServerBootstrap 만들기 (0) | 2016.04.06 |