This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-pack.git

commit 70a9d03b3a9df13809eec41fcc58e571e64295fd
Author: Lei Zhang <[email protected]>
AuthorDate: Fri Nov 15 16:03:29 2019 +0800

    SCB-1593 Support Native transports for Linux (since 4.0.16) and MacOS/BSD 
(since 4.1.11)
---
 .../pack/alpha/server/GrpcServerConfig.java        |  7 +++
 .../pack/alpha/server/GrpcStartable.java           | 63 ++++++++++++++++++++--
 .../src/main/resources/application.yaml            |  1 +
 3 files changed, 68 insertions(+), 3 deletions(-)

diff --git 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcServerConfig.java
 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcServerConfig.java
index 7904b23..9f8911a 100644
--- 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcServerConfig.java
+++ 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcServerConfig.java
@@ -55,6 +55,9 @@ public class GrpcServerConfig {
   @Value("${alpha.server.ssl.clientCert:client.crt}")
   private String clientCert;
 
+  @Value("${alpha.feature.native:false}")
+  private boolean nettyTransport;
+
   public String getHost() {
     return host;
   }
@@ -98,6 +101,10 @@ public class GrpcServerConfig {
   public String getClientCert() {
     return clientCert;
   }
+
+  public boolean isNettyTransport() {
+    return nettyTransport;
+  }
 }
 
 
diff --git 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcStartable.java
 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcStartable.java
index 4760bac..20980c2 100644
--- 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcStartable.java
+++ 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcStartable.java
@@ -20,6 +20,12 @@
 
 package org.apache.servicecomb.pack.alpha.server;
 
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.ServerChannel;
+import io.netty.channel.epoll.EpollEventLoopGroup;
+import io.netty.channel.epoll.EpollServerSocketChannel;
+import io.netty.channel.kqueue.KQueueEventLoopGroup;
+import io.netty.channel.kqueue.KQueueServerSocketChannel;
 import io.netty.channel.nio.NioEventLoopGroup;
 import io.netty.channel.socket.nio.NioServerSocketChannel;
 import java.io.IOException;
@@ -103,9 +109,9 @@ public class GrpcStartable implements ServerStartable {
   private ServerBuilder getServerBuilder(int port) {
     return NettyServerBuilder.forAddress(
         new InetSocketAddress(serverConfig.getHost(), port))
-        .channelType(NioServerSocketChannel.class)
-        .bossEventLoopGroup(new NioEventLoopGroup(1))
-        .workerEventLoopGroup(new NioEventLoopGroup());
+        .channelType(selectorServerChannel())
+        .bossEventLoopGroup(selectorEventLoopGroup(1))
+        .workerEventLoopGroup(selectorEventLoopGroup(0));
   }
 
   private SslContextBuilder getSslContextBuilder(GrpcServerConfig config) {
@@ -202,4 +208,55 @@ public class GrpcStartable implements ServerStartable {
       throw error[0];
     }
   }
+
+  /**
+   * https://netty.io/wiki/native-transports.html
+   *
+   * RHEL/CentOS/Fedora:
+   * sudo yum install autoconf automake libtool make tar \
+   *                  glibc-devel libaio-devel \
+   *                  libgcc.i686 glibc-devel.i686
+   * Debian/Ubuntu:
+   * sudo apt-get install autoconf automake libtool make tar \
+   *                      gcc-multilib libaio-dev
+   *
+   * brew install autoconf automake libtool
+   * */
+  private Class<? extends ServerChannel> selectorServerChannel() {
+    Class<? extends ServerChannel> channel = NioServerSocketChannel.class;
+    if (serverConfig.isNettyTransport()) {
+      if (OSInfo.isLinux()) {
+        channel = EpollServerSocketChannel.class;
+      } else if (OSInfo.isMacOS()) {
+        channel = KQueueServerSocketChannel.class;
+      }
+    }
+    LOG.info("Netty channel type is " + channel.getSimpleName());
+    return channel;
+  }
+
+  private EventLoopGroup selectorEventLoopGroup(int nThreads) {
+    EventLoopGroup group = new NioEventLoopGroup(nThreads);
+    if (serverConfig.isNettyTransport()) {
+      if (OSInfo.isLinux()) {
+        group = new EpollEventLoopGroup(nThreads);
+      } else if (OSInfo.isMacOS()) {
+        group = new KQueueEventLoopGroup(nThreads);
+      }
+    }
+    LOG.info("Netty event loop group is " + group.getClass().getSimpleName());
+    return group;
+  }
+
+  static class OSInfo {
+    private static String OS = System.getProperty("os.name").toLowerCase();
+
+    public static boolean isLinux() {
+      return OS.indexOf("linux") >= 0;
+    }
+
+    public static boolean isMacOS() {
+      return OS.indexOf("mac") >= 0;
+    }
+  }
 }
diff --git a/alpha/alpha-server/src/main/resources/application.yaml 
b/alpha/alpha-server/src/main/resources/application.yaml
index e0d5b23..2a24d57 100644
--- a/alpha/alpha-server/src/main/resources/application.yaml
+++ b/alpha/alpha-server/src/main/resources/application.yaml
@@ -23,6 +23,7 @@ alpha:
     host: ${server.host}
     port: 8080
   feature:
+    native: false # Default disabled Netty Native Transport
     akka:
       enabled: false
       channel:

Reply via email to