天天看點

附錄G Netty與NettyUtils

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/beliefer/article/details/77450134

注:本文是為了配合《Spark核心設計的藝術 架構設計與實作》一書的内容而編寫,目的是為了節省成本、友善讀者查閱。書中附錄G的内容都在本文呈現。

Netty是一個NIO用戶端伺服器架構,使得開發高性能、高可靠性的網絡伺服器和用戶端程式變得快速且容易。它極大地簡化

化了網絡程式設計,如TCP和UDP套接字伺服器。

“快速和容易”并不意味着應用程式會有難維護和性能低的問題。Netty是一個精心設計的架構,它從許多協定的實作中吸收了很多的經驗,比如FTP, SMTP, HTTP和多種多樣的二進制和基于文本的傳統協定。是以Netty在不降低開發效率、性能、穩定性、靈活性情況下,已經成功地找到了解決方法。

NettyUtils是Spark對Netty API的封裝,在這裡對其中的主要方法進行說明。有關Netty的更多内容請通路Netty官網

http://netty.io/

createThreadFactory

功能描述:建立線程工廠,此工廠生成的線程都使用給定的字首名threadPoolPrefix + "-" +數字的格式命名。

public static ThreadFactory createThreadFactory(String threadPoolPrefix) {
    return new DefaultThreadFactory(threadPoolPrefix, true);
  }
           

createEventLoop

功能描述:根據參數IOMode,建立Netty的EventLoopGroup。

public static EventLoopGroup createEventLoop(IOMode mode, int numThreads, String threadPrefix) {
    ThreadFactory threadFactory = createThreadFactory(threadPrefix);

    switch (mode) {
      case NIO:
        return new NioEventLoopGroup(numThreads, threadFactory);
      case EPOLL:
        return new EpollEventLoopGroup(numThreads, threadFactory);
      default:
        throw new IllegalArgumentException("Unknown io mode: " + mode);
    }
  }
           

getClientChannelClass

功能描述:根據參數IOMode,傳回正确的用戶端SocketChannel。

public static Class<? extends Channel> getClientChannelClass(IOMode mode) {
    switch (mode) {
      case NIO:
        return NioSocketChannel.class;
      case EPOLL:
        return EpollSocketChannel.class;
      default:
        throw new IllegalArgumentException("Unknown io mode: " + mode);
    }
  }
           

getServerChannelClass

功能描述:根據參數IOMode,傳回正确的服務端SocketChannel。

public static Class<? extends ServerChannel> getServerChannelClass(IOMode mode) {
    switch (mode) {
      case NIO:
        return NioServerSocketChannel.class;
      case EPOLL:
        return EpollServerSocketChannel.class;
      default:
        throw new IllegalArgumentException("Unknown io mode: " + mode);
    }
  }
           

createFrameDecoder

功能描述:建立一個LengthFieldBasedFrameDecoder。LengthFieldBasedFrameDecoder的5個參數分别代表frame的最大長度、長度字段的偏移量、長度字段的位元組數、需要排除的長度字段的位元組數、長度字段的初始長度。是以建立的LengthFieldBasedFrameDecoder的前8個位元組代表frame的長度。LengthFieldBasedFrameDecoder通常會被設定到SocketChannel的管道中,在所有Decoder被調用之前調用。

public static TransportFrameDecoder createFrameDecoder() {
    return new TransportFrameDecoder();
  }
           

getRemoteAddress

功能描述:傳回Channel的遠端位址。

public static String getRemoteAddress(Channel channel) {
    if (channel != null && channel.remoteAddress() != null) {
      return channel.remoteAddress().toString();
    }
    return "<unknown remote>";
  }
           

createPooledByteBufAllocator

功能描述:建立一個彙集ByteBuf但對本地線程緩存禁用的配置設定器。為什麼要對本地線程緩存禁用?因為ByteBuf都是由事件循環線程配置設定,是以線程本地緩存對于TransportClient是禁用的。但是ByteBuf的釋放卻是由Executor線程,而不是事件循環線程來完成。本地線程緩存經常會延遲ByteBuf的回收,導緻巨大的記憶體消耗。

public static PooledByteBufAllocator createPooledByteBufAllocator(
      boolean allowDirectBufs,
      boolean allowCache,
      int numCores) {
    if (numCores == 0) {
      numCores = Runtime.getRuntime().availableProcessors();
    }
    return new PooledByteBufAllocator(
      allowDirectBufs && PlatformDependent.directBufferPreferred(),
      Math.min(getPrivateStaticField("DEFAULT_NUM_HEAP_ARENA"), numCores),
      Math.min(getPrivateStaticField("DEFAULT_NUM_DIRECT_ARENA"), allowDirectBufs ? numCores : 0),
      getPrivateStaticField("DEFAULT_PAGE_SIZE"),
      getPrivateStaticField("DEFAULT_MAX_ORDER"),
      allowCache ? getPrivateStaticField("DEFAULT_TINY_CACHE_SIZE") : 0,
      allowCache ? getPrivateStaticField("DEFAULT_SMALL_CACHE_SIZE") : 0,
      allowCache ? getPrivateStaticField("DEFAULT_NORMAL_CACHE_SIZE") : 0
    );
  }
           

getPrivateStaticField

功能描述:用于獲得Netty的靜态屬性值。

private static int getPrivateStaticField(String name) {
    try {
      Field f = PooledByteBufAllocator.DEFAULT.getClass().getDeclaredField(name);
      f.setAccessible(true);
      return f.getInt(null);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
           

關于《Spark核心設計的藝術 架構設計與實作》

經過近一年的準備,《Spark核心設計的藝術 架構設計與實作》一書現已出版發行,圖書如圖:

紙質版售賣連結如下:

京東:

https://item.jd.com/12302500.html

電子版售賣連結如下:

https://e.jd.com/30389208.html

繼續閱讀