WillemJiang closed pull request #181: [SCB-342] Add TLS support for gRPC
URL: https://github.com/apache/incubator-servicecomb-saga/pull/181
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/alpha/alpha-server/pom.xml b/alpha/alpha-server/pom.xml
index e1d6a8c5..c4a7bd5d 100644
--- a/alpha/alpha-server/pom.xml
+++ b/alpha/alpha-server/pom.xml
@@ -130,6 +130,10 @@
       <groupId>javax.interceptor</groupId>
       <artifactId>javax.interceptor-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-tcnative-boringssl-static</artifactId>
+    </dependency>
   </dependencies>
 
   <build>
diff --git 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaConfig.java
 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaConfig.java
index 6889c9f2..e45acdd4 100644
--- 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaConfig.java
+++ 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaConfig.java
@@ -81,8 +81,12 @@ ScheduledExecutorService compensationScheduler() {
   }
 
   @Bean
-  TxConsistentService txConsistentService(@Value("${alpha.server.port:8080}") 
int port,
+  GrpcServerConfig grpcServerConfig() { return new GrpcServerConfig(); }
+
+  @Bean
+  TxConsistentService txConsistentService(
       @Value("${alpha.event.pollingInterval:500}") int eventPollingInterval,
+      GrpcServerConfig serverConfig,
       ScheduledExecutorService scheduler,
       TxEventRepository eventRepository,
       CommandRepository commandRepository,
@@ -96,15 +100,15 @@ TxConsistentService 
txConsistentService(@Value("${alpha.server.port:8080}") int
 
     TxConsistentService consistentService = new 
TxConsistentService(eventRepository);
 
-    ServerStartable startable = buildGrpc(port, consistentService, 
omegaCallbacks);
+    ServerStartable startable = buildGrpc(serverConfig, consistentService, 
omegaCallbacks);
     new Thread(startable::start).start();
 
     return consistentService;
   }
 
-  private ServerStartable buildGrpc(int port, TxConsistentService 
txConsistentService,
+  private ServerStartable buildGrpc(GrpcServerConfig serverConfig, 
TxConsistentService txConsistentService,
       Map<String, Map<String, OmegaCallback>> omegaCallbacks) {
-    return new GrpcStartable(port,
+    return new GrpcStartable(serverConfig,
         new GrpcTxEventEndpointImpl(txConsistentService, omegaCallbacks));
   }
 
diff --git 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/GrpcServerConfig.java
 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/GrpcServerConfig.java
new file mode 100644
index 00000000..ec4d3b1a
--- /dev/null
+++ 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/GrpcServerConfig.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.alpha.server;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.beans.factory.annotation.Value;
+
+@Configuration
+public class GrpcServerConfig {
+  @Value("${alpha.server.host:0.0.0.0}")
+  private String host;
+
+  @Value("${alpha.server.port:8080}")
+  private int port;
+
+  @Value("${alpha.server.ssl.enable:false}")
+  private boolean enable;
+
+  @Value("${alpha.server.ssl.cert:server.cert}")
+  private String cert;
+
+  @Value("${alpha.server.ssl.key:server.key}")
+  private String key;
+
+  @Value("${alpha.server.ssl.enable:false}")
+  private boolean mutalAuth;
+
+  @Value("${alpha.server.ssl.clientCert:client.cert}")
+  private String clientCert;
+
+  public String getHost() {
+    return host;
+  }
+
+  public int getPort() {
+    return port;
+  }
+
+  public boolean isEnable() {
+    return enable;
+  }
+
+  public String getCert() {
+    return cert;
+  }
+
+  public String getKey() {
+    return key;
+  }
+
+  public boolean isMutalAuth() {
+    return mutalAuth;
+  }
+
+  public String getClientCert() {
+    return clientCert;
+  }
+}
+
+
diff --git 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/GrpcStartable.java
 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/GrpcStartable.java
index 869d5937..803cd2dd 100644
--- 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/GrpcStartable.java
+++ 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/GrpcStartable.java
@@ -20,9 +20,15 @@
 
 package org.apache.servicecomb.saga.alpha.server;
 
+import java.io.File;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
+import java.net.InetSocketAddress;
 import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+
+import javax.net.ssl.SSLException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,14 +36,31 @@
 import io.grpc.BindableService;
 import io.grpc.Server;
 import io.grpc.ServerBuilder;
+import io.grpc.netty.GrpcSslContexts;
+import io.grpc.netty.NettyServerBuilder;
+import io.netty.handler.ssl.ClientAuth;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.ssl.SslProvider;
 
 class GrpcStartable implements ServerStartable {
 
   private static final Logger LOG = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private final Server server;
 
-  GrpcStartable(int port, BindableService... services) {
-    ServerBuilder<?> serverBuilder = ServerBuilder.forPort(port);
+  GrpcStartable(GrpcServerConfig serverConfig, BindableService... services) {
+    ServerBuilder<?> serverBuilder;
+    if (serverConfig.isEnable()){
+      serverBuilder = NettyServerBuilder.forAddress(
+          new InetSocketAddress(serverConfig.getHost(), 
serverConfig.getPort()));
+
+      try {
+        ((NettyServerBuilder) 
serverBuilder).sslContext(getSslContextBuilder(serverConfig).build());
+      } catch (SSLException e) {
+        throw new IllegalStateException("Unable to setup grpc to use SSL.", e);
+      }
+    } else {
+      serverBuilder = ServerBuilder.forPort(serverConfig.getPort());
+    }
     Arrays.stream(services).forEach(serverBuilder::addService);
     server = serverBuilder.build();
   }
@@ -56,4 +79,25 @@ public void start() {
       Thread.currentThread().interrupt();
     }
   }
+
+  private SslContextBuilder getSslContextBuilder(GrpcServerConfig config) {
+
+    Properties prop = new Properties();
+    try {
+      
prop.load(getClass().getClassLoader().getResourceAsStream("ssl.properties"));
+    } catch (IOException e) {
+      throw new IllegalStateException("Unable to read ssl.properties.", e);
+    }
+
+    SslContextBuilder sslClientContextBuilder = 
SslContextBuilder.forServer(new File(config.getCert()),
+        new File(config.getKey()))
+        .protocols(prop.getProperty("protocols"))
+        .ciphers(Arrays.asList(prop.getProperty("ciphers").split(",")));
+    if (config.isMutalAuth()) {
+      sslClientContextBuilder.trustManager(new File(config.getClientCert()));
+      sslClientContextBuilder.clientAuth(ClientAuth.REQUIRE);
+    }
+    return GrpcSslContexts.configure(sslClientContextBuilder,
+        SslProvider.OPENSSL);
+  }
 }
diff --git a/alpha/alpha-server/src/main/resources/application.yaml 
b/alpha/alpha-server/src/main/resources/application.yaml
index 43b39dc6..41964d00 100644
--- a/alpha/alpha-server/src/main/resources/application.yaml
+++ b/alpha/alpha-server/src/main/resources/application.yaml
@@ -17,6 +17,16 @@
 server:
   port: 8090
 
+alpha:
+  server:
+    host: 0.0.0.0
+    port: 8080
+    ssl:
+      enable: false
+      cert: server.crt
+      key: server.pem
+      enableMutualAuth: false
+      clientCert: client.crt
 ---
 spring:
   profiles: prd
@@ -39,4 +49,4 @@ spring:
   jpa:
     properties:
       eclipselink:
-        ddl-generation: none
\ No newline at end of file
+        ddl-generation: none
diff --git a/alpha/alpha-server/src/main/resources/ssl.properties 
b/alpha/alpha-server/src/main/resources/ssl.properties
new file mode 100644
index 00000000..dccd4c80
--- /dev/null
+++ b/alpha/alpha-server/src/main/resources/ssl.properties
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ciphers = 
ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES128-SHA256
+protocols = TLSv1.2
diff --git 
a/alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/AlphaIntegrationTest.java
 
b/alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/AlphaIntegrationTest.java
index 10bb2dd0..45b268b4 100644
--- 
a/alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/AlphaIntegrationTest.java
+++ 
b/alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/AlphaIntegrationTest.java
@@ -32,6 +32,8 @@
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertThat;
 
+import java.io.File;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Queue;
@@ -41,6 +43,7 @@
 import java.util.function.Consumer;
 
 import javax.annotation.PostConstruct;
+import javax.net.ssl.SSLException;
 
 import org.apache.servicecomb.saga.alpha.core.CommandRepository;
 import org.apache.servicecomb.saga.alpha.core.EventScanner;
@@ -72,16 +75,29 @@
 
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
+import io.grpc.netty.GrpcSslContexts;
+import io.grpc.netty.NegotiationType;
+import io.grpc.netty.NettyChannelBuilder;
 import io.grpc.stub.StreamObserver;
+import io.netty.handler.ssl.SslContext;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.ssl.SslProvider;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {AlphaApplication.class, AlphaConfig.class},
-    properties = {"alpha.server.port=8090", "alpha.event.pollingInterval=1"})
+    properties = {
+        "alpha.server.host=0.0.0.0",
+        "alpha.server.port=8090", "alpha.event.pollingInterval=1",
+        "alpha.server.ssl.enable=true", 
"alpha.server.ssl.cert=src/test/resources/server.crt",
+        "alpha.server.ssl.key=src/test/resources/server.pem", 
"alpha.server.ssl.enableMutualAuth=true",
+        "alpha.server.ssl.clientCert=src/test/resources/client.crt"})
 public class AlphaIntegrationTest {
   private static final int port = 8090;
 
-  private static final ManagedChannel clientChannel = ManagedChannelBuilder
-      .forAddress("localhost", port).usePlaintext(true).build();
+  private static final ManagedChannel clientChannel = 
NettyChannelBuilder.forAddress("localhost", port)
+      .negotiationType(NegotiationType.TLS)
+      .sslContext(getSslContext())
+      .build();
 
   private final TxEventServiceStub asyncStub = 
TxEventServiceGrpc.newStub(clientChannel);
   private final TxEventServiceBlockingStub blockingStub = 
TxEventServiceGrpc.newBlockingStub(clientChannel);
@@ -134,6 +150,23 @@
   private final CompensationStreamObserver compensateResponseObserver = new 
CompensationStreamObserver(
       this::onCompensation);
 
+  private static SslContext getSslContext(){
+    ClassLoader classLoader = AlphaIntegrationTest.class.getClassLoader();
+    SslContext sslContext = null;
+    try {
+      sslContext = GrpcSslContexts.forClient().sslProvider(SslProvider.OPENSSL)
+          .protocols("TLSv1.2","TLSv1.1")
+          .ciphers(Arrays.asList("ECDHE-RSA-AES128-GCM-SHA256",
+              "ECDHE-RSA-AES256-GCM-SHA384",
+              "ECDHE-ECDSA-AES128-SHA256"))
+          .trustManager(new File(classLoader.getResource("ca.crt").getFile()))
+          .keyManager(new 
File(classLoader.getResource("client.crt").getFile()),
+              new 
File(classLoader.getResource("client.pem").getFile())).build();
+    } catch (SSLException e) {
+      e.printStackTrace();
+    }
+    return sslContext;
+  }
   @AfterClass
   public static void tearDown() throws Exception {
     clientChannel.shutdown();
diff --git a/alpha/alpha-server/src/test/resources/ca.crt 
b/alpha/alpha-server/src/test/resources/ca.crt
new file mode 100644
index 00000000..6a524662
--- /dev/null
+++ b/alpha/alpha-server/src/test/resources/ca.crt
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/TCCAuWgAwIBAgIJAPdGaDoSrNMoMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
+BAMMCWxvY2FsaG9zdDAgFw0xODA1MDMwMjQ1NTFaGA8yMjkyMDIxNTAyNDU1MVow
+FDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAmyOahET4IFyx24VdszCkhTYwnRvQBHWntSac1nwnQx4fJg1VEtBh2Yz0
+5id6S9CAugLWof8E5Fz8/2rx+UWwCk7zP/F1nHKMyRBwnv0TWez4o9nFdCc2J2NJ
+WB84m3sXkipcKtCb8godHaQ4euze4XumDEceYpovkwHnoSglK7hhOL/h7M8lISNB
+Q+iZdimALsXL8FR10vHxHGH7clEWWvQ1FUtD+THNVLJ/E/nFE/8i+Jv3N0i6Ga6y
+vyROcdq2eCMzaZmertNCUL0NR54JvKX8IeHg4fyOZDam2f1G0n0t0WbyyIghpz4I
+1K5j1enhdUMlbywCtO3Mx9dSpWJUWh5d20MzCXQKCSz3D0bN0N+SbEpv3Fzj1m5h
+oP4Dc+PVNKHC6U/K46sp3SfYlI8V9/zaHk1VyqLNQiq155F4CZ3iGFl0D5F7Ylyn
+ju2B5cOAy6451tickhHh1xk6vRtkSTAJEQApDmL7byllggEMUPYmDkH0rqAKj4sZ
+OZgxJXxGnvgrgeW86nVMxtyoZkh7yaK2Nf8RSmvuL6rJtpzoQaJ5ohXaAe07GHar
+t+KPU8Yqejq9R/hqbfLBybaMxMx+gCvOI72/lGV4jZi8vZlnGW8RjLUYfqBwjW1d
+cjDvgc5RIF4kL88oTBoCBfdcO4p6tuxlb7THWQSwgekUH5wDHjECAwEAAaNQME4w
+HQYDVR0OBBYEFAd030aW8cqK+JSzoX/5+FOUAcvrMB8GA1UdIwQYMBaAFAd030aW
+8cqK+JSzoX/5+FOUAcvrMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIB
+AHQ2VSIGnKqnJJa5AT4iYbkpAWjsndP8QdQyCVey37r4u9yyaoIUuf5XXcbszICg
+Vtzt58lyV+NU7t3vMmYoKDHyO7Jdhddr2H4augSGElIbM3qRcMvxIPhTcxr1le1L
+FaUz+Q3004h+QIqAThEEzWed65A/ttlwX3uDzhiBGR3cX7U/7f/zmE1uCd/0R3nx
+yVAjzX5tuHmozd5xTDQZkzdPD8BViCGrjNlsraMiOL65RTwdPPU6h7z0ZlAe4L70
+Dl12kTZ+G+n94+HPCc/vl5JRb26lJW4SUOc1Cy2f2E+GiS/sE05fpA18cErDm7Sm
+H3W/25NR7QaADYXlZut6YjgLr19aMAwUUjfMstAxZZbo2nBjIwZrhKi1k4Wg/COp
+SMK+T2MkxtCIE76MLzVzJa/yF8vcpzJiqKEi4WNZ5Yf27V0/9TGFSoDlEZmAMJrB
+m/BDcubI2CUPyvVZBjhEClNypJtR7pK/uNJoTeOXt5g3RcAxUV+t6OYD/gfsrwrT
+1SGoKNEx7FbfXtxPA+mYyy+zsK4baVh6k/6s+d+/QLmRJ9SJIoJabnx82NNJK87l
+CBkYLd3HnaImUJKuFXqK1AwqBCjNmmxEUxwCkYz+TGz2xMdLd6GQ5bB3RQin0oag
+Ti9/aublYImvlhaNOkrDYWfRHK4Cg43kyrh/2DuZgVNz
+-----END CERTIFICATE-----
diff --git a/alpha/alpha-server/src/test/resources/client.crt 
b/alpha/alpha-server/src/test/resources/client.crt
new file mode 100644
index 00000000..5f5fcc2e
--- /dev/null
+++ b/alpha/alpha-server/src/test/resources/client.crt
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEnjCCAoYCAQEwDQYJKoZIhvcNAQELBQAwFDESMBAGA1UEAwwJbG9jYWxob3N0
+MCAXDTE4MDUwMzAyNDU1M1oYDzIyOTIwMjE1MDI0NTUzWjAUMRIwEAYDVQQDDAls
+b2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDaFMiK66AO
+u2t2Q1jdNd0QimkHNWXnlP1bS2ExqOBmRTMnyK5t7WDwqvYPqLzn8ukko4l11RcK
+4w/hKLu1oNpp8ofH3TXrhNToMt3czCPFPUnWSYYau9Wb6MwybUA2coDcTYFHkGyk
+eA8DSIS9EGyIMlhqbBNvlbHeZLExD2JqSPA3GCQY0S6YAjjDPdBS0D/8wpptZ8zD
+4EtjwJw5/DvBuihaGSRH35te7klYOJTgn+Ag8D/YUBkDiBGKn0luQggeg2LNSamL
+QrECIMdWlr0JVNnzhXI2czOw49JOoaG7AZzpHMX23n+VLqQi4S/vqsKd6DCJfoAa
+P03xqR/F/uRLIbSMZ1xD1FSVVkyTxMYPi9+amcIaZZ8vyxRegIgVufs1eTBaR9wr
+1UnC7j7LBet3YeWLud5JOyKOsa9KTG66qWNQU6a+RR2hbwTZfpHGFX1U0wzfhbZJ
+pTVzjeuLzf8dLZc+AN+2HvFbJloVGH7hyMHJ3KgqRvXwaLCD6ZWrail51+xOPLN/
+/BRcoQYbcGOveb68GAaHqpattuJnlUN3S5ZgbLT2IEySF7V3nes1/jSbJ/jWrT/h
+GrknHQjx050b5q9g1lNmRooIBzhlTp3iFA+UcyQWjJ1cTcZZTt2OI/eYyXhPc+Zc
+NIMeDpc+WiEVS2Wbv61lqfAoxYEN7eMuYQIDAQABMA0GCSqGSIb3DQEBCwUAA4IC
+AQCTiEHWxAPHoKc5WUZhTE0g8lB4xQgMvuJCebbvSa4wxbwWkcOAnEsREhi11VLR
+RqD5eBlsUiUhCLLmK746QX6UasDlOBkLQe1EFgnOJCtgOVUiunB3wBSu6aL6SiXS
+bncYVikcIVIN+GLrF3tHiJJyxvWUxgiZCoxL5Ia+qdpWAqYY80rauK96rVkcLkNb
+oFoFnQgRYl9z0aQuB5BQdBOaRLZRnFB2lxKn/eLyAdNRQ7+YHBm9J4hfVw+hnIr6
+U1cR+ocfofRQdvtcn0ZL3rqoG/ePuTW+ZjBFhRA2doClLpUGqNdXqKbb4sAsTUea
+lfnf+fBRQFil/b+FB+mzSifu3+97vbbRTmMhL8F/ZNFAuLBHsYKfW5434LYflt79
+XeuVU2lfzkauVvov2oZN1YH6BwQEaXjNmnd7JXZaCQLSYi4KXy9Rf5q6NRBYKJv7
+Jdgnx9wdYGxG1PNrhQESAaCD6ac1zTufFVHZHypXQNQ4BQk5Nc3KDH4JWT2FT2Zi
+tR/AoOnqTwsHr6YaROIgZXKOPjnbdK8ftIIyM62gjotS6pZG0CdVefOFuGyHnZkB
+rPA598NDvu9df1NyeDEtXcP2aZnAlLbUlUzrUCWVgzcjH/wGvnSwouSHhGk3g0ky
+DNyD+fx/nWh0K9/0osO39OfHsgUo5/gl/oP294SGBM0voQ==
+-----END CERTIFICATE-----
diff --git a/alpha/alpha-server/src/test/resources/client.pem 
b/alpha/alpha-server/src/test/resources/client.pem
new file mode 100644
index 00000000..cff88b3d
--- /dev/null
+++ b/alpha/alpha-server/src/test/resources/client.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+1ziBzxwR75M+tXNoZkpPK1QJtmBt20w=
+-----END PRIVATE KEY-----
diff --git a/alpha/alpha-server/src/test/resources/server.crt 
b/alpha/alpha-server/src/test/resources/server.crt
new file mode 100644
index 00000000..b1e50548
--- /dev/null
+++ b/alpha/alpha-server/src/test/resources/server.crt
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEnjCCAoYCAQEwDQYJKoZIhvcNAQELBQAwFDESMBAGA1UEAwwJbG9jYWxob3N0
+MCAXDTE4MDUwMzAyNDU1MloYDzIyOTIwMjE1MDI0NTUyWjAUMRIwEAYDVQQDDAls
+b2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC1rKNt//lp
+mcvz4IACa8Axsgg7W/lq4xwGbHMsQIdbGwB9lFC72MinSWgd0jPrw6YK7CPmQ9V9
+SqYWox2PEL+mCuajgTX4/ynVLRrcBbf6QLLVChVr6Bteq9mjqq+zQ/gEV1zMTfkw
+HFpVmoCijkr+sK0xlkCJQsNSt8h7Rb3D+UhqF/8v8VkyXK441KExm4FHW8+7ec1Y
+6CfUJdVBrH73gxMAsLoXmimq0gtb2mbVBJR6m8j3g7QUwbO6fcz0AxC22kzLVyhU
+0qvPXo2EP/VFzv9V+9f0rljxu8AwDsQjlqXaOQ+ijpmc/XBz3h0eBSUTWYK7kUKO
+CrxcvpQCf39OD9AjgIukjRP2cM9wzMt1nk1Llv+rSMdHQMN5nhybTlsBwV/xU9LQ
+GDKvPKydtzQxPC7UCsm1fivH06x8gaYn2yCreuGd5XXeS+IkdHSuGtebRk4LKN/k
+kGDE341yfeU6ByKwCQcQcWCHY3gHj89F4moL24YBtM4QSJb9PdrF6CxN6ynU06rS
+rr5lfaT4e68sjI0wjTU5oNVCWzLko/ig/lZgGPgrgXg3m9oYNNOtPgTRt7VR1anM
++4ml0QRC/fiyHqQkinkjhdotWLxRiWTgClnuQz4co46AnfgE7K/rwCvfTol+r18L
+Vd2yCSWEzpmTsgxK/e0pvh91rS6ti2d8QQIDAQABMA0GCSqGSIb3DQEBCwUAA4IC
+AQB1hg0WxLU24jvMr5xW47iunqrtY9JPACMHVtvjrcULSLrVWIR5/DlsLc/cX4d8
+2152B4MTtzvpDVjKoaY5MCTrRv67JnPu0GYJGTpGbPmOTxKv8foK5E6XJKA3bVeQ
+hh/De7+C2+TCewDy+JMg3AjctMty2L2NpYeBpTRRJYxpfap+AEPawy88esX/C2J4
+iuiSzRdtJz4Q4PVl3XrP/2q2i5EiH28vq8wNOSFl7PpKiHSfppgIpPrJplqGu67F
+sKLRHGv1MOTmY8+vayChwmaqi6KgUkQQ4/zoeO526O6P9GD6ggyfSzk9/MxZWOMy
+PCbF82ibh8XUSc+Gxa/8yJ2Nlr791qqNYZIwsWpT9wGK+KEKsc8Myu4jipsFUpA+
+sJL3/3i23c+DUjssbD6vSA70U6joi81yThZ7n+AGttx44WGlTmnnYtFzFuBwAHxg
+RvwtYNIvTTrpOM51Je2YoTqpUe7o2DqQHIXOwDMOQUBTOwuaXMyqbiNWypnI0Fvm
+3xkgOLRU/9rQAa+NGdZtEaxJLTv7aqDJqcp76ihlCPTwxNWHaVNpIGh4NMMMgEON
+vLkBAZ8uZcDtgVzgfWuNshlvEDD9m/QJPIQLmVMWStV9lkHQuCw61oLlgU2yB88O
+Abgz0WIJUBiGbFrOwUa6gXYMB8FgPe3deLXhJBrsDoeucQ==
+-----END CERTIFICATE-----
diff --git a/alpha/alpha-server/src/test/resources/server.pem 
b/alpha/alpha-server/src/test/resources/server.pem
new file mode 100644
index 00000000..ad6f8f7f
--- /dev/null
+++ b/alpha/alpha-server/src/test/resources/server.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+p1ExithNKfNT+kZJnYPRBnc8FJRiIgDA
+-----END PRIVATE KEY-----
diff --git a/omega/omega-connector/omega-connector-grpc/pom.xml 
b/omega/omega-connector/omega-connector-grpc/pom.xml
index 705eebd2..96e6d846 100644
--- a/omega/omega-connector/omega-connector-grpc/pom.xml
+++ b/omega/omega-connector/omega-connector-grpc/pom.xml
@@ -41,6 +41,10 @@
       <groupId>io.grpc</groupId>
       <artifactId>grpc-netty</artifactId>
     </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-tcnative-boringssl-static</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.apache.servicecomb.saga</groupId>
       <artifactId>omega-transaction</artifactId>
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/saga/omega/connector/grpc/AlphaClusterConfig.java
 
b/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/saga/omega/connector/grpc/AlphaClusterConfig.java
new file mode 100644
index 00000000..c7aa6647
--- /dev/null
+++ 
b/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/saga/omega/connector/grpc/AlphaClusterConfig.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.omega.connector.grpc;
+
+import java.util.List;
+
+public class AlphaClusterConfig {
+  private List<String> addresses;
+
+  private boolean enableSSL;
+
+  private boolean enableMutualAuth;
+
+  private String cert;
+
+  private String key;
+
+  private String certChain;
+
+  public AlphaClusterConfig(List<String> addresses,
+      boolean enableSSL,
+      boolean enableMutualAuth,
+      String cert,
+      String key,
+      String certChain) {
+    this.addresses = addresses;
+    this.enableMutualAuth = enableMutualAuth;
+    this.enableSSL = enableSSL;
+    this.cert = cert;
+    this.key = key;
+    this.certChain = certChain;
+  }
+
+  public List<String> getAddresses() {
+    return addresses;
+  }
+
+  public boolean isEnableSSL() {
+    return enableSSL;
+  }
+
+  public boolean isEnableMutualAuth() {
+    return enableMutualAuth;
+  }
+
+  public String getCert() {
+    return cert;
+  }
+
+  public String getKey() {
+    return key;
+  }
+
+  public String getCertChain() {
+    return certChain;
+  }
+}
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSender.java
 
b/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSender.java
index afff8e73..87c2a642 100644
--- 
a/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSender.java
+++ 
b/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSender.java
@@ -20,12 +20,16 @@
 import static java.util.Collections.emptyList;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
+import java.io.File;
+import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Properties;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executors;
@@ -33,6 +37,8 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.function.Function;
 
+import javax.net.ssl.SSLException;
+
 import org.apache.servicecomb.saga.omega.context.ServiceConfig;
 import org.apache.servicecomb.saga.omega.transaction.AlphaResponse;
 import org.apache.servicecomb.saga.omega.transaction.MessageDeserializer;
@@ -46,6 +52,12 @@
 
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
+import io.grpc.netty.GrpcSslContexts;
+import io.grpc.netty.NegotiationType;
+import io.grpc.netty.NettyChannelBuilder;
+import io.netty.handler.ssl.SslContext;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.ssl.SslProvider;
 
 public class LoadBalancedClusterMessageSender implements MessageSender {
   private static final Logger LOG = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -57,23 +69,39 @@
   private final MessageSender retryableMessageSender = new 
RetryableMessageSender(availableMessageSenders);
   private final ScheduledExecutorService scheduler = 
Executors.newSingleThreadScheduledExecutor();
 
-  public LoadBalancedClusterMessageSender(String[] addresses,
+  public LoadBalancedClusterMessageSender(AlphaClusterConfig clusterConfig,
       MessageSerializer serializer,
       MessageDeserializer deserializer,
       ServiceConfig serviceConfig,
       MessageHandler handler,
       int reconnectDelay) {
 
-    if (addresses.length == 0) {
+    if (clusterConfig.getAddresses().size() == 0) {
       throw new IllegalArgumentException("No reachable cluster address 
provided");
     }
 
-    channels = new ArrayList<>(addresses.length);
-    for (String address : addresses) {
-      ManagedChannel channel = ManagedChannelBuilder.forTarget(address)
-          .usePlaintext(true)
-          .build();
-
+    channels = new ArrayList<>(clusterConfig.getAddresses().size());
+
+    SslContext sslContext = null;
+    for (String address : clusterConfig.getAddresses()) {
+      ManagedChannel channel;
+
+      if (clusterConfig.isEnableSSL()) {
+        if (sslContext == null) {
+          try {
+            sslContext = buildSslContext(clusterConfig);
+          } catch (SSLException e) {
+            throw new IllegalArgumentException("Unable to build SslContext", 
e);
+          }
+        }
+         channel = NettyChannelBuilder.forTarget(address)
+            .negotiationType(NegotiationType.TLS)
+            .sslContext(sslContext)
+            .build();
+      } else {
+        channel = ManagedChannelBuilder.forTarget(address).usePlaintext()
+            .build();
+      }
       channels.add(channel);
       senders.put(
           new GrpcClientMessageSender(
@@ -175,4 +203,28 @@ private void scheduleReconnectTask(int reconnectDelay) {
       return () -> pendingTasks.offer(runnable);
     };
   }
+
+  private static SslContext buildSslContext(AlphaClusterConfig clusterConfig) 
throws SSLException {
+    SslContextBuilder builder = GrpcSslContexts.forClient();
+    // openssl must be used because some older JDk does not support cipher 
suites required by http2,
+    // and the performance of JDK ssl is pretty low compared to openssl.
+    builder.sslProvider(SslProvider.OPENSSL);
+
+    Properties prop = new Properties();
+    try {
+      
prop.load(LoadBalancedClusterMessageSender.class.getClassLoader().getResourceAsStream("ssl.properties"));
+    } catch (IOException e) {
+      throw new IllegalArgumentException("Unable to read ssl.properties.", e);
+    }
+
+    builder.protocols(prop.getProperty("protocols").split(","));
+    builder.ciphers(Arrays.asList(prop.getProperty("ciphers").split(",")));
+    builder.trustManager(new File(clusterConfig.getCertChain()));
+
+    if (clusterConfig.isEnableMutualAuth()) {
+      builder.keyManager(new File(clusterConfig.getCert()), new 
File(clusterConfig.getKey()));
+    }
+
+    return builder.build();
+  }
 }
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/main/resources/ssl.properties 
b/omega/omega-connector/omega-connector-grpc/src/main/resources/ssl.properties
new file mode 100644
index 00000000..dccd4c80
--- /dev/null
+++ 
b/omega/omega-connector/omega-connector-grpc/src/main/resources/ssl.properties
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ciphers = 
ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-AES128-SHA256
+protocols = TLSv1.2
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalanceClusterMessageSenderWithTLSTest.java
 
b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalanceClusterMessageSenderWithTLSTest.java
new file mode 100644
index 00000000..b7590529
--- /dev/null
+++ 
b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalanceClusterMessageSenderWithTLSTest.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.omega.connector.grpc;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.awaitility.Awaitility.await;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.Arrays;
+
+import javax.net.ssl.SSLException;
+
+import org.apache.servicecomb.saga.omega.context.ServiceConfig;
+import org.apache.servicecomb.saga.omega.transaction.MessageSender;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import io.grpc.Server;
+import io.grpc.ServerBuilder;
+import io.grpc.netty.GrpcSslContexts;
+import io.grpc.netty.NettyServerBuilder;
+import io.netty.handler.ssl.ClientAuth;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.ssl.SslProvider;
+
+public class LoadBalanceClusterMessageSenderWithTLSTest extends 
LoadBalancedClusterMessageSenderTestBase {
+
+  @Override
+  protected MessageSender newMessageSender(String[] addresses) {
+    ClassLoader classLoader = getClass().getClassLoader();
+    AlphaClusterConfig clusterConfig = new 
AlphaClusterConfig(Arrays.asList(addresses),
+        true, true,
+        classLoader.getResource("client.crt").getFile(),
+        classLoader.getResource("client.pem").getFile(),
+        classLoader.getResource("ca.crt").getFile());
+    return new LoadBalancedClusterMessageSender(
+        clusterConfig,
+        serializer,
+        deserializer,
+        new ServiceConfig(serviceName),
+        handler,
+        100);
+  }
+
+  @BeforeClass
+  public static void beforeClass() throws Exception {
+    
Arrays.stream(ports).forEach(LoadBalanceClusterMessageSenderWithTLSTest::startServerOnPort);
+  }
+
+  private static void startServerOnPort(int port) {
+    ServerBuilder<?> serverBuilder = NettyServerBuilder.forAddress(
+        new InetSocketAddress("127.0.0.1", port));
+    try {
+      ((NettyServerBuilder) 
serverBuilder).sslContext(getSslContextBuilder().build());
+    } catch (SSLException e) {
+      throw new IllegalStateException("Unable to setup grpc to use SSL.", e);
+    }
+
+    serverBuilder.addService(new MyTxEventService(connected.get(port), 
eventsMap.get(port), delays.get(port)));
+    Server server = serverBuilder.build();
+
+    try {
+      server.start();
+      servers.put(port, server);
+    } catch (IOException e) {
+      fail(e.getMessage());
+    }
+  }
+
+  private static SslContextBuilder getSslContextBuilder() {
+    ClassLoader classLoader = 
LoadBalanceClusterMessageSenderWithTLSTest.class.getClassLoader();
+    SslContextBuilder sslClientContextBuilder = SslContextBuilder.forServer(
+        new File(classLoader.getResource("server.crt").getFile()),
+        new File(classLoader.getResource("server.pem").getFile()))
+        .protocols("TLSv1.2","TLSv1.1")
+        .ciphers(Arrays.asList("ECDHE-RSA-AES128-GCM-SHA256",
+            "ECDHE-RSA-AES256-GCM-SHA384",
+            "ECDHE-ECDSA-AES128-SHA256"));
+
+      sslClientContextBuilder.trustManager(new 
File(classLoader.getResource("client.crt").getFile()));
+      sslClientContextBuilder.clientAuth(ClientAuth.REQUIRE);
+
+    return GrpcSslContexts.configure(sslClientContextBuilder,
+        SslProvider.OPENSSL);
+  }
+
+  @Test
+  public void considerFasterServerFirst() throws Exception {
+    // we don't know which server is selected at first
+    messageSender.send(event);
+
+    // but now we only send to the one with lowest latency
+    messageSender.send(event);
+    messageSender.send(event);
+    messageSender.send(event);
+
+    assertThat(eventsMap.get(8080).size(), is(3));
+    assertThat(eventsMap.get(8090).size(), is(1));
+  }
+
+  @Test
+  public void broadcastConnectionAndDisconnection() throws Exception {
+    messageSender.onConnected();
+    await().atMost(1, SECONDS).until(() -> !connected.get(8080).isEmpty() && 
!connected.get(8090).isEmpty());
+
+    assertThat(connected.get(8080), contains("Connected " + serviceName));
+    assertThat(connected.get(8090), contains("Connected " + serviceName));
+
+    messageSender.onDisconnected();
+    assertThat(connected.get(8080), contains("Connected " + serviceName, 
"Disconnected " + serviceName));
+    assertThat(connected.get(8090), contains("Connected " + serviceName, 
"Disconnected " + serviceName));
+  }
+}
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSenderTest.java
 
b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSenderTest.java
index e8b2f345..f26fb267 100644
--- 
a/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSenderTest.java
+++ 
b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSenderTest.java
@@ -64,49 +64,13 @@
 import io.grpc.ServerBuilder;
 import io.grpc.stub.StreamObserver;
 
-public class LoadBalancedClusterMessageSenderTest {
-
-  private static final int[] ports = {8080, 8090};
-  private static final Map<Integer, Server> servers = new HashMap<>();
-
-  private static final Map<Integer, Integer> delays = new HashMap<Integer, 
Integer>() {{
-    put(8080, 0);
-    put(8090, 800);
-  }};
-
-  private static final Map<Integer, Queue<String>> connected = new 
HashMap<Integer, Queue<String>>() {{
-    put(8080, new ConcurrentLinkedQueue<>());
-    put(8090, new ConcurrentLinkedQueue<>());
-  }};
-
-  private static final Map<Integer, Queue<TxEvent>> eventsMap = new 
HashMap<Integer, Queue<TxEvent>>() {{
-    put(8080, new ConcurrentLinkedQueue<>());
-    put(8090, new ConcurrentLinkedQueue<>());
-  }};
-
-  private final MessageSerializer serializer = objects -> 
objects[0].toString().getBytes();
-
-  private final MessageDeserializer deserializer = message -> new Object[] 
{new String(message)};
-
-  private final List<String> compensated = new ArrayList<>();
-
-  private final MessageHandler handler = (globalTxId, localTxId, parentTxId, 
compensationMethod,
-      payloads) -> compensated.add(globalTxId);
-
-  private final String globalTxId = uniquify("globalTxId");
-  private final String localTxId = uniquify("localTxId");
-  private final String parentTxId = uniquify("parentTxId");
-  private final String compensationMethod = getClass().getCanonicalName();
-  private final TxEvent event = new TxEvent(EventType.TxStartedEvent, 
globalTxId, localTxId, parentTxId,
-      compensationMethod, 0, "", 0, "blah");
-
-  private final String serviceName = uniquify("serviceName");
-  private final String[] addresses = {"localhost:8080", "localhost:8090"};
-  private final MessageSender messageSender = newMessageSender(addresses);
-
-  private MessageSender newMessageSender(String[] addresses) {
+public class LoadBalancedClusterMessageSenderTest extends 
LoadBalancedClusterMessageSenderTestBase {
+  @Override
+  protected MessageSender newMessageSender(String[] addresses) {
+    AlphaClusterConfig clusterConfig = new 
AlphaClusterConfig(Arrays.asList(addresses),
+        false, false, null,null,null);
     return new LoadBalancedClusterMessageSender(
-        addresses,
+        clusterConfig,
         serializer,
         deserializer,
         new ServiceConfig(serviceName),
@@ -132,19 +96,6 @@ private static void startServerOnPort(int port) {
     }
   }
 
-  @AfterClass
-  public static void tearDown() throws Exception {
-    servers.values().forEach(Server::shutdown);
-  }
-
-  @After
-  public void after() throws Exception {
-    messageSender.onDisconnected();
-    messageSender.close();
-    eventsMap.values().forEach(Queue::clear);
-    connected.values().forEach(Queue::clear);
-  }
-
   @Test
   public void resendToAnotherServerOnFailure() throws Exception {
     messageSender.send(event);
@@ -330,70 +281,4 @@ private int killServerReceivedMessage() {
     }
     throw new IllegalStateException("None of the servers received any 
message");
   }
-
-  private static class MyTxEventService extends TxEventServiceImplBase {
-    private final Queue<String> connected;
-    private final Queue<TxEvent> events;
-    private final int delay;
-
-    private StreamObserver<GrpcCompensateCommand> responseObserver;
-
-    private MyTxEventService(Queue<String> connected, Queue<TxEvent> events, 
int delay) {
-      this.connected = connected;
-      this.events = events;
-      this.delay = delay;
-    }
-
-    @Override
-    public void onConnected(GrpcServiceConfig request, 
StreamObserver<GrpcCompensateCommand> responseObserver) {
-      this.responseObserver = responseObserver;
-      connected.add("Connected " + request.getServiceName());
-    }
-
-    @Override
-    public void onTxEvent(GrpcTxEvent request, StreamObserver<GrpcAck> 
responseObserver) {
-      events.offer(new TxEvent(
-          EventType.valueOf(request.getType()),
-          request.getGlobalTxId(),
-          request.getLocalTxId(),
-          request.getParentTxId(),
-          request.getCompensationMethod(),
-          request.getTimeout(),
-          request.getRetryMethod(),
-          request.getRetries(),
-          new String(request.getPayloads().toByteArray())));
-
-      sleep();
-
-      if (EventType.TxAbortedEvent.name().equals(request.getType())) {
-        this.responseObserver.onNext(GrpcCompensateCommand
-            .newBuilder()
-            .setGlobalTxId(request.getGlobalTxId())
-            .build());
-      }
-
-      if ("TxStartedEvent".equals(request.getType()) && 
request.getCompensationMethod().equals("reject")) {
-        responseObserver.onNext(GrpcAck.newBuilder().setAborted(true).build());
-      } else {
-        
responseObserver.onNext(GrpcAck.newBuilder().setAborted(false).build());
-      }
-
-      responseObserver.onCompleted();
-    }
-
-    private void sleep() {
-      try {
-        Thread.sleep(delay);
-      } catch (InterruptedException e) {
-        fail(e.getMessage());
-      }
-    }
-
-    @Override
-    public void onDisconnected(GrpcServiceConfig request, 
StreamObserver<GrpcAck> responseObserver) {
-      connected.add("Disconnected " + request.getServiceName());
-      responseObserver.onNext(GrpcAck.newBuilder().build());
-      responseObserver.onCompleted();
-    }
-  }
 }
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSenderTestBase.java
 
b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSenderTestBase.java
new file mode 100644
index 00000000..00c8bef4
--- /dev/null
+++ 
b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/saga/omega/connector/grpc/LoadBalancedClusterMessageSenderTestBase.java
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.omega.connector.grpc;
+
+import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+import org.apache.servicecomb.saga.common.EventType;
+import org.apache.servicecomb.saga.omega.context.ServiceConfig;
+import org.apache.servicecomb.saga.omega.transaction.MessageDeserializer;
+import org.apache.servicecomb.saga.omega.transaction.MessageHandler;
+import org.apache.servicecomb.saga.omega.transaction.MessageSender;
+import org.apache.servicecomb.saga.omega.transaction.MessageSerializer;
+import org.apache.servicecomb.saga.omega.transaction.TxEvent;
+import org.apache.servicecomb.saga.pack.contract.grpc.GrpcAck;
+import org.apache.servicecomb.saga.pack.contract.grpc.GrpcCompensateCommand;
+import org.apache.servicecomb.saga.pack.contract.grpc.GrpcServiceConfig;
+import org.apache.servicecomb.saga.pack.contract.grpc.GrpcTxEvent;
+import 
org.apache.servicecomb.saga.pack.contract.grpc.TxEventServiceGrpc.TxEventServiceImplBase;
+import org.junit.After;
+import org.junit.AfterClass;
+
+import io.grpc.Server;
+import io.grpc.stub.StreamObserver;
+
+public abstract class LoadBalancedClusterMessageSenderTestBase {
+  protected static final int[] ports = {8080, 8090};
+
+  protected static final Map<Integer, Server> servers = new HashMap<>();
+
+  protected static final Map<Integer, Integer> delays = new HashMap<Integer, 
Integer>() {{
+    put(8080, 0);
+    put(8090, 800);
+  }};
+
+  protected static final Map<Integer, Queue<String>> connected = new 
HashMap<Integer, Queue<String>>() {{
+    put(8080, new ConcurrentLinkedQueue<>());
+    put(8090, new ConcurrentLinkedQueue<>());
+  }};
+
+  protected static final Map<Integer, Queue<TxEvent>> eventsMap = new 
HashMap<Integer, Queue<TxEvent>>() {{
+    put(8080, new ConcurrentLinkedQueue<>());
+    put(8090, new ConcurrentLinkedQueue<>());
+  }};
+
+  protected final List<String> compensated = new ArrayList<>();
+
+  protected final String globalTxId = uniquify("globalTxId");
+
+  protected final String localTxId = uniquify("localTxId");
+
+  protected final String parentTxId = uniquify("parentTxId");
+
+  protected final String compensationMethod = getClass().getCanonicalName();
+
+  protected final TxEvent event = new TxEvent(EventType.TxStartedEvent, 
globalTxId, localTxId, parentTxId,
+      compensationMethod, 0, "", 0, "blah");
+
+  protected final String serviceName = uniquify("serviceName");
+
+  protected final MessageSerializer serializer = objects -> 
objects[0].toString().getBytes();
+
+  protected final MessageDeserializer deserializer = message -> new Object[] 
{new String(message)};
+
+  protected final MessageHandler handler = (globalTxId, localTxId, parentTxId, 
compensationMethod,
+      payloads) -> compensated.add(globalTxId);
+
+  protected final String[] addresses = {"localhost:8080", "localhost:8090"};
+
+  protected final MessageSender messageSender = newMessageSender(addresses);
+
+  @AfterClass
+  public static void tearDown() throws Exception {
+    servers.values().forEach(Server::shutdown);
+  }
+
+  protected abstract MessageSender newMessageSender(String[] addresses);
+
+  @After
+  public void after() throws Exception {
+    messageSender.onDisconnected();
+    messageSender.close();
+    eventsMap.values().forEach(Queue::clear);
+    connected.values().forEach(Queue::clear);
+  }
+
+  protected static class MyTxEventService extends TxEventServiceImplBase {
+    private final Queue<String> connected;
+    private final Queue<TxEvent> events;
+    private final int delay;
+
+    private StreamObserver<GrpcCompensateCommand> responseObserver;
+
+    protected MyTxEventService(Queue<String> connected, Queue<TxEvent> events, 
int delay) {
+      this.connected = connected;
+      this.events = events;
+      this.delay = delay;
+    }
+
+    @Override
+    public void onConnected(GrpcServiceConfig request, 
StreamObserver<GrpcCompensateCommand> responseObserver) {
+      this.responseObserver = responseObserver;
+      connected.add("Connected " + request.getServiceName());
+    }
+
+    @Override
+    public void onTxEvent(GrpcTxEvent request, StreamObserver<GrpcAck> 
responseObserver) {
+      events.offer(new TxEvent(
+          EventType.valueOf(request.getType()),
+          request.getGlobalTxId(),
+          request.getLocalTxId(),
+          request.getParentTxId(),
+          request.getCompensationMethod(),
+          request.getTimeout(),
+          request.getRetryMethod(),
+          request.getRetries(),
+          new String(request.getPayloads().toByteArray())));
+
+      sleep();
+
+      if (EventType.TxAbortedEvent.name().equals(request.getType())) {
+        this.responseObserver.onNext(GrpcCompensateCommand
+            .newBuilder()
+            .setGlobalTxId(request.getGlobalTxId())
+            .build());
+      }
+
+      if ("TxStartedEvent".equals(request.getType()) && 
request.getCompensationMethod().equals("reject")) {
+        responseObserver.onNext(GrpcAck.newBuilder().setAborted(true).build());
+      } else {
+        
responseObserver.onNext(GrpcAck.newBuilder().setAborted(false).build());
+      }
+
+      responseObserver.onCompleted();
+    }
+
+    private void sleep() {
+      try {
+        Thread.sleep(delay);
+      } catch (InterruptedException e) {
+        fail(e.getMessage());
+      }
+    }
+
+    @Override
+    public void onDisconnected(GrpcServiceConfig request, 
StreamObserver<GrpcAck> responseObserver) {
+      connected.add("Disconnected " + request.getServiceName());
+      responseObserver.onNext(GrpcAck.newBuilder().build());
+      responseObserver.onCompleted();
+    }
+  }
+}
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/test/resources/ca.crt 
b/omega/omega-connector/omega-connector-grpc/src/test/resources/ca.crt
new file mode 100644
index 00000000..6a524662
--- /dev/null
+++ b/omega/omega-connector/omega-connector-grpc/src/test/resources/ca.crt
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE/TCCAuWgAwIBAgIJAPdGaDoSrNMoMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
+BAMMCWxvY2FsaG9zdDAgFw0xODA1MDMwMjQ1NTFaGA8yMjkyMDIxNTAyNDU1MVow
+FDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAmyOahET4IFyx24VdszCkhTYwnRvQBHWntSac1nwnQx4fJg1VEtBh2Yz0
+5id6S9CAugLWof8E5Fz8/2rx+UWwCk7zP/F1nHKMyRBwnv0TWez4o9nFdCc2J2NJ
+WB84m3sXkipcKtCb8godHaQ4euze4XumDEceYpovkwHnoSglK7hhOL/h7M8lISNB
+Q+iZdimALsXL8FR10vHxHGH7clEWWvQ1FUtD+THNVLJ/E/nFE/8i+Jv3N0i6Ga6y
+vyROcdq2eCMzaZmertNCUL0NR54JvKX8IeHg4fyOZDam2f1G0n0t0WbyyIghpz4I
+1K5j1enhdUMlbywCtO3Mx9dSpWJUWh5d20MzCXQKCSz3D0bN0N+SbEpv3Fzj1m5h
+oP4Dc+PVNKHC6U/K46sp3SfYlI8V9/zaHk1VyqLNQiq155F4CZ3iGFl0D5F7Ylyn
+ju2B5cOAy6451tickhHh1xk6vRtkSTAJEQApDmL7byllggEMUPYmDkH0rqAKj4sZ
+OZgxJXxGnvgrgeW86nVMxtyoZkh7yaK2Nf8RSmvuL6rJtpzoQaJ5ohXaAe07GHar
+t+KPU8Yqejq9R/hqbfLBybaMxMx+gCvOI72/lGV4jZi8vZlnGW8RjLUYfqBwjW1d
+cjDvgc5RIF4kL88oTBoCBfdcO4p6tuxlb7THWQSwgekUH5wDHjECAwEAAaNQME4w
+HQYDVR0OBBYEFAd030aW8cqK+JSzoX/5+FOUAcvrMB8GA1UdIwQYMBaAFAd030aW
+8cqK+JSzoX/5+FOUAcvrMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIB
+AHQ2VSIGnKqnJJa5AT4iYbkpAWjsndP8QdQyCVey37r4u9yyaoIUuf5XXcbszICg
+Vtzt58lyV+NU7t3vMmYoKDHyO7Jdhddr2H4augSGElIbM3qRcMvxIPhTcxr1le1L
+FaUz+Q3004h+QIqAThEEzWed65A/ttlwX3uDzhiBGR3cX7U/7f/zmE1uCd/0R3nx
+yVAjzX5tuHmozd5xTDQZkzdPD8BViCGrjNlsraMiOL65RTwdPPU6h7z0ZlAe4L70
+Dl12kTZ+G+n94+HPCc/vl5JRb26lJW4SUOc1Cy2f2E+GiS/sE05fpA18cErDm7Sm
+H3W/25NR7QaADYXlZut6YjgLr19aMAwUUjfMstAxZZbo2nBjIwZrhKi1k4Wg/COp
+SMK+T2MkxtCIE76MLzVzJa/yF8vcpzJiqKEi4WNZ5Yf27V0/9TGFSoDlEZmAMJrB
+m/BDcubI2CUPyvVZBjhEClNypJtR7pK/uNJoTeOXt5g3RcAxUV+t6OYD/gfsrwrT
+1SGoKNEx7FbfXtxPA+mYyy+zsK4baVh6k/6s+d+/QLmRJ9SJIoJabnx82NNJK87l
+CBkYLd3HnaImUJKuFXqK1AwqBCjNmmxEUxwCkYz+TGz2xMdLd6GQ5bB3RQin0oag
+Ti9/aublYImvlhaNOkrDYWfRHK4Cg43kyrh/2DuZgVNz
+-----END CERTIFICATE-----
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/test/resources/client.crt 
b/omega/omega-connector/omega-connector-grpc/src/test/resources/client.crt
new file mode 100644
index 00000000..5f5fcc2e
--- /dev/null
+++ b/omega/omega-connector/omega-connector-grpc/src/test/resources/client.crt
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEnjCCAoYCAQEwDQYJKoZIhvcNAQELBQAwFDESMBAGA1UEAwwJbG9jYWxob3N0
+MCAXDTE4MDUwMzAyNDU1M1oYDzIyOTIwMjE1MDI0NTUzWjAUMRIwEAYDVQQDDAls
+b2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDaFMiK66AO
+u2t2Q1jdNd0QimkHNWXnlP1bS2ExqOBmRTMnyK5t7WDwqvYPqLzn8ukko4l11RcK
+4w/hKLu1oNpp8ofH3TXrhNToMt3czCPFPUnWSYYau9Wb6MwybUA2coDcTYFHkGyk
+eA8DSIS9EGyIMlhqbBNvlbHeZLExD2JqSPA3GCQY0S6YAjjDPdBS0D/8wpptZ8zD
+4EtjwJw5/DvBuihaGSRH35te7klYOJTgn+Ag8D/YUBkDiBGKn0luQggeg2LNSamL
+QrECIMdWlr0JVNnzhXI2czOw49JOoaG7AZzpHMX23n+VLqQi4S/vqsKd6DCJfoAa
+P03xqR/F/uRLIbSMZ1xD1FSVVkyTxMYPi9+amcIaZZ8vyxRegIgVufs1eTBaR9wr
+1UnC7j7LBet3YeWLud5JOyKOsa9KTG66qWNQU6a+RR2hbwTZfpHGFX1U0wzfhbZJ
+pTVzjeuLzf8dLZc+AN+2HvFbJloVGH7hyMHJ3KgqRvXwaLCD6ZWrail51+xOPLN/
+/BRcoQYbcGOveb68GAaHqpattuJnlUN3S5ZgbLT2IEySF7V3nes1/jSbJ/jWrT/h
+GrknHQjx050b5q9g1lNmRooIBzhlTp3iFA+UcyQWjJ1cTcZZTt2OI/eYyXhPc+Zc
+NIMeDpc+WiEVS2Wbv61lqfAoxYEN7eMuYQIDAQABMA0GCSqGSIb3DQEBCwUAA4IC
+AQCTiEHWxAPHoKc5WUZhTE0g8lB4xQgMvuJCebbvSa4wxbwWkcOAnEsREhi11VLR
+RqD5eBlsUiUhCLLmK746QX6UasDlOBkLQe1EFgnOJCtgOVUiunB3wBSu6aL6SiXS
+bncYVikcIVIN+GLrF3tHiJJyxvWUxgiZCoxL5Ia+qdpWAqYY80rauK96rVkcLkNb
+oFoFnQgRYl9z0aQuB5BQdBOaRLZRnFB2lxKn/eLyAdNRQ7+YHBm9J4hfVw+hnIr6
+U1cR+ocfofRQdvtcn0ZL3rqoG/ePuTW+ZjBFhRA2doClLpUGqNdXqKbb4sAsTUea
+lfnf+fBRQFil/b+FB+mzSifu3+97vbbRTmMhL8F/ZNFAuLBHsYKfW5434LYflt79
+XeuVU2lfzkauVvov2oZN1YH6BwQEaXjNmnd7JXZaCQLSYi4KXy9Rf5q6NRBYKJv7
+Jdgnx9wdYGxG1PNrhQESAaCD6ac1zTufFVHZHypXQNQ4BQk5Nc3KDH4JWT2FT2Zi
+tR/AoOnqTwsHr6YaROIgZXKOPjnbdK8ftIIyM62gjotS6pZG0CdVefOFuGyHnZkB
+rPA598NDvu9df1NyeDEtXcP2aZnAlLbUlUzrUCWVgzcjH/wGvnSwouSHhGk3g0ky
+DNyD+fx/nWh0K9/0osO39OfHsgUo5/gl/oP294SGBM0voQ==
+-----END CERTIFICATE-----
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/test/resources/client.pem 
b/omega/omega-connector/omega-connector-grpc/src/test/resources/client.pem
new file mode 100644
index 00000000..cff88b3d
--- /dev/null
+++ b/omega/omega-connector/omega-connector-grpc/src/test/resources/client.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+1ziBzxwR75M+tXNoZkpPK1QJtmBt20w=
+-----END PRIVATE KEY-----
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/test/resources/server.crt 
b/omega/omega-connector/omega-connector-grpc/src/test/resources/server.crt
new file mode 100644
index 00000000..b1e50548
--- /dev/null
+++ b/omega/omega-connector/omega-connector-grpc/src/test/resources/server.crt
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEnjCCAoYCAQEwDQYJKoZIhvcNAQELBQAwFDESMBAGA1UEAwwJbG9jYWxob3N0
+MCAXDTE4MDUwMzAyNDU1MloYDzIyOTIwMjE1MDI0NTUyWjAUMRIwEAYDVQQDDAls
+b2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC1rKNt//lp
+mcvz4IACa8Axsgg7W/lq4xwGbHMsQIdbGwB9lFC72MinSWgd0jPrw6YK7CPmQ9V9
+SqYWox2PEL+mCuajgTX4/ynVLRrcBbf6QLLVChVr6Bteq9mjqq+zQ/gEV1zMTfkw
+HFpVmoCijkr+sK0xlkCJQsNSt8h7Rb3D+UhqF/8v8VkyXK441KExm4FHW8+7ec1Y
+6CfUJdVBrH73gxMAsLoXmimq0gtb2mbVBJR6m8j3g7QUwbO6fcz0AxC22kzLVyhU
+0qvPXo2EP/VFzv9V+9f0rljxu8AwDsQjlqXaOQ+ijpmc/XBz3h0eBSUTWYK7kUKO
+CrxcvpQCf39OD9AjgIukjRP2cM9wzMt1nk1Llv+rSMdHQMN5nhybTlsBwV/xU9LQ
+GDKvPKydtzQxPC7UCsm1fivH06x8gaYn2yCreuGd5XXeS+IkdHSuGtebRk4LKN/k
+kGDE341yfeU6ByKwCQcQcWCHY3gHj89F4moL24YBtM4QSJb9PdrF6CxN6ynU06rS
+rr5lfaT4e68sjI0wjTU5oNVCWzLko/ig/lZgGPgrgXg3m9oYNNOtPgTRt7VR1anM
++4ml0QRC/fiyHqQkinkjhdotWLxRiWTgClnuQz4co46AnfgE7K/rwCvfTol+r18L
+Vd2yCSWEzpmTsgxK/e0pvh91rS6ti2d8QQIDAQABMA0GCSqGSIb3DQEBCwUAA4IC
+AQB1hg0WxLU24jvMr5xW47iunqrtY9JPACMHVtvjrcULSLrVWIR5/DlsLc/cX4d8
+2152B4MTtzvpDVjKoaY5MCTrRv67JnPu0GYJGTpGbPmOTxKv8foK5E6XJKA3bVeQ
+hh/De7+C2+TCewDy+JMg3AjctMty2L2NpYeBpTRRJYxpfap+AEPawy88esX/C2J4
+iuiSzRdtJz4Q4PVl3XrP/2q2i5EiH28vq8wNOSFl7PpKiHSfppgIpPrJplqGu67F
+sKLRHGv1MOTmY8+vayChwmaqi6KgUkQQ4/zoeO526O6P9GD6ggyfSzk9/MxZWOMy
+PCbF82ibh8XUSc+Gxa/8yJ2Nlr791qqNYZIwsWpT9wGK+KEKsc8Myu4jipsFUpA+
+sJL3/3i23c+DUjssbD6vSA70U6joi81yThZ7n+AGttx44WGlTmnnYtFzFuBwAHxg
+RvwtYNIvTTrpOM51Je2YoTqpUe7o2DqQHIXOwDMOQUBTOwuaXMyqbiNWypnI0Fvm
+3xkgOLRU/9rQAa+NGdZtEaxJLTv7aqDJqcp76ihlCPTwxNWHaVNpIGh4NMMMgEON
+vLkBAZ8uZcDtgVzgfWuNshlvEDD9m/QJPIQLmVMWStV9lkHQuCw61oLlgU2yB88O
+Abgz0WIJUBiGbFrOwUa6gXYMB8FgPe3deLXhJBrsDoeucQ==
+-----END CERTIFICATE-----
diff --git 
a/omega/omega-connector/omega-connector-grpc/src/test/resources/server.pem 
b/omega/omega-connector/omega-connector-grpc/src/test/resources/server.pem
new file mode 100644
index 00000000..ad6f8f7f
--- /dev/null
+++ b/omega/omega-connector/omega-connector-grpc/src/test/resources/server.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQC1rKNt//lpmcvz
+4IACa8Axsgg7W/lq4xwGbHMsQIdbGwB9lFC72MinSWgd0jPrw6YK7CPmQ9V9SqYW
+ox2PEL+mCuajgTX4/ynVLRrcBbf6QLLVChVr6Bteq9mjqq+zQ/gEV1zMTfkwHFpV
+moCijkr+sK0xlkCJQsNSt8h7Rb3D+UhqF/8v8VkyXK441KExm4FHW8+7ec1Y6CfU
+JdVBrH73gxMAsLoXmimq0gtb2mbVBJR6m8j3g7QUwbO6fcz0AxC22kzLVyhU0qvP
+Xo2EP/VFzv9V+9f0rljxu8AwDsQjlqXaOQ+ijpmc/XBz3h0eBSUTWYK7kUKOCrxc
+vpQCf39OD9AjgIukjRP2cM9wzMt1nk1Llv+rSMdHQMN5nhybTlsBwV/xU9LQGDKv
+PKydtzQxPC7UCsm1fivH06x8gaYn2yCreuGd5XXeS+IkdHSuGtebRk4LKN/kkGDE
+341yfeU6ByKwCQcQcWCHY3gHj89F4moL24YBtM4QSJb9PdrF6CxN6ynU06rSrr5l
+faT4e68sjI0wjTU5oNVCWzLko/ig/lZgGPgrgXg3m9oYNNOtPgTRt7VR1anM+4ml
+0QRC/fiyHqQkinkjhdotWLxRiWTgClnuQz4co46AnfgE7K/rwCvfTol+r18LVd2y
+CSWEzpmTsgxK/e0pvh91rS6ti2d8QQIDAQABAoICAQCGCINeoW6CYWxeVfA7WQGn
+6GA4Ywfluv6vIo3qRQVXytkWzTivDiYjfX3qGm4h7+ttvYBS3xL/5/YXV2p0ZXfv
+abV1RdvrA136n9dkInf0ko0drd3WCZ0/wGvGWyRbjrbJhSa6uIAy5YgkBeQHihF8
+TB7LKb4dRntSaLLpd6+kiSLK2z9zQI19IXGMDhuKvN6pJexhtWAxyr2vv+XRGRFn
+THXVmY0B4sQA+gxVTRF28XUV7B9dtPZEJhCSc0Oldyl6rh3gG0JvKiqFyI2B16n+
+QdSRvEc8hvCqD8mf6xT76KYeFOEbHjfo4fZ4FZPH1SXgW7ae6XF/2B3WEuih2yyw
+zbN3weXDN2hjurCmlkZvjBurfTezRgaKG6ccOxPm9LVMh836lvE1aANy47EJuwqp
+/FeRz5b7awgepWm1e+4MKdoughw8IRRw8IzswSG/A2Y0hx+jBtQeNMyRd0/t+Zks
+QyY64c1B17d1Y/9Am4bb0gy9Bhn/RUeJsKs+IuZ1sqQP7gicJLJr7RAkSn7/f4pf
+kawKSwsvuuEjwTIdbWpkna/2zS6zW2Shv+/mpVqWhM9CYVwT5lV9AJweVVxsp8QE
+3oi/4rCWh0eooxObanvhmk7ZLScuzIMIO32nW5LxKtyQMrOCk8YCbMOzhZRu1RFW
+SAZ+Q2t4NUE1a5JVEFNp0QKCAQEA2LqQuLaHQoBebjJvxCD74agHTi1tFCdH+gHs
+SgZENg495Gjx1/qhtyEunc/FepNfbdhi34f3dx4MCAL90HJe1pXgf30P7HdOdo3s
+kiN7aYSaDLAhGZs3om1kxdJjlooi5aULYFRuPbVtfWRZiiHyiweAIC37vLHej4ax
+QdgKaelBU6+W1bf5HcZkCQcPwpwo++e2LBlM8/vndpQZ9rxIzazyY3tKA5wKtQ21
+aV2wjGbERXlN9YEHdajLcD2U18mTES+qgWc/VcyPQSiQnqzy1EMYQEi/Yx6dEq4q
+bx8gYoqo+ujgucvfl5wD730o7Cmfe2LXQoJKM0mxiCRJ60daDQKCAQEA1pf/nr5W
+HLuHxW08CvFGrZNxIAqHB3fbpIG1z2M5ISP5XrehQt1ntUZTy6vguULqAfZoUiGH
+oW5k0BIUepMthqZ17YBGovhAJOL4Woi6KPMb7JA8zStkvj35omoXZ3KcGnkKwUDk
+KDF+bNptBtF2+tpvzbX0AMn9fDEacSKQ1X3y4sZRzuBiXbNdSYspLprXaF31Y4Ki
+z0Ug//vJ0PAyeIcjVa3Xs47g56hwC7x9qcxlMigUXGKB8SQt/6iBk/xM2nWSCfT1
+3fxTZaUeCGYEt+fP2pnaNM5Bkt74y7D+CUhaM5tr6b5dAWhS75+5/QanHISvSqzi
+FyqoEC5c2wEiBQKCAQEAxPaIn9YChwVyzGM5/9yaDTJPsVTHVRF98E/fFkcrppS6
+2uIlKEu2vF+Dphg1OHjGuWV2Nf+zfqXn+T/+u3m1hv8ez74wwo6K2GOTJBzrA7Jm
+7jEDY+oUXaFdfAsARsezf1DHTfxtU9eWcebJGShQ7NkcMCKaLZrY0UdvwI8+p5I8
+tHlXc1OHKvAp6appQEv7UzP584nqzbGZYcKm9f2XjJQolRBu62jcsj6LJ/7lfDPJ
+G/pqRzvEM8H7YT4WDyY6adwP8RqMDMWjS2w6QnqbFR0E5Sc4CDTCOz/dgK+hFu09
+NQp/cVs/EOHREc2Fa1tIfTIOv3r5RDMtDLUuGIz34QKCAQEAvSoyCBJKwHtDHPLE
+yfSUVDAzuYXuL9QlRyecSBt0YdVfXnJK8jFP2UkMVu7FYyosM9ytazDpaZFxxsUZ
+Tk/tAtQ8AkdgfQqPKLT3Ln92cuCTDf67yjRlUxo4s0YIKYWrO97VbzOvrAqtInGN
+SERfOJRTmCe71vI3xEFYyMAqojerYuJlfRLpQyX4pvrIK7ANEJA63yRqNoH+rAid
+h9Qk+YBO0pkzGrJpaWxekMnwkDyAPC1+fU3Ms/ArqEE3MGdoq+6V9Lb+AVgLf/+E
+sOyVXjQ3UsDqzD/BKCHreUslNLOV6AYqo1rOi44WBetsPTKfHxGLoC00BC3zBoiI
+C/o8rQKCAQBASxZ4xcJ61aWwdCbk5PTM6fJoF6aZlOkWf1CQTgN8H2BPRLm/LEkh
+FB9Z3g3FEZhhFaZMkxVRKp3Tit82k288Tpfx3H0ugnh7ftPUnSezNic5dHUnXuxq
+Dew+lKg9F2dYmD2aLWvzjbgj4Ab7if3cFCZrJoR4YhSLnZYQZeaiQ2oUVu2aVxf6
+GeRsC8LQPT/hftJDfs3UFWlvzv3HRrIB5dRCgR6rUomXLJ+jT7LcCEk8QXCxQ8T0
+lVGh6fxu0snXrAobEcNEFGI9KGecIeXVP1x2uiTe7S8+IJxLKUXFRHuVfj/fh6MH
+p1ExithNKfNT+kZJnYPRBnc8FJRiIgDA
+-----END PRIVATE KEY-----
diff --git 
a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java
 
b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java
index 14220255..af0ccbc4 100644
--- 
a/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java
+++ 
b/omega/omega-spring-starter/src/main/java/org/apache/servicecomb/saga/omega/spring/OmegaSpringConfig.java
@@ -17,6 +17,10 @@
 
 package org.apache.servicecomb.saga.omega.spring;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.apache.servicecomb.saga.omega.connector.grpc.AlphaClusterConfig;
 import 
org.apache.servicecomb.saga.omega.connector.grpc.LoadBalancedClusterMessageSender;
 import org.apache.servicecomb.saga.omega.context.CompensationContext;
 import org.apache.servicecomb.saga.omega.context.IdGenerator;
@@ -59,14 +63,21 @@ ServiceConfig 
serviceConfig(@Value("${spring.application.name}") String serviceN
 
   @Bean
   MessageSender grpcMessageSender(
-      @Value("${alpha.cluster.address}") String[] addresses,
+      @Value("${alpha.cluster.address:localhost:8080}") String[] addresses,
+      @Value("${alpha.cluster.ssl.enable:false}") boolean enableSSL,
+      @Value("${alpha.cluster.ssl.enableMutualAuth:false}") boolean 
enableMutualAuth,
+      @Value("${alpha.cluster.ssl.cert:client.crt}") String cert,
+      @Value("${alpha.cluster.ssl.key:client.pem}") String key,
+      @Value("${alpha.cluster.ssl.certChain:ca.cert}") String certChain,
       @Value("${omega.connection.reconnectDelay:3000}") int reconnectDelay,
       ServiceConfig serviceConfig,
       @Lazy MessageHandler handler) {
 
     MessageFormat messageFormat = new KryoMessageFormat();
+    AlphaClusterConfig clusterConfig = new 
AlphaClusterConfig(Arrays.asList(addresses),
+        enableSSL, enableMutualAuth, cert, key, certChain);
     MessageSender sender = new LoadBalancedClusterMessageSender(
-        addresses,
+        clusterConfig,
         messageFormat,
         messageFormat,
         serviceConfig,
diff --git a/pom.xml b/pom.xml
index d99ce86c..7a38733e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,7 +54,7 @@
     <akka.version>2.5.6</akka.version>
     <rat.version>0.12</rat.version>
     <maven.failsafe.version>2.19.1</maven.failsafe.version>
-    <grpc.version>1.8.0</grpc.version>
+    <grpc.version>1.11.0</grpc.version>
     <kryo.version>4.0.1</kryo.version>
     <javax.transaction.version>1.2</javax.transaction.version>
     <eclipse.link.version>2.7.1</eclipse.link.version>
@@ -63,6 +63,7 @@
     <jaxb.version>2.3.0</jaxb.version>
     <javax.activation.version>1.1.1</javax.activation.version>
     <maven-dependency-plugin.version>3.0.2</maven-dependency-plugin.version>
+    <netty.version>2.0.7.Final</netty.version>
   </properties>
 
   <name>ServiceComb Saga</name>
@@ -305,6 +306,11 @@
         <artifactId>grpc-netty</artifactId>
         <version>${grpc.version}</version>
       </dependency>
+      <dependency>
+        <groupId>io.netty</groupId>
+        <artifactId>netty-tcnative-boringssl-static</artifactId>
+        <version>${netty.version}</version>
+      </dependency>
       <dependency>
         <groupId>io.grpc</groupId>
         <artifactId>grpc-protobuf</artifactId>
diff --git a/saga-demo/booking/booking/src/main/resources/application.yaml 
b/saga-demo/booking/booking/src/main/resources/application.yaml
index ef8f8336..612b5258 100644
--- a/saga-demo/booking/booking/src/main/resources/application.yaml
+++ b/saga-demo/booking/booking/src/main/resources/application.yaml
@@ -20,3 +20,9 @@ spring:
 alpha:
   cluster:
     address: alpha-server.servicecomb.io:8080
+    ssl:
+      enable: false
+      certChain: ca.crt
+      enableMutualAuth: false
+      cert: client.crt
+      key: client.pem
diff --git a/saga-demo/booking/car/src/main/resources/application.yaml 
b/saga-demo/booking/car/src/main/resources/application.yaml
index 2a1c2b7a..47afd621 100644
--- a/saga-demo/booking/car/src/main/resources/application.yaml
+++ b/saga-demo/booking/car/src/main/resources/application.yaml
@@ -20,3 +20,10 @@ spring:
 alpha:
   cluster:
     address: alpha-server.servicecomb.io:8080
+    ssl:
+      enable: false
+      certChain: ca.crt
+      enableMutualAuth: false
+      cert: client.crt
+      key: client.pem
+
diff --git a/saga-demo/booking/pom.xml b/saga-demo/booking/pom.xml
index bc9a9f80..b5076181 100644
--- a/saga-demo/booking/pom.xml
+++ b/saga-demo/booking/pom.xml
@@ -39,5 +39,9 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
     </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-tcnative-boringssl-static</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/saga-distribution/src/release/LICENSE 
b/saga-distribution/src/release/LICENSE
index f2fad136..22d885ae 100644
--- a/saga-distribution/src/release/LICENSE
+++ b/saga-distribution/src/release/LICENSE
@@ -339,6 +339,13 @@ Eclipse Public License v1.0.
 For details, see https://github.com/javaee/jpa-spec
 You can find a copy of the License at licenses/LICENSE-epl-v10
 
+===========================================================================
+For Boringssl(static library bundled in 
netty-tcnative-boringssl-static:2.0.7.Final)
+===========================================================================
+This product bundles Boringssl which is licensed under BSD style licenses.
+For details, see https://github.com/google/boringssl
+You can find a copy of the License at licenses/LICENSE-boringssl
+
 ================================================================
 This product bundles the following libraries which are licensed
 under the Apache License v2.
@@ -354,12 +361,12 @@ Gson (https://github.com/google/gson/gson) 
com.google.code.gson:gson:jar:2.7
 Guava: Google Core Libraries for Java (https://github.com/google/guava/guava) 
com.google.guava:guava:bundle:19.0
 Hibernate Validator Engine 
(http://hibernate.org/validator/hibernate-validator) 
org.hibernate:hibernate-validator:jar:5.2.4.Final
 Instrumentation (https://github.com/google/instrumentation-java) 
com.google.instrumentation:instrumentation-api:jar:0.4.3
-io.grpc:grpc-context (https://github.com/grpc/grpc-java) 
io.grpc:grpc-context:jar:1.8.0
-io.grpc:grpc-core (https://github.com/grpc/grpc-java) 
io.grpc:grpc-core:jar:1.8.0
-io.grpc:grpc-netty (https://github.com/grpc/grpc-java) 
io.grpc:grpc-netty:jar:1.8.0
-io.grpc:grpc-protobuf (https://github.com/grpc/grpc-java) 
io.grpc:grpc-protobuf:jar:1.8.0
-io.grpc:grpc-protobuf-lite (https://github.com/grpc/grpc-java) 
io.grpc:grpc-protobuf-lite:jar:1.8.0
-io.grpc:grpc-stub (https://github.com/grpc/grpc-java) 
io.grpc:grpc-stub:jar:1.8.0
+io.grpc:grpc-context (https://github.com/grpc/grpc-java) 
io.grpc:grpc-context:jar:1.11.0
+io.grpc:grpc-core (https://github.com/grpc/grpc-java) 
io.grpc:grpc-core:jar:1.11.0
+io.grpc:grpc-netty (https://github.com/grpc/grpc-java) 
io.grpc:grpc-netty:jar:1.11.0
+io.grpc:grpc-protobuf (https://github.com/grpc/grpc-java) 
io.grpc:grpc-protobuf:jar:1.11.0
+io.grpc:grpc-protobuf-lite (https://github.com/grpc/grpc-java) 
io.grpc:grpc-protobuf-lite:jar:1.11.0
+io.grpc:grpc-stub (https://github.com/grpc/grpc-java) 
io.grpc:grpc-stub:jar:1.11.0
 Jackson-annotations (http://github.com/FasterXML/jackson) 
com.fasterxml.jackson.core:jackson-annotations:bundle:2.8.7
 Jackson-core (https://github.com/FasterXML/jackson-core) 
com.fasterxml.jackson.core:jackson-core:bundle:2.8.7
 jackson-databind (http://github.com/FasterXML/jackson) 
com.fasterxml.jackson.core:jackson-databind:bundle:2.8.7
@@ -374,6 +381,7 @@ Netty/Common (http://netty.io/netty-common/) 
io.netty:netty-common:jar:4.1.16.Fi
 Netty/Handler (http://netty.io/netty-handler/) 
io.netty:netty-handler:jar:4.1.16.Final
 Netty/Handler/Proxy (http://netty.io/netty-handler-proxy/) 
io.netty:netty-handler-proxy:jar:4.1.16.Final
 Netty/Resolver (http://netty.io/netty-resolver/) 
io.netty:netty-resolver:jar:4.1.16.Final
+Netty/TomcatNative (https://github.com/netty/netty-tcnative) 
netty-tcnative-boringssl-static:2.0.7.Final
 Netty/Transport (http://netty.io/netty-transport/) 
io.netty:netty-transport:jar:4.1.16.Final
 Objenesis (http://objenesis.org) org.objenesis:objenesis:jar:2.5.1
 OpenCensus (https://github.com/census-instrumentation/opencensus-java) 
io.opencensus:opencensus-api:jar:0.8.0
diff --git a/saga-distribution/src/release/NOTICE 
b/saga-distribution/src/release/NOTICE
index 7d79bfaa..f79a3aeb 100644
--- a/saga-distribution/src/release/NOTICE
+++ b/saga-distribution/src/release/NOTICE
@@ -25,3 +25,8 @@ See licenses/NOTICE-netty
 Notice for Apache tomcat
 
 See licenses/NOTICE-tomcat
+
+================================================================
+Notice for Netty tcnative
+
+See licenses/NOTICE-netty-tcnative
diff --git a/saga-distribution/src/release/licenses/LICENSE-boringssl 
b/saga-distribution/src/release/licenses/LICENSE-boringssl
new file mode 100644
index 00000000..ae1de2be
--- /dev/null
+++ b/saga-distribution/src/release/licenses/LICENSE-boringssl
@@ -0,0 +1,251 @@
+BoringSSL is a fork of OpenSSL. As such, large parts of it fall under OpenSSL
+licensing. Files that are completely new have a Google copyright and an ISC
+license. This license is reproduced at the bottom of this file.
+
+Contributors to BoringSSL are required to follow the CLA rules for Chromium:
+https://cla.developers.google.com/clas
+
+Files in third_party/ have their own licenses, as described therein. The MIT
+license, for third_party/fiat, which, unlike other third_party directories, is
+compiled into non-test libraries, is included below.
+
+The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the
+OpenSSL License and the original SSLeay license apply to the toolkit. See below
+for the actual license texts. Actually both licenses are BSD-style Open Source
+licenses. In case of any license issues related to OpenSSL please contact
+openssl-c...@openssl.org.
+
+The following are Google-internal bug numbers where explicit permission from
+some authors is recorded for use of their work. (This is purely for our own
+record keeping.)
+  27287199
+  27287880
+  27287883
+
+  OpenSSL License
+  ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2011 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    openssl-c...@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (e...@cryptsoft.com).  This product includes software written by Tim
+ * Hudson (t...@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (e...@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (e...@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (t...@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (e...@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ *    the apps directory (application code) you must include an 
acknowledgement:
+ *    "This product includes software written by Tim Hudson 
(t...@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+
+ISC license used for completely new code in BoringSSL:
+
+/* Copyright (c) 2015, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+
+The code in third_party/fiat carries the MIT license:
+
+Copyright (c) 2015-2016 the fiat-crypto authors (see
+https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+Licenses for support code
+-------------------------
+
+Parts of the TLS test suite are under the Go license. This code is not included
+in BoringSSL (i.e. libcrypto and libssl) when compiled, however, so
+distributing code linked against BoringSSL does not trigger this license:
+
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+BoringSSL uses the Chromium test infrastructure to run a continuous build,
+trybots etc. The scripts which manage this, and the script for generating build
+metadata, are under the Chromium license. Distributing code linked against
+BoringSSL does not trigger this license.
+
+Copyright 2015 The Chromium Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/saga-distribution/src/release/licenses/NOTICE-netty-tcnative 
b/saga-distribution/src/release/licenses/NOTICE-netty-tcnative
new file mode 100644
index 00000000..0165c975
--- /dev/null
+++ b/saga-distribution/src/release/licenses/NOTICE-netty-tcnative
@@ -0,0 +1,29 @@
+                          The Netty Project
+                            =================
+
+Please visit the Netty web site for more information:
+
+  * http://netty.io/
+
+Copyright 2016 The Netty Project
+
+The Netty Project licenses this file to you under the Apache License,
+version 2.0 (the "License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at:
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+License for the specific language governing permissions and limitations
+under the License.
+
+-------------------------------------------------------------------------------
+This product contains a forked and modified version of Tomcat Native
+
+  * LICENSE:
+    * ASL2
+  * HOMEPAGE:
+    * http://tomcat.apache.org/native-doc/
+    * https://svn.apache.org/repos/asf/tomcat/native/


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to