天天看點

Spark Netty與Jetty (源碼閱讀十一)

  spark呢,對Netty API又做了一層封裝,那麼Netty是什麼呢~是個鬼。它基于NIO的服務端用戶端架構,具體不再說了,下面開始。

  建立了一個線程工廠,生成的線程都給定一個字首名。

  

Spark Netty與Jetty (源碼閱讀十一)
  像一般的netty架構一樣,建立Netty的EventLoopGroup:
Spark Netty與Jetty (源碼閱讀十一)
  在常用的netty架構中呢,會建立用戶端輔助類,設定SocketChannel:

Bootstrap b = new Bootstrap();
  b.group(group).channel(NioSocketChannel.class)      

  spark中呢 根據參數IOMode,傳回正确的用戶端SocketChannel:

Spark Netty與Jetty (源碼閱讀十一)

  傳回正确的服務端socketChannel:

Spark Netty與Jetty (源碼閱讀十一)

  傳回遠端的Channel位址:

Spark Netty與Jetty (源碼閱讀十一)

  建立一個ByteBuf對本地線程緩存禁用的配置設定器。ByteBuf是由事件循環線程配置設定,是以線程本地緩存對于TransportClient是禁用的,ByteBuf釋放是由Executor線程,不是事件循環線程完成。本地線程緩存經常會延遲ByteBuf的回收,導緻巨大的記憶體消耗。

Spark Netty與Jetty (源碼閱讀十一)

  Spark這個禽獸,對Jetty也進行了封裝,什麼是Jetty呢,它是以java作為開發語言的servlet容器,它的API以一組jar包的形式釋出,提供網絡和web服務.在我了解,Netty是用socket~Jetty呢 就是Http~那麼下來,我們看一下JettyUtils:

Spark Netty與Jetty (源碼閱讀十一)

  createServlet,生成HttpServlet匿名内部類,此Responder類型發生隐式轉換,轉換為使用者傳入的函數參數。

  要為Jetty建立servlet,就涉及ServletContextHandler的API的使用,生成ServletContextHandler:

Spark Netty與Jetty (源碼閱讀十一)

  建立給定路徑為字首的請求的響應處理,将SparkUI中的全部handler加入ContextHandlerCollection.,如果使用配置spark.ui.filters指定了filter,則給所有handler添加filter.然後調用startServiceOnPort,最終回調函數connect:

Spark Netty與Jetty (源碼閱讀十一)