지금까지 해본것을 정리한다면, 아래와 같은 그림을 그립니다.
하지만 ServerBootStrap(쉽게 네티를 사용할수있도록 로딩해주는 네티에서 지원하는 클래스)에서는 EventLoopGroup 이 2개입니다.
- EventLoopGroup1 :
- NioServerSocketChannel 을 갖고있는 eventLoopGroup을 갖고있습니다.
- 요청이 오면 eventLoop를 한개 꺼내온뒤, NioSocketChannel 을 생성하는 역할을 합니다.
- EventLoopGroup2 :
- 요청이 온 뒤 (channelRead 이벤트) 에 생성된 NioSocketChannel 을 등록할 수 있는 eventLoopGroup 을 갖고있습니다.
- ServerBootStrap.class > channelRead 함수에 등록과정이 있습니다.
- 이벤트에 대해서는 등록한 pipeLine 에 따른 순서로 처리합니다.
- 요청이 온 뒤 (channelRead 이벤트) 에 생성된 NioSocketChannel 을 등록할 수 있는 eventLoopGroup 을 갖고있습니다.
실제로는 아래와같은 그림이 됩니다.
- 첫번째 EventLoopGroup 은 자식(NioSocketChannel) 생성을 담당
- 두번째 EventLoopGroup 은 생성된 자식으로 이벤트처리를 담당
이러한 위의 구성을 편하게 만들어줄 수 있도록 netty 에서는
- ServerBootStrap 을 지원합니다.
- ※ 클라이언트의 경우에는 BootStrap 지원 (EventLoopGroup 한개)
@Slf4j
public class ServerBootStrapStudy {
public static void main(String[] args) {
ServerBootstrap serverBootstrap = new ServerBootstrap();
NioEventLoopGroup parent = new NioEventLoopGroup();
NioEventLoopGroup child = new NioEventLoopGroup();
parent.execute(() -> log.info("hello"));
child.execute(() -> log.info("hello"));
final ServerBootstrap bootstrap = serverBootstrap.group(parent, child) // 2개의 이벤트루프 등록
.channel(NioServerSocketChannel.class)
.localAddress(8080) // 포트 바인딩
.childHandler( // child 에 대한 핸들러 추가
new SimpleChannelInboundHandler<ByteBuf>() {
@Override
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
// child 가 처리할 파이프라인의 핸들러메소드들을 구현
log.info("msg : {}", msg.toString(CharsetUtil.UTF_8));
}
}
);
ChannelFuture channelFuture = bootstrap.bind();
}
}
위와같은 코드로, 간단하게 그림과같은 구성을 만들 수 있으며, 콘솔로그는 아래와 같습니다.
09:56:47.006 [nioEventLoopGroup-2-1] INFO ServerBootStrapStudy - hello
09:56:47.006 [nioEventLoopGroup-3-1] INFO ServerBootStrapStudy - hello
--> 다른 클라이언트에서 메세지를 보내면 child 쪽의 EventLoop 가 메세지를 출력하는 모습!
09:59:05.025 [nioEventLoopGroup-3-2] ServerBootStrapStudy - msg : Hello Server
끝~
'netty' 카테고리의 다른 글
2. EventLoopGroup (0) | 2021.04.10 |
---|---|
1. Java Channel (0) | 2021.04.10 |