ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Netty Bootstrap
    Netty 2019. 1. 9. 14:13



    지난번에 대충 인터페이스를 봤지만, 자세히 어떻게 돌아가는지 아직 잘 그림이 안그려진다.


    1. EventLoopGrouop boss, worker 생성

    2.1 ServerBootstrap으로 boss, worker 설정

    2.2 채널을 생성할 때 사용할 클래스(NioServerSocketChannel.class)를 등록, 이걸로 안쪽에서 채널팩도리를 만들어 등록한다.

    2.3 로깅할 핸들러 생성 후 설정(이건 뜬금없이 왜 등록 하는지 모르겠다)

    2.4 자식 핸들러로 DiscardServerHandler를 생성해서 등록

    3. ServerBootstrap으로 8010포트 bind() 후 sync()

    4. sync()에러 리턴받은 ChanenlFuture의 channel(), closeFuture(), sync() 순서대로 호출

    5. worker, boss EventLoopGroup shutdownGracefully()


    - BootStrap(사전검색;부트스트랩 (예비 명령에 의해 프로그램을 로드하는 방법), 일반적으로 한 번 시작되면 알아서 진행되는 일련의 과정)

    ServerBootstrap은 AbstractBootstrap을 상속하고있는데 순서대로 살펴보자. 


    AbstractBootStrap은 Channel을 쉽게 bootstrap 하도록 도와주는 helper 클래스이다. EventLoopGroup, ChannelFactory, SocketAddress, ChannelHandler를 가지고있다.(option, attrs map도 있다)

    ServerBootstrap은 이에 더해, child가 붙은 EventGroup, ChannelHandler과 ServerBootstrapConfig를 갖고있다.


         



    - bind() 부터 다시 trace

    안쪽에서 new InetSocketAddress(8010)을 만들어 넘기고, ip는 anyLocalAddress에서 기본으로 "0.0.0.0"을 넣어서 만든다.

    group과 channelFactory가 null인지 체크 하고, 좀 복잡해보이는 연결을 하기 시작한다. 매우 길것 같아서 때려치고 싶다.



    주절 주절 하는데 initAndRegister 부터 살펴본다. 드디어 Channel을 만들려나보다. 위에서 설정해둔 채널 팩토리로 newChannel()을 하면

    new ReflectiveChannelFactory<C>(NioServerSocketChannel.clas)

    NioServerSocketChannel 객체가 여기서 생성된다. initAndRegister 안에 있는 init은 ServerBootstrap에 구현체가 존재해서 다시 위로 가야한다--; 일단 넘어가고 좀있다 아래에서 보자.


    config() - ServerBootstrapConfig

    .group() - AbstractBootstrap.group - NioEventLoopGroup

    .register(channel) - MultiThreadEventLoopGrouop.register(NioServerSocketChanenel)



    register는 뭘 어떻게 어디에 등록하는건지 좀더 들어가보면 이런게 있다 - next().register(channel)



    EventExecutor 를 리턴하고 (구현체는 SingleThreadEventLoop) 안쪽에서는 DefaultChannelPromise를 만들어서 넘기고 여차저차 AbstractChannel.register(eventLoop, channelPromise)가 동작한다.





    SingleThreadEventLoop.execute() - register0를 보면 


    doRegister()를 더 들어가보면 AbstractNioChannel에 구현체가 있다.



    드디어 java nio channel이 보인다(javaChannel() 이녀석이 SelectableChannel을 리턴함. 그 구현체는 sun.nio.ch.ServerSocketChannelImpl)

    NioEventLoop.unwrappedSelector()를 java nio channel의 register로 넘김. Selector 구현체는 KQueueSelectorImpl



    nio Selector의 register방식은 하나밖에 없는 듯 함. 구현체가 AbstrackSelectableChannel 하나 밖에 없다.



    이제는 Java NIO의 영역이므로, 자세한 것은 NIO 파트에서 이어나간다. 다시 register0() 까지 위로 올라가서 pipeline 어쩌고 하는것을 따라가보자.

    pipeline.invokeHandlerAddedIfNeeded();

    pipeline.fireChannelRegistered();

    pipeline.fireChannelActive();

    를 줄줄이 호출하는데 안쪽을 보니 AbstractChannelHandlerContext에 등록을 알려주는 것들 같다.

    구현체를 보니 HandlerContext를 DefaultChannelPipeline이 가지고 있는것을 볼 수 있다.


    아까 지나온 init(Channel)을 마저 보면 다음과 같다.



    option과 attr을 set하고, DefaultChannelPipeline.addLast(채널을 초기화하는 ChannelInitializer를 생성해서 넘긴다)

    ChannelInitializer.initChannel은 pipeline.addLast(handler)를 하고, child 값들도 설정하는 Acceptor도 똑같이 만들어서 넘긴다

    'Netty' 카테고리의 다른 글

    ccc  (0) 2019.01.13
    Netty Core Interface  (0) 2019.01.07

    댓글

Designed by Tistory.