Netty 부트스트랩
구조
- 전송 계층 (소켓 모드 및 IO 종류)
- 이벤트 루프 (싱글 쓰레드, 멀티 쓰레드)
- 채널 파이프라인 설정
- 소켓 주소와 포트
- 소켓 옵션
ServerBootstrap
예제
public EchoServer() {
bossGroup = new NioEventLoopGroup(1);
workerGroup = new NioEventLoopGroup();
bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast(new EchoServerHandler());
}
});
}
- 부트스트랩에 쓰레드 등록. 첫번째는 부모고 두번째는 자식. 부모는 외부에서 들어오는 클라이언트 연결을 받고 자식은 연결된 클라이언트 소켓을 바탕으로 데이터 입출력 및 이벤트 처리를 담당
- 부모 쓰레드가 사용할 네트워크 입출력 모드 설정
- 자식 쓰레드의 초기화 방법 설정. ChannelInitializer은 연결된 채널이 초기화될 때 호출되는 기본 동작
입출력 모드 변경
- Nonblocking :
NIOEventLoopGroup
, NioServerSocketChannel
- Blocking :
OioEventLoopGroup
, OioServerSocketChannel
- Epoll :
EpollEventLoopGroup
, EpollServerSocketChannel
API
- group: 이벤트 루프 설정
- channel: 소켓 입출력 모드 설정
- LocalServerChannel: 로컬 가상 통신을 위한 소켓 채널
- OioServerSocketChannel: Blocking 소켓 채널
- NioServerSocketChannel: Nonblocking 소켓 채널
- EpollServerSocketChannel: epoll 소켓 채널
- OioSctpServerChannel: Blocking sctp 소켓 채널
- NioSctpServerChannel: Nonblocking sctp 소켓 채널
- SCTP(Stream Control Transmission Protocol): Layer 4 protocol
- NioUdtByteAcceptiorChannel: Nonblocking udt 소켓 채널
- NioUdtMessageAcceptorChannel: blocking udt 소켓 채널
- UDT(UDP-Based Data Transfer): Layer 7 protocol
- channelFactory: 소켓 입출력 모드 설정
- Netty에서 기본 제공하는 channel class보다 더 복잡한 로직이 필요할 때 사용
- channel class의 constructor에 패러미터가 없다면 그냥 channel() 쓰는걸 추천
- handler: 서버 소켓 채널의 이벤트 핸들러 설정
- childHandler: 클라이언트 소켓 채널의 이벤트 핸들러 설정
- option - 서버 소켓 채널의 소켓 옵션 설정
- 기본적으로 자바에서 설정할 수 있는 모든 소켓 옵션 설정 가능
- TCP_NODELAY: Nagle 알고리즘 비활성화 여부 설정
- SO_KEEPALIVE: 정해진 시간마다 keepalive packet 전송
- SO_SNDBUF: 커널 송신 버퍼 크기
- SO_RCVBUF: 커널 수신 버퍼 크기
- SO_REUSEADDR: TIME_WAIT 상태의 포트에도 bind 가능해짐
- SO_LINGER: 소켓을 닫을 때 송신 버퍼에 남은 데이터 전송 대기 시간
- SO_BACKLOG: 동시에 수용 가능한 소켓 연결 요청 수
- childOption: 클라이언트 소켓 채널의 소켓 옵션 설정
Bootstrap
- 클라이언트 어플리케이션 설정
- 기본적으로 ServerBootstrap와 대동소이
API
- group: 이벤트 루프 설정
- ServerBootstrap이랑 달리 패러미터를 1개만 받음
- channel: 클라이언트 소켓 입출력 모드 설정
- channelFactory: 소켓 입출력 모드 설정
- handler: 클라이언트 소켓 채널의 이벤트 핸들러 설정
- ChannelInitializer class로 등록됨
- ServerBootstrap의 childHandler이랑 같음
- option: 클라이언트 소켓 채널의 소켓 옵션 설정