You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@dubbo.apache.org by li...@apache.org on 2019/07/22 05:05:10 UTC

[dubbo-samples] 01/01: add grpc sample

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

liujun pushed a commit to branch gRPC
in repository https://gitbox.apache.org/repos/asf/dubbo-samples.git

commit 0d95754476f105d395c315a0e0de3a3fd07f2d24
Author: ken.lj <ke...@gmail.com>
AuthorDate: Mon Jul 22 12:46:29 2019 +0800

    add grpc sample
---
 .gitignore                                         |   3 +
 .../io/grpc/examples/helloworld/GreeterGrpc.java   | 363 +++++++++
 .../io/grpc/examples/helloworld/HelloReply.java    | 548 +++++++++++++
 .../examples/helloworld/HelloReplyOrBuilder.java   |  19 +
 .../io/grpc/examples/helloworld/HelloRequest.java  | 548 +++++++++++++
 .../examples/helloworld/HelloRequestOrBuilder.java |  19 +
 .../grpc/examples/helloworld/HelloWorldProto.java  |  70 ++
 .../examples/manualflowcontrol/HelloReply.java     | 548 +++++++++++++
 .../manualflowcontrol/HelloReplyOrBuilder.java     |  19 +
 .../examples/manualflowcontrol/HelloRequest.java   | 548 +++++++++++++
 .../manualflowcontrol/HelloRequestOrBuilder.java   |  19 +
 .../manualflowcontrol/HelloStreamingProto.java     |  72 ++
 .../manualflowcontrol/StreamingGreeterGrpc.java    | 310 ++++++++
 .../java/io/grpc/examples/routeguide/Feature.java  | 807 +++++++++++++++++++
 .../grpc/examples/routeguide/FeatureDatabase.java  | 766 ++++++++++++++++++
 .../routeguide/FeatureDatabaseOrBuilder.java       |  33 +
 .../grpc/examples/routeguide/FeatureOrBuilder.java |  52 ++
 .../java/io/grpc/examples/routeguide/Point.java    | 541 +++++++++++++
 .../grpc/examples/routeguide/PointOrBuilder.java   |  19 +
 .../io/grpc/examples/routeguide/Rectangle.java     | 881 +++++++++++++++++++++
 .../examples/routeguide/RectangleOrBuilder.java    |  59 ++
 .../grpc/examples/routeguide/RouteGuideGrpc.java   | 614 ++++++++++++++
 .../grpc/examples/routeguide/RouteGuideProto.java  | 128 +++
 .../io/grpc/examples/routeguide/RouteNote.java     | 805 +++++++++++++++++++
 .../examples/routeguide/RouteNoteOrBuilder.java    |  52 ++
 .../io/grpc/examples/routeguide/RouteSummary.java  | 719 +++++++++++++++++
 .../examples/routeguide/RouteSummaryOrBuilder.java |  45 ++
 dubbo-samples-grpc/pom.xml                         | 250 ++++++
 .../apache/dubbo/samples/basic/BasicConsumer.java  |  40 +
 .../apache/dubbo/samples/basic/BasicProvider.java  |  39 +
 .../dubbo/samples/basic/EmbeddedZooKeeper.java     | 256 ++++++
 .../dubbo/samples/basic/impl/GrpcGreeterImpl.java  |  36 +
 .../src/main/proto/hello_streaming.proto           |  37 +
 dubbo-samples-grpc/src/main/proto/helloworld.proto |  37 +
 .../src/main/proto/route_guide.proto               | 115 +++
 .../src/main/resources/log4j.properties            |  26 +
 .../main/resources/spring/dubbo-demo-consumer.xml  |  32 +
 .../main/resources/spring/dubbo-demo-provider.xml  |  36 +
 pom.xml                                            |   1 +
 39 files changed, 9512 insertions(+)

diff --git a/.gitignore b/.gitignore
index 7f60d60..2e457fb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,6 @@ target/
 # system ignore
 .DS_Store
 Thumbs.db
+
+# generated code
+*/build/
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/GreeterGrpc.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/GreeterGrpc.java
new file mode 100644
index 0000000..74987aa
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/GreeterGrpc.java
@@ -0,0 +1,363 @@
+package io.grpc.examples.helloworld;
+
+import static io.grpc.MethodDescriptor.generateFullMethodName;
+import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncUnaryCall;
+import static io.grpc.stub.ClientCalls.blockingServerStreamingCall;
+import static io.grpc.stub.ClientCalls.blockingUnaryCall;
+import static io.grpc.stub.ClientCalls.futureUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
+
+/**
+ * <pre>
+ * The greeting service definition.
+ * </pre>
+ */
+@javax.annotation.Generated(
+    value = "by gRPC proto compiler (version 1.19.0-SNAPSHOT)",
+    comments = "Source: helloworld.proto")
+public final class GreeterGrpc {
+
+  private GreeterGrpc() {}
+
+  public static final String SERVICE_NAME = "helloworld.Greeter";
+
+  // Static method descriptors that strictly reflect the proto.
+  private static volatile io.grpc.MethodDescriptor<io.grpc.examples.helloworld.HelloRequest,
+      io.grpc.examples.helloworld.HelloReply> getSayHelloMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "SayHello",
+      requestType = io.grpc.examples.helloworld.HelloRequest.class,
+      responseType = io.grpc.examples.helloworld.HelloReply.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<io.grpc.examples.helloworld.HelloRequest,
+      io.grpc.examples.helloworld.HelloReply> getSayHelloMethod() {
+    io.grpc.MethodDescriptor<io.grpc.examples.helloworld.HelloRequest, io.grpc.examples.helloworld.HelloReply> getSayHelloMethod;
+    if ((getSayHelloMethod = GreeterGrpc.getSayHelloMethod) == null) {
+      synchronized (GreeterGrpc.class) {
+        if ((getSayHelloMethod = GreeterGrpc.getSayHelloMethod) == null) {
+          GreeterGrpc.getSayHelloMethod = getSayHelloMethod = 
+              io.grpc.MethodDescriptor.<io.grpc.examples.helloworld.HelloRequest, io.grpc.examples.helloworld.HelloReply>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(
+                  "helloworld.Greeter", "SayHello"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.helloworld.HelloRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.helloworld.HelloReply.getDefaultInstance()))
+                  .setSchemaDescriptor(new GreeterMethodDescriptorSupplier("SayHello"))
+                  .build();
+          }
+        }
+     }
+     return getSayHelloMethod;
+  }
+
+  /**
+   * Creates a new async stub that supports all call types for the service
+   */
+  public static GreeterStub newStub(io.grpc.Channel channel) {
+    return new GreeterStub(channel);
+  }
+
+  /**
+   * Creates a new blocking-style stub that supports unary and streaming output calls on the service
+   */
+  public static GreeterBlockingStub newBlockingStub(
+      io.grpc.Channel channel) {
+    return new GreeterBlockingStub(channel);
+  }
+
+  /**
+   * Creates a new ListenableFuture-style stub that supports unary calls on the service
+   */
+  public static GreeterFutureStub newFutureStub(
+      io.grpc.Channel channel) {
+    return new GreeterFutureStub(channel);
+  }
+
+  /**
+   * <pre>
+   * The greeting service definition.
+   * </pre>
+   */
+  public static final class GreeterStub extends io.grpc.stub.AbstractStub<GreeterStub> {
+    private GreeterStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private GreeterStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected GreeterStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new GreeterStub(channel, callOptions);
+    }
+
+    /**
+     * <pre>
+     * Sends a greeting
+     * </pre>
+     */
+    public void sayHello(io.grpc.examples.helloworld.HelloRequest request,
+        io.grpc.stub.StreamObserver<io.grpc.examples.helloworld.HelloReply> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getSayHelloMethod(), getCallOptions()), request, responseObserver);
+    }
+  }
+
+  /**
+   * <pre>
+   * The greeting service definition.
+   * </pre>
+   */
+  public static final class GreeterBlockingStub extends io.grpc.stub.AbstractStub<GreeterBlockingStub> {
+    private GreeterBlockingStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private GreeterBlockingStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected GreeterBlockingStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new GreeterBlockingStub(channel, callOptions);
+    }
+
+    /**
+     * <pre>
+     * Sends a greeting
+     * </pre>
+     */
+    public io.grpc.examples.helloworld.HelloReply sayHello(io.grpc.examples.helloworld.HelloRequest request) {
+      return blockingUnaryCall(
+          getChannel(), getSayHelloMethod(), getCallOptions(), request);
+    }
+  }
+
+  /**
+   * <pre>
+   * The greeting service definition.
+   * </pre>
+   */
+  public static final class GreeterFutureStub extends io.grpc.stub.AbstractStub<GreeterFutureStub> {
+    private GreeterFutureStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private GreeterFutureStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected GreeterFutureStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new GreeterFutureStub(channel, callOptions);
+    }
+
+    /**
+     * <pre>
+     * Sends a greeting
+     * </pre>
+     */
+    public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.helloworld.HelloReply> sayHello(
+        io.grpc.examples.helloworld.HelloRequest request) {
+      return futureUnaryCall(
+          getChannel().newCall(getSayHelloMethod(), getCallOptions()), request);
+    }
+  }
+
+  public static abstract class GreeterImplBase implements io.grpc.BindableService, IGreeter {
+
+  @java.lang.Override
+  public final io.grpc.examples.helloworld.HelloReply sayHello(io.grpc.examples.helloworld.HelloRequest request) {
+     throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+  }
+
+  @java.lang.Override
+  public final com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.helloworld.HelloReply> sayHelloAsync(
+      io.grpc.examples.helloworld.HelloRequest request) {
+     throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+  }
+
+  public void sayHello(io.grpc.examples.helloworld.HelloRequest request,
+      io.grpc.stub.StreamObserver<io.grpc.examples.helloworld.HelloReply> responseObserver) {
+      asyncUnimplementedUnaryCall(getSayHelloMethod(), responseObserver);
+  }
+
+
+@java.lang.Override
+ public final io.grpc.ServerServiceDefinition bindService() {
+  return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+      .addMethod(
+        getSayHelloMethod(),
+        asyncUnaryCall(
+          new MethodHandlers<
+            io.grpc.examples.helloworld.HelloRequest,
+            io.grpc.examples.helloworld.HelloReply>(
+              this, METHODID_SAY_HELLO)))
+      .build();
+}
+}
+
+/**
+ * Code generated for Dubbo
+ */
+public interface IGreeter {
+
+default public io.grpc.examples.helloworld.HelloReply sayHello(io.grpc.examples.helloworld.HelloRequest request) {
+   throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+}
+
+default public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.helloworld.HelloReply> sayHelloAsync(
+    io.grpc.examples.helloworld.HelloRequest request) {
+   throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+}
+
+public void sayHello(io.grpc.examples.helloworld.HelloRequest request,
+    io.grpc.stub.StreamObserver<io.grpc.examples.helloworld.HelloReply> responseObserver);
+
+}
+
+public static class DubboGreeterStub implements IGreeter {
+
+private GreeterBlockingStub blockingStub;
+private GreeterFutureStub futureStub;
+private GreeterStub stub;
+
+public DubboGreeterStub(io.grpc.Channel channel) {
+   blockingStub = GreeterGrpc.newBlockingStub(channel);
+   futureStub = GreeterGrpc.newFutureStub(channel);
+   stub = GreeterGrpc.newStub(channel);
+}
+
+public io.grpc.examples.helloworld.HelloReply sayHello(io.grpc.examples.helloworld.HelloRequest request) {
+    return blockingStub.sayHello(request);
+}
+
+public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.helloworld.HelloReply> sayHelloAsync(
+    io.grpc.examples.helloworld.HelloRequest request) {
+    return futureStub.sayHello(request);
+}
+
+public void sayHello(io.grpc.examples.helloworld.HelloRequest request,
+    io.grpc.stub.StreamObserver<io.grpc.examples.helloworld.HelloReply> responseObserver){
+    stub.sayHello(request, responseObserver);
+}
+
+}
+
+public static DubboGreeterStub getDubboStub(io.grpc.Channel channel) {
+
+  return new DubboGreeterStub(channel);
+
+}
+
+private static final int METHODID_SAY_HELLO = 0;
+
+private static final class MethodHandlers<Req, Resp> implements
+    io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+    io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+    io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+    io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+  private final GreeterImplBase serviceImpl;
+  private final int methodId;
+
+  MethodHandlers(GreeterImplBase serviceImpl, int methodId) {
+    this.serviceImpl = serviceImpl;
+    this.methodId = methodId;
+  }
+
+  @java.lang.Override
+  @java.lang.SuppressWarnings("unchecked")
+  public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+    switch (methodId) {
+      case METHODID_SAY_HELLO:
+        serviceImpl.sayHello((io.grpc.examples.helloworld.HelloRequest) request,
+            (io.grpc.stub.StreamObserver<io.grpc.examples.helloworld.HelloReply>) responseObserver);
+        break;
+      default:
+        throw new AssertionError();
+    }
+  }
+
+  @java.lang.Override
+  @java.lang.SuppressWarnings("unchecked")
+  public io.grpc.stub.StreamObserver<Req> invoke(
+      io.grpc.stub.StreamObserver<Resp> responseObserver) {
+    switch (methodId) {
+      default:
+        throw new AssertionError();
+    }
+  }
+}
+
+private static abstract class GreeterBaseDescriptorSupplier
+    implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
+  GreeterBaseDescriptorSupplier() {}
+
+  @java.lang.Override
+  public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
+    return io.grpc.examples.helloworld.HelloWorldProto.getDescriptor();
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
+    return getFileDescriptor().findServiceByName("Greeter");
+  }
+}
+
+private static final class GreeterFileDescriptorSupplier
+    extends GreeterBaseDescriptorSupplier {
+  GreeterFileDescriptorSupplier() {}
+}
+
+private static final class GreeterMethodDescriptorSupplier
+    extends GreeterBaseDescriptorSupplier
+    implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
+  private final String methodName;
+
+  GreeterMethodDescriptorSupplier(String methodName) {
+    this.methodName = methodName;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
+    return getServiceDescriptor().findMethodByName(methodName);
+  }
+}
+
+private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
+
+public static io.grpc.ServiceDescriptor getServiceDescriptor() {
+  io.grpc.ServiceDescriptor result = serviceDescriptor;
+  if (result == null) {
+    synchronized (GreeterGrpc.class) {
+      result = serviceDescriptor;
+      if (result == null) {
+        serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
+            .setSchemaDescriptor(new GreeterFileDescriptorSupplier())
+            .addMethod(getSayHelloMethod())
+            .build();
+      }
+    }
+  }
+  return result;
+}
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloReply.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloReply.java
new file mode 100644
index 0000000..12f90f2
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloReply.java
@@ -0,0 +1,548 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: helloworld.proto
+
+package io.grpc.examples.helloworld;
+
+/**
+ * <pre>
+ * The response message containing the greetings
+ * </pre>
+ *
+ * Protobuf type {@code helloworld.HelloReply}
+ */
+public  final class HelloReply extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:helloworld.HelloReply)
+    HelloReplyOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use HelloReply.newBuilder() to construct.
+  private HelloReply(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private HelloReply() {
+    message_ = "";
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private HelloReply(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            message_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return io.grpc.examples.helloworld.HelloWorldProto.internal_static_helloworld_HelloReply_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return io.grpc.examples.helloworld.HelloWorldProto.internal_static_helloworld_HelloReply_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            io.grpc.examples.helloworld.HelloReply.class, io.grpc.examples.helloworld.HelloReply.Builder.class);
+  }
+
+  public static final int MESSAGE_FIELD_NUMBER = 1;
+  private volatile java.lang.Object message_;
+  /**
+   * <code>string message = 1;</code>
+   */
+  public java.lang.String getMessage() {
+    java.lang.Object ref = message_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      message_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string message = 1;</code>
+   */
+  public com.google.protobuf.ByteString
+      getMessageBytes() {
+    java.lang.Object ref = message_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      message_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!getMessageBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, message_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getMessageBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, message_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof io.grpc.examples.helloworld.HelloReply)) {
+      return super.equals(obj);
+    }
+    io.grpc.examples.helloworld.HelloReply other = (io.grpc.examples.helloworld.HelloReply) obj;
+
+    if (!getMessage()
+        .equals(other.getMessage())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + MESSAGE_FIELD_NUMBER;
+    hash = (53 * hash) + getMessage().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static io.grpc.examples.helloworld.HelloReply parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.helloworld.HelloReply parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(io.grpc.examples.helloworld.HelloReply prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * The response message containing the greetings
+   * </pre>
+   *
+   * Protobuf type {@code helloworld.HelloReply}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:helloworld.HelloReply)
+      io.grpc.examples.helloworld.HelloReplyOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return io.grpc.examples.helloworld.HelloWorldProto.internal_static_helloworld_HelloReply_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return io.grpc.examples.helloworld.HelloWorldProto.internal_static_helloworld_HelloReply_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              io.grpc.examples.helloworld.HelloReply.class, io.grpc.examples.helloworld.HelloReply.Builder.class);
+    }
+
+    // Construct using io.grpc.examples.helloworld.HelloReply.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      message_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return io.grpc.examples.helloworld.HelloWorldProto.internal_static_helloworld_HelloReply_descriptor;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.helloworld.HelloReply getDefaultInstanceForType() {
+      return io.grpc.examples.helloworld.HelloReply.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.helloworld.HelloReply build() {
+      io.grpc.examples.helloworld.HelloReply result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.helloworld.HelloReply buildPartial() {
+      io.grpc.examples.helloworld.HelloReply result = new io.grpc.examples.helloworld.HelloReply(this);
+      result.message_ = message_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof io.grpc.examples.helloworld.HelloReply) {
+        return mergeFrom((io.grpc.examples.helloworld.HelloReply)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(io.grpc.examples.helloworld.HelloReply other) {
+      if (other == io.grpc.examples.helloworld.HelloReply.getDefaultInstance()) return this;
+      if (!other.getMessage().isEmpty()) {
+        message_ = other.message_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      io.grpc.examples.helloworld.HelloReply parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (io.grpc.examples.helloworld.HelloReply) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object message_ = "";
+    /**
+     * <code>string message = 1;</code>
+     */
+    public java.lang.String getMessage() {
+      java.lang.Object ref = message_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        message_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string message = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getMessageBytes() {
+      java.lang.Object ref = message_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        message_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string message = 1;</code>
+     */
+    public Builder setMessage(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      message_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string message = 1;</code>
+     */
+    public Builder clearMessage() {
+      
+      message_ = getDefaultInstance().getMessage();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string message = 1;</code>
+     */
+    public Builder setMessageBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      message_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:helloworld.HelloReply)
+  }
+
+  // @@protoc_insertion_point(class_scope:helloworld.HelloReply)
+  private static final io.grpc.examples.helloworld.HelloReply DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new io.grpc.examples.helloworld.HelloReply();
+  }
+
+  public static io.grpc.examples.helloworld.HelloReply getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<HelloReply>
+      PARSER = new com.google.protobuf.AbstractParser<HelloReply>() {
+    @java.lang.Override
+    public HelloReply parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new HelloReply(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<HelloReply> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<HelloReply> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public io.grpc.examples.helloworld.HelloReply getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloReplyOrBuilder.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloReplyOrBuilder.java
new file mode 100644
index 0000000..eba408e
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloReplyOrBuilder.java
@@ -0,0 +1,19 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: helloworld.proto
+
+package io.grpc.examples.helloworld;
+
+public interface HelloReplyOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:helloworld.HelloReply)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string message = 1;</code>
+   */
+  java.lang.String getMessage();
+  /**
+   * <code>string message = 1;</code>
+   */
+  com.google.protobuf.ByteString
+      getMessageBytes();
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloRequest.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloRequest.java
new file mode 100644
index 0000000..720ae9a
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloRequest.java
@@ -0,0 +1,548 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: helloworld.proto
+
+package io.grpc.examples.helloworld;
+
+/**
+ * <pre>
+ * The request message containing the user's name.
+ * </pre>
+ *
+ * Protobuf type {@code helloworld.HelloRequest}
+ */
+public  final class HelloRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:helloworld.HelloRequest)
+    HelloRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use HelloRequest.newBuilder() to construct.
+  private HelloRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private HelloRequest() {
+    name_ = "";
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private HelloRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            name_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return io.grpc.examples.helloworld.HelloWorldProto.internal_static_helloworld_HelloRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return io.grpc.examples.helloworld.HelloWorldProto.internal_static_helloworld_HelloRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            io.grpc.examples.helloworld.HelloRequest.class, io.grpc.examples.helloworld.HelloRequest.Builder.class);
+  }
+
+  public static final int NAME_FIELD_NUMBER = 1;
+  private volatile java.lang.Object name_;
+  /**
+   * <code>string name = 1;</code>
+   */
+  public java.lang.String getName() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      name_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string name = 1;</code>
+   */
+  public com.google.protobuf.ByteString
+      getNameBytes() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      name_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!getNameBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getNameBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof io.grpc.examples.helloworld.HelloRequest)) {
+      return super.equals(obj);
+    }
+    io.grpc.examples.helloworld.HelloRequest other = (io.grpc.examples.helloworld.HelloRequest) obj;
+
+    if (!getName()
+        .equals(other.getName())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + NAME_FIELD_NUMBER;
+    hash = (53 * hash) + getName().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static io.grpc.examples.helloworld.HelloRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.helloworld.HelloRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(io.grpc.examples.helloworld.HelloRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * The request message containing the user's name.
+   * </pre>
+   *
+   * Protobuf type {@code helloworld.HelloRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:helloworld.HelloRequest)
+      io.grpc.examples.helloworld.HelloRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return io.grpc.examples.helloworld.HelloWorldProto.internal_static_helloworld_HelloRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return io.grpc.examples.helloworld.HelloWorldProto.internal_static_helloworld_HelloRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              io.grpc.examples.helloworld.HelloRequest.class, io.grpc.examples.helloworld.HelloRequest.Builder.class);
+    }
+
+    // Construct using io.grpc.examples.helloworld.HelloRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      name_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return io.grpc.examples.helloworld.HelloWorldProto.internal_static_helloworld_HelloRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.helloworld.HelloRequest getDefaultInstanceForType() {
+      return io.grpc.examples.helloworld.HelloRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.helloworld.HelloRequest build() {
+      io.grpc.examples.helloworld.HelloRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.helloworld.HelloRequest buildPartial() {
+      io.grpc.examples.helloworld.HelloRequest result = new io.grpc.examples.helloworld.HelloRequest(this);
+      result.name_ = name_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof io.grpc.examples.helloworld.HelloRequest) {
+        return mergeFrom((io.grpc.examples.helloworld.HelloRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(io.grpc.examples.helloworld.HelloRequest other) {
+      if (other == io.grpc.examples.helloworld.HelloRequest.getDefaultInstance()) return this;
+      if (!other.getName().isEmpty()) {
+        name_ = other.name_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      io.grpc.examples.helloworld.HelloRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (io.grpc.examples.helloworld.HelloRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object name_ = "";
+    /**
+     * <code>string name = 1;</code>
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string name = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string name = 1;</code>
+     */
+    public Builder setName(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      name_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string name = 1;</code>
+     */
+    public Builder clearName() {
+      
+      name_ = getDefaultInstance().getName();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string name = 1;</code>
+     */
+    public Builder setNameBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      name_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:helloworld.HelloRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:helloworld.HelloRequest)
+  private static final io.grpc.examples.helloworld.HelloRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new io.grpc.examples.helloworld.HelloRequest();
+  }
+
+  public static io.grpc.examples.helloworld.HelloRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<HelloRequest>
+      PARSER = new com.google.protobuf.AbstractParser<HelloRequest>() {
+    @java.lang.Override
+    public HelloRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new HelloRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<HelloRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<HelloRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public io.grpc.examples.helloworld.HelloRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloRequestOrBuilder.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloRequestOrBuilder.java
new file mode 100644
index 0000000..3568bc9
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloRequestOrBuilder.java
@@ -0,0 +1,19 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: helloworld.proto
+
+package io.grpc.examples.helloworld;
+
+public interface HelloRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:helloworld.HelloRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string name = 1;</code>
+   */
+  java.lang.String getName();
+  /**
+   * <code>string name = 1;</code>
+   */
+  com.google.protobuf.ByteString
+      getNameBytes();
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloWorldProto.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloWorldProto.java
new file mode 100644
index 0000000..96527e6
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/helloworld/HelloWorldProto.java
@@ -0,0 +1,70 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: helloworld.proto
+
+package io.grpc.examples.helloworld;
+
+public final class HelloWorldProto {
+  private HelloWorldProto() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_helloworld_HelloRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_helloworld_HelloRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_helloworld_HelloReply_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_helloworld_HelloReply_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\020helloworld.proto\022\nhelloworld\"\034\n\014HelloR" +
+      "equest\022\014\n\004name\030\001 \001(\t\"\035\n\nHelloReply\022\017\n\007me" +
+      "ssage\030\001 \001(\t2I\n\007Greeter\022>\n\010SayHello\022\030.hel" +
+      "loworld.HelloRequest\032\026.helloworld.HelloR" +
+      "eply\"\000B6\n\033io.grpc.examples.helloworldB\017H" +
+      "elloWorldProtoP\001\242\002\003HLWb\006proto3"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+        new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {
+          public com.google.protobuf.ExtensionRegistry assignDescriptors(
+              com.google.protobuf.Descriptors.FileDescriptor root) {
+            descriptor = root;
+            return null;
+          }
+        };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+    internal_static_helloworld_HelloRequest_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_helloworld_HelloRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_helloworld_HelloRequest_descriptor,
+        new java.lang.String[] { "Name", });
+    internal_static_helloworld_HelloReply_descriptor =
+      getDescriptor().getMessageTypes().get(1);
+    internal_static_helloworld_HelloReply_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_helloworld_HelloReply_descriptor,
+        new java.lang.String[] { "Message", });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloReply.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloReply.java
new file mode 100644
index 0000000..c6dc4e7
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloReply.java
@@ -0,0 +1,548 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: hello_streaming.proto
+
+package io.grpc.examples.manualflowcontrol;
+
+/**
+ * <pre>
+ * The response message containing the greetings
+ * </pre>
+ *
+ * Protobuf type {@code manualflowcontrol.HelloReply}
+ */
+public  final class HelloReply extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:manualflowcontrol.HelloReply)
+    HelloReplyOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use HelloReply.newBuilder() to construct.
+  private HelloReply(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private HelloReply() {
+    message_ = "";
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private HelloReply(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            message_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return io.grpc.examples.manualflowcontrol.HelloStreamingProto.internal_static_manualflowcontrol_HelloReply_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return io.grpc.examples.manualflowcontrol.HelloStreamingProto.internal_static_manualflowcontrol_HelloReply_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            io.grpc.examples.manualflowcontrol.HelloReply.class, io.grpc.examples.manualflowcontrol.HelloReply.Builder.class);
+  }
+
+  public static final int MESSAGE_FIELD_NUMBER = 1;
+  private volatile java.lang.Object message_;
+  /**
+   * <code>string message = 1;</code>
+   */
+  public java.lang.String getMessage() {
+    java.lang.Object ref = message_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      message_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string message = 1;</code>
+   */
+  public com.google.protobuf.ByteString
+      getMessageBytes() {
+    java.lang.Object ref = message_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      message_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!getMessageBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, message_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getMessageBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, message_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof io.grpc.examples.manualflowcontrol.HelloReply)) {
+      return super.equals(obj);
+    }
+    io.grpc.examples.manualflowcontrol.HelloReply other = (io.grpc.examples.manualflowcontrol.HelloReply) obj;
+
+    if (!getMessage()
+        .equals(other.getMessage())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + MESSAGE_FIELD_NUMBER;
+    hash = (53 * hash) + getMessage().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloReply parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(io.grpc.examples.manualflowcontrol.HelloReply prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * The response message containing the greetings
+   * </pre>
+   *
+   * Protobuf type {@code manualflowcontrol.HelloReply}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:manualflowcontrol.HelloReply)
+      io.grpc.examples.manualflowcontrol.HelloReplyOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return io.grpc.examples.manualflowcontrol.HelloStreamingProto.internal_static_manualflowcontrol_HelloReply_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return io.grpc.examples.manualflowcontrol.HelloStreamingProto.internal_static_manualflowcontrol_HelloReply_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              io.grpc.examples.manualflowcontrol.HelloReply.class, io.grpc.examples.manualflowcontrol.HelloReply.Builder.class);
+    }
+
+    // Construct using io.grpc.examples.manualflowcontrol.HelloReply.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      message_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return io.grpc.examples.manualflowcontrol.HelloStreamingProto.internal_static_manualflowcontrol_HelloReply_descriptor;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.manualflowcontrol.HelloReply getDefaultInstanceForType() {
+      return io.grpc.examples.manualflowcontrol.HelloReply.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.manualflowcontrol.HelloReply build() {
+      io.grpc.examples.manualflowcontrol.HelloReply result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.manualflowcontrol.HelloReply buildPartial() {
+      io.grpc.examples.manualflowcontrol.HelloReply result = new io.grpc.examples.manualflowcontrol.HelloReply(this);
+      result.message_ = message_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof io.grpc.examples.manualflowcontrol.HelloReply) {
+        return mergeFrom((io.grpc.examples.manualflowcontrol.HelloReply)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(io.grpc.examples.manualflowcontrol.HelloReply other) {
+      if (other == io.grpc.examples.manualflowcontrol.HelloReply.getDefaultInstance()) return this;
+      if (!other.getMessage().isEmpty()) {
+        message_ = other.message_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      io.grpc.examples.manualflowcontrol.HelloReply parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (io.grpc.examples.manualflowcontrol.HelloReply) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object message_ = "";
+    /**
+     * <code>string message = 1;</code>
+     */
+    public java.lang.String getMessage() {
+      java.lang.Object ref = message_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        message_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string message = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getMessageBytes() {
+      java.lang.Object ref = message_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        message_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string message = 1;</code>
+     */
+    public Builder setMessage(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      message_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string message = 1;</code>
+     */
+    public Builder clearMessage() {
+      
+      message_ = getDefaultInstance().getMessage();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string message = 1;</code>
+     */
+    public Builder setMessageBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      message_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:manualflowcontrol.HelloReply)
+  }
+
+  // @@protoc_insertion_point(class_scope:manualflowcontrol.HelloReply)
+  private static final io.grpc.examples.manualflowcontrol.HelloReply DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new io.grpc.examples.manualflowcontrol.HelloReply();
+  }
+
+  public static io.grpc.examples.manualflowcontrol.HelloReply getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<HelloReply>
+      PARSER = new com.google.protobuf.AbstractParser<HelloReply>() {
+    @java.lang.Override
+    public HelloReply parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new HelloReply(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<HelloReply> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<HelloReply> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public io.grpc.examples.manualflowcontrol.HelloReply getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloReplyOrBuilder.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloReplyOrBuilder.java
new file mode 100644
index 0000000..84c1669
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloReplyOrBuilder.java
@@ -0,0 +1,19 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: hello_streaming.proto
+
+package io.grpc.examples.manualflowcontrol;
+
+public interface HelloReplyOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:manualflowcontrol.HelloReply)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string message = 1;</code>
+   */
+  java.lang.String getMessage();
+  /**
+   * <code>string message = 1;</code>
+   */
+  com.google.protobuf.ByteString
+      getMessageBytes();
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloRequest.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloRequest.java
new file mode 100644
index 0000000..01fe63f
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloRequest.java
@@ -0,0 +1,548 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: hello_streaming.proto
+
+package io.grpc.examples.manualflowcontrol;
+
+/**
+ * <pre>
+ * The request message containing the user's name.
+ * </pre>
+ *
+ * Protobuf type {@code manualflowcontrol.HelloRequest}
+ */
+public  final class HelloRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:manualflowcontrol.HelloRequest)
+    HelloRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use HelloRequest.newBuilder() to construct.
+  private HelloRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private HelloRequest() {
+    name_ = "";
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private HelloRequest(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            name_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return io.grpc.examples.manualflowcontrol.HelloStreamingProto.internal_static_manualflowcontrol_HelloRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return io.grpc.examples.manualflowcontrol.HelloStreamingProto.internal_static_manualflowcontrol_HelloRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            io.grpc.examples.manualflowcontrol.HelloRequest.class, io.grpc.examples.manualflowcontrol.HelloRequest.Builder.class);
+  }
+
+  public static final int NAME_FIELD_NUMBER = 1;
+  private volatile java.lang.Object name_;
+  /**
+   * <code>string name = 1;</code>
+   */
+  public java.lang.String getName() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      name_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string name = 1;</code>
+   */
+  public com.google.protobuf.ByteString
+      getNameBytes() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      name_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!getNameBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getNameBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof io.grpc.examples.manualflowcontrol.HelloRequest)) {
+      return super.equals(obj);
+    }
+    io.grpc.examples.manualflowcontrol.HelloRequest other = (io.grpc.examples.manualflowcontrol.HelloRequest) obj;
+
+    if (!getName()
+        .equals(other.getName())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + NAME_FIELD_NUMBER;
+    hash = (53 * hash) + getName().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.manualflowcontrol.HelloRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(io.grpc.examples.manualflowcontrol.HelloRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * The request message containing the user's name.
+   * </pre>
+   *
+   * Protobuf type {@code manualflowcontrol.HelloRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:manualflowcontrol.HelloRequest)
+      io.grpc.examples.manualflowcontrol.HelloRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return io.grpc.examples.manualflowcontrol.HelloStreamingProto.internal_static_manualflowcontrol_HelloRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return io.grpc.examples.manualflowcontrol.HelloStreamingProto.internal_static_manualflowcontrol_HelloRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              io.grpc.examples.manualflowcontrol.HelloRequest.class, io.grpc.examples.manualflowcontrol.HelloRequest.Builder.class);
+    }
+
+    // Construct using io.grpc.examples.manualflowcontrol.HelloRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      name_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return io.grpc.examples.manualflowcontrol.HelloStreamingProto.internal_static_manualflowcontrol_HelloRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.manualflowcontrol.HelloRequest getDefaultInstanceForType() {
+      return io.grpc.examples.manualflowcontrol.HelloRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.manualflowcontrol.HelloRequest build() {
+      io.grpc.examples.manualflowcontrol.HelloRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.manualflowcontrol.HelloRequest buildPartial() {
+      io.grpc.examples.manualflowcontrol.HelloRequest result = new io.grpc.examples.manualflowcontrol.HelloRequest(this);
+      result.name_ = name_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof io.grpc.examples.manualflowcontrol.HelloRequest) {
+        return mergeFrom((io.grpc.examples.manualflowcontrol.HelloRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(io.grpc.examples.manualflowcontrol.HelloRequest other) {
+      if (other == io.grpc.examples.manualflowcontrol.HelloRequest.getDefaultInstance()) return this;
+      if (!other.getName().isEmpty()) {
+        name_ = other.name_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      io.grpc.examples.manualflowcontrol.HelloRequest parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (io.grpc.examples.manualflowcontrol.HelloRequest) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object name_ = "";
+    /**
+     * <code>string name = 1;</code>
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string name = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string name = 1;</code>
+     */
+    public Builder setName(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      name_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string name = 1;</code>
+     */
+    public Builder clearName() {
+      
+      name_ = getDefaultInstance().getName();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string name = 1;</code>
+     */
+    public Builder setNameBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      name_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:manualflowcontrol.HelloRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:manualflowcontrol.HelloRequest)
+  private static final io.grpc.examples.manualflowcontrol.HelloRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new io.grpc.examples.manualflowcontrol.HelloRequest();
+  }
+
+  public static io.grpc.examples.manualflowcontrol.HelloRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<HelloRequest>
+      PARSER = new com.google.protobuf.AbstractParser<HelloRequest>() {
+    @java.lang.Override
+    public HelloRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new HelloRequest(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<HelloRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<HelloRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public io.grpc.examples.manualflowcontrol.HelloRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloRequestOrBuilder.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloRequestOrBuilder.java
new file mode 100644
index 0000000..fd28a19
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloRequestOrBuilder.java
@@ -0,0 +1,19 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: hello_streaming.proto
+
+package io.grpc.examples.manualflowcontrol;
+
+public interface HelloRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:manualflowcontrol.HelloRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string name = 1;</code>
+   */
+  java.lang.String getName();
+  /**
+   * <code>string name = 1;</code>
+   */
+  com.google.protobuf.ByteString
+      getNameBytes();
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloStreamingProto.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloStreamingProto.java
new file mode 100644
index 0000000..7ca08db
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/HelloStreamingProto.java
@@ -0,0 +1,72 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: hello_streaming.proto
+
+package io.grpc.examples.manualflowcontrol;
+
+public final class HelloStreamingProto {
+  private HelloStreamingProto() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_manualflowcontrol_HelloRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_manualflowcontrol_HelloRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_manualflowcontrol_HelloReply_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_manualflowcontrol_HelloReply_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\025hello_streaming.proto\022\021manualflowcontr" +
+      "ol\"\034\n\014HelloRequest\022\014\n\004name\030\001 \001(\t\"\035\n\nHell" +
+      "oReply\022\017\n\007message\030\001 \001(\t2m\n\020StreamingGree" +
+      "ter\022Y\n\021SayHelloStreaming\022\037.manualflowcon" +
+      "trol.HelloRequest\032\035.manualflowcontrol.He" +
+      "lloReply\"\000(\0010\001BB\n\"io.grpc.examples.manua" +
+      "lflowcontrolB\023HelloStreamingProtoP\001\242\002\004HL" +
+      "WSb\006proto3"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+        new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {
+          public com.google.protobuf.ExtensionRegistry assignDescriptors(
+              com.google.protobuf.Descriptors.FileDescriptor root) {
+            descriptor = root;
+            return null;
+          }
+        };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+    internal_static_manualflowcontrol_HelloRequest_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_manualflowcontrol_HelloRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_manualflowcontrol_HelloRequest_descriptor,
+        new java.lang.String[] { "Name", });
+    internal_static_manualflowcontrol_HelloReply_descriptor =
+      getDescriptor().getMessageTypes().get(1);
+    internal_static_manualflowcontrol_HelloReply_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_manualflowcontrol_HelloReply_descriptor,
+        new java.lang.String[] { "Message", });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/StreamingGreeterGrpc.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/StreamingGreeterGrpc.java
new file mode 100644
index 0000000..634afc1
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/manualflowcontrol/StreamingGreeterGrpc.java
@@ -0,0 +1,310 @@
+package io.grpc.examples.manualflowcontrol;
+
+import static io.grpc.MethodDescriptor.generateFullMethodName;
+import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncUnaryCall;
+import static io.grpc.stub.ClientCalls.blockingServerStreamingCall;
+import static io.grpc.stub.ClientCalls.blockingUnaryCall;
+import static io.grpc.stub.ClientCalls.futureUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
+
+/**
+ * <pre>
+ * The greeting service definition.
+ * </pre>
+ */
+@javax.annotation.Generated(
+    value = "by gRPC proto compiler (version 1.19.0-SNAPSHOT)",
+    comments = "Source: hello_streaming.proto")
+public final class StreamingGreeterGrpc {
+
+  private StreamingGreeterGrpc() {}
+
+  public static final String SERVICE_NAME = "manualflowcontrol.StreamingGreeter";
+
+  // Static method descriptors that strictly reflect the proto.
+  private static volatile io.grpc.MethodDescriptor<io.grpc.examples.manualflowcontrol.HelloRequest,
+      io.grpc.examples.manualflowcontrol.HelloReply> getSayHelloStreamingMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "SayHelloStreaming",
+      requestType = io.grpc.examples.manualflowcontrol.HelloRequest.class,
+      responseType = io.grpc.examples.manualflowcontrol.HelloReply.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING)
+  public static io.grpc.MethodDescriptor<io.grpc.examples.manualflowcontrol.HelloRequest,
+      io.grpc.examples.manualflowcontrol.HelloReply> getSayHelloStreamingMethod() {
+    io.grpc.MethodDescriptor<io.grpc.examples.manualflowcontrol.HelloRequest, io.grpc.examples.manualflowcontrol.HelloReply> getSayHelloStreamingMethod;
+    if ((getSayHelloStreamingMethod = StreamingGreeterGrpc.getSayHelloStreamingMethod) == null) {
+      synchronized (StreamingGreeterGrpc.class) {
+        if ((getSayHelloStreamingMethod = StreamingGreeterGrpc.getSayHelloStreamingMethod) == null) {
+          StreamingGreeterGrpc.getSayHelloStreamingMethod = getSayHelloStreamingMethod = 
+              io.grpc.MethodDescriptor.<io.grpc.examples.manualflowcontrol.HelloRequest, io.grpc.examples.manualflowcontrol.HelloReply>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING)
+              .setFullMethodName(generateFullMethodName(
+                  "manualflowcontrol.StreamingGreeter", "SayHelloStreaming"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.manualflowcontrol.HelloRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.manualflowcontrol.HelloReply.getDefaultInstance()))
+                  .setSchemaDescriptor(new StreamingGreeterMethodDescriptorSupplier("SayHelloStreaming"))
+                  .build();
+          }
+        }
+     }
+     return getSayHelloStreamingMethod;
+  }
+
+  /**
+   * Creates a new async stub that supports all call types for the service
+   */
+  public static StreamingGreeterStub newStub(io.grpc.Channel channel) {
+    return new StreamingGreeterStub(channel);
+  }
+
+  /**
+   * Creates a new blocking-style stub that supports unary and streaming output calls on the service
+   */
+  public static StreamingGreeterBlockingStub newBlockingStub(
+      io.grpc.Channel channel) {
+    return new StreamingGreeterBlockingStub(channel);
+  }
+
+  /**
+   * Creates a new ListenableFuture-style stub that supports unary calls on the service
+   */
+  public static StreamingGreeterFutureStub newFutureStub(
+      io.grpc.Channel channel) {
+    return new StreamingGreeterFutureStub(channel);
+  }
+
+  /**
+   * <pre>
+   * The greeting service definition.
+   * </pre>
+   */
+  public static final class StreamingGreeterStub extends io.grpc.stub.AbstractStub<StreamingGreeterStub> {
+    private StreamingGreeterStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private StreamingGreeterStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected StreamingGreeterStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new StreamingGreeterStub(channel, callOptions);
+    }
+
+    /**
+     * <pre>
+     * Streams a many greetings
+     * </pre>
+     */
+    public io.grpc.stub.StreamObserver<io.grpc.examples.manualflowcontrol.HelloRequest> sayHelloStreaming(
+        io.grpc.stub.StreamObserver<io.grpc.examples.manualflowcontrol.HelloReply> responseObserver) {
+      return asyncBidiStreamingCall(
+          getChannel().newCall(getSayHelloStreamingMethod(), getCallOptions()), responseObserver);
+    }
+  }
+
+  /**
+   * <pre>
+   * The greeting service definition.
+   * </pre>
+   */
+  public static final class StreamingGreeterBlockingStub extends io.grpc.stub.AbstractStub<StreamingGreeterBlockingStub> {
+    private StreamingGreeterBlockingStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private StreamingGreeterBlockingStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected StreamingGreeterBlockingStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new StreamingGreeterBlockingStub(channel, callOptions);
+    }
+  }
+
+  /**
+   * <pre>
+   * The greeting service definition.
+   * </pre>
+   */
+  public static final class StreamingGreeterFutureStub extends io.grpc.stub.AbstractStub<StreamingGreeterFutureStub> {
+    private StreamingGreeterFutureStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private StreamingGreeterFutureStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected StreamingGreeterFutureStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new StreamingGreeterFutureStub(channel, callOptions);
+    }
+  }
+
+  public static abstract class StreamingGreeterImplBase implements io.grpc.BindableService, IStreamingGreeter {
+
+  public io.grpc.stub.StreamObserver<io.grpc.examples.manualflowcontrol.HelloRequest> sayHelloStreaming(
+      io.grpc.stub.StreamObserver<io.grpc.examples.manualflowcontrol.HelloReply> responseObserver) {
+      return asyncUnimplementedStreamingCall(getSayHelloStreamingMethod(), responseObserver);
+  }
+
+
+@java.lang.Override
+ public final io.grpc.ServerServiceDefinition bindService() {
+  return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+      .addMethod(
+        getSayHelloStreamingMethod(),
+        asyncBidiStreamingCall(
+          new MethodHandlers<
+            io.grpc.examples.manualflowcontrol.HelloRequest,
+            io.grpc.examples.manualflowcontrol.HelloReply>(
+              this, METHODID_SAY_HELLO_STREAMING)))
+      .build();
+}
+}
+
+/**
+ * Code generated for Dubbo
+ */
+public interface IStreamingGreeter {
+
+public io.grpc.stub.StreamObserver<io.grpc.examples.manualflowcontrol.HelloRequest> sayHelloStreaming(
+    io.grpc.stub.StreamObserver<io.grpc.examples.manualflowcontrol.HelloReply> responseObserver);
+
+}
+
+public static class DubboStreamingGreeterStub implements IStreamingGreeter {
+
+private StreamingGreeterBlockingStub blockingStub;
+private StreamingGreeterFutureStub futureStub;
+private StreamingGreeterStub stub;
+
+public DubboStreamingGreeterStub(io.grpc.Channel channel) {
+   blockingStub = StreamingGreeterGrpc.newBlockingStub(channel);
+   futureStub = StreamingGreeterGrpc.newFutureStub(channel);
+   stub = StreamingGreeterGrpc.newStub(channel);
+}
+
+public io.grpc.stub.StreamObserver<io.grpc.examples.manualflowcontrol.HelloRequest> sayHelloStreaming(
+    io.grpc.stub.StreamObserver<io.grpc.examples.manualflowcontrol.HelloReply> responseObserver) {
+    return stub.sayHelloStreaming(responseObserver);
+}
+
+}
+
+public static DubboStreamingGreeterStub getDubboStub(io.grpc.Channel channel) {
+
+  return new DubboStreamingGreeterStub(channel);}
+
+private static final int METHODID_SAY_HELLO_STREAMING = 0;
+
+private static final class MethodHandlers<Req, Resp> implements
+    io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+    io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+    io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+    io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+  private final StreamingGreeterImplBase serviceImpl;
+  private final int methodId;
+
+  MethodHandlers(StreamingGreeterImplBase serviceImpl, int methodId) {
+    this.serviceImpl = serviceImpl;
+    this.methodId = methodId;
+  }
+
+  @java.lang.Override
+  @java.lang.SuppressWarnings("unchecked")
+  public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+    switch (methodId) {
+      default:
+        throw new AssertionError();
+    }
+  }
+
+  @java.lang.Override
+  @java.lang.SuppressWarnings("unchecked")
+  public io.grpc.stub.StreamObserver<Req> invoke(
+      io.grpc.stub.StreamObserver<Resp> responseObserver) {
+    switch (methodId) {
+      case METHODID_SAY_HELLO_STREAMING:
+        return (io.grpc.stub.StreamObserver<Req>) serviceImpl.sayHelloStreaming(
+            (io.grpc.stub.StreamObserver<io.grpc.examples.manualflowcontrol.HelloReply>) responseObserver);
+      default:
+        throw new AssertionError();
+    }
+  }
+}
+
+private static abstract class StreamingGreeterBaseDescriptorSupplier
+    implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
+  StreamingGreeterBaseDescriptorSupplier() {}
+
+  @java.lang.Override
+  public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
+    return io.grpc.examples.manualflowcontrol.HelloStreamingProto.getDescriptor();
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
+    return getFileDescriptor().findServiceByName("StreamingGreeter");
+  }
+}
+
+private static final class StreamingGreeterFileDescriptorSupplier
+    extends StreamingGreeterBaseDescriptorSupplier {
+  StreamingGreeterFileDescriptorSupplier() {}
+}
+
+private static final class StreamingGreeterMethodDescriptorSupplier
+    extends StreamingGreeterBaseDescriptorSupplier
+    implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
+  private final String methodName;
+
+  StreamingGreeterMethodDescriptorSupplier(String methodName) {
+    this.methodName = methodName;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
+    return getServiceDescriptor().findMethodByName(methodName);
+  }
+}
+
+private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
+
+public static io.grpc.ServiceDescriptor getServiceDescriptor() {
+  io.grpc.ServiceDescriptor result = serviceDescriptor;
+  if (result == null) {
+    synchronized (StreamingGreeterGrpc.class) {
+      result = serviceDescriptor;
+      if (result == null) {
+        serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
+            .setSchemaDescriptor(new StreamingGreeterFileDescriptorSupplier())
+            .addMethod(getSayHelloStreamingMethod())
+            .build();
+      }
+    }
+  }
+  return result;
+}
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/Feature.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/Feature.java
new file mode 100644
index 0000000..d6c1149
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/Feature.java
@@ -0,0 +1,807 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+/**
+ * <pre>
+ * A feature names something at a given point.
+ * If a feature could not be named, the name is empty.
+ * </pre>
+ *
+ * Protobuf type {@code routeguide.Feature}
+ */
+public  final class Feature extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:routeguide.Feature)
+    FeatureOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use Feature.newBuilder() to construct.
+  private Feature(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private Feature() {
+    name_ = "";
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private Feature(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            name_ = s;
+            break;
+          }
+          case 18: {
+            io.grpc.examples.routeguide.Point.Builder subBuilder = null;
+            if (location_ != null) {
+              subBuilder = location_.toBuilder();
+            }
+            location_ = input.readMessage(io.grpc.examples.routeguide.Point.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(location_);
+              location_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Feature_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Feature_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            io.grpc.examples.routeguide.Feature.class, io.grpc.examples.routeguide.Feature.Builder.class);
+  }
+
+  public static final int NAME_FIELD_NUMBER = 1;
+  private volatile java.lang.Object name_;
+  /**
+   * <pre>
+   * The name of the feature.
+   * </pre>
+   *
+   * <code>string name = 1;</code>
+   */
+  public java.lang.String getName() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      name_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * The name of the feature.
+   * </pre>
+   *
+   * <code>string name = 1;</code>
+   */
+  public com.google.protobuf.ByteString
+      getNameBytes() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      name_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int LOCATION_FIELD_NUMBER = 2;
+  private io.grpc.examples.routeguide.Point location_;
+  /**
+   * <pre>
+   * The point where the feature is detected.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 2;</code>
+   */
+  public boolean hasLocation() {
+    return location_ != null;
+  }
+  /**
+   * <pre>
+   * The point where the feature is detected.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 2;</code>
+   */
+  public io.grpc.examples.routeguide.Point getLocation() {
+    return location_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : location_;
+  }
+  /**
+   * <pre>
+   * The point where the feature is detected.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 2;</code>
+   */
+  public io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder() {
+    return getLocation();
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!getNameBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
+    }
+    if (location_ != null) {
+      output.writeMessage(2, getLocation());
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getNameBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
+    }
+    if (location_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, getLocation());
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof io.grpc.examples.routeguide.Feature)) {
+      return super.equals(obj);
+    }
+    io.grpc.examples.routeguide.Feature other = (io.grpc.examples.routeguide.Feature) obj;
+
+    if (!getName()
+        .equals(other.getName())) return false;
+    if (hasLocation() != other.hasLocation()) return false;
+    if (hasLocation()) {
+      if (!getLocation()
+          .equals(other.getLocation())) return false;
+    }
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + NAME_FIELD_NUMBER;
+    hash = (53 * hash) + getName().hashCode();
+    if (hasLocation()) {
+      hash = (37 * hash) + LOCATION_FIELD_NUMBER;
+      hash = (53 * hash) + getLocation().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static io.grpc.examples.routeguide.Feature parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.Feature parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Feature parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.Feature parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Feature parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.Feature parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Feature parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.Feature parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Feature parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.Feature parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Feature parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.Feature parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(io.grpc.examples.routeguide.Feature prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * A feature names something at a given point.
+   * If a feature could not be named, the name is empty.
+   * </pre>
+   *
+   * Protobuf type {@code routeguide.Feature}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:routeguide.Feature)
+      io.grpc.examples.routeguide.FeatureOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Feature_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Feature_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              io.grpc.examples.routeguide.Feature.class, io.grpc.examples.routeguide.Feature.Builder.class);
+    }
+
+    // Construct using io.grpc.examples.routeguide.Feature.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      name_ = "";
+
+      if (locationBuilder_ == null) {
+        location_ = null;
+      } else {
+        location_ = null;
+        locationBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Feature_descriptor;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.Feature getDefaultInstanceForType() {
+      return io.grpc.examples.routeguide.Feature.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.Feature build() {
+      io.grpc.examples.routeguide.Feature result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.Feature buildPartial() {
+      io.grpc.examples.routeguide.Feature result = new io.grpc.examples.routeguide.Feature(this);
+      result.name_ = name_;
+      if (locationBuilder_ == null) {
+        result.location_ = location_;
+      } else {
+        result.location_ = locationBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof io.grpc.examples.routeguide.Feature) {
+        return mergeFrom((io.grpc.examples.routeguide.Feature)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(io.grpc.examples.routeguide.Feature other) {
+      if (other == io.grpc.examples.routeguide.Feature.getDefaultInstance()) return this;
+      if (!other.getName().isEmpty()) {
+        name_ = other.name_;
+        onChanged();
+      }
+      if (other.hasLocation()) {
+        mergeLocation(other.getLocation());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      io.grpc.examples.routeguide.Feature parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (io.grpc.examples.routeguide.Feature) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private java.lang.Object name_ = "";
+    /**
+     * <pre>
+     * The name of the feature.
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The name of the feature.
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The name of the feature.
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     */
+    public Builder setName(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      name_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The name of the feature.
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     */
+    public Builder clearName() {
+      
+      name_ = getDefaultInstance().getName();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The name of the feature.
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     */
+    public Builder setNameBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      name_ = value;
+      onChanged();
+      return this;
+    }
+
+    private io.grpc.examples.routeguide.Point location_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> locationBuilder_;
+    /**
+     * <pre>
+     * The point where the feature is detected.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 2;</code>
+     */
+    public boolean hasLocation() {
+      return locationBuilder_ != null || location_ != null;
+    }
+    /**
+     * <pre>
+     * The point where the feature is detected.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 2;</code>
+     */
+    public io.grpc.examples.routeguide.Point getLocation() {
+      if (locationBuilder_ == null) {
+        return location_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : location_;
+      } else {
+        return locationBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * The point where the feature is detected.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 2;</code>
+     */
+    public Builder setLocation(io.grpc.examples.routeguide.Point value) {
+      if (locationBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        location_ = value;
+        onChanged();
+      } else {
+        locationBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The point where the feature is detected.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 2;</code>
+     */
+    public Builder setLocation(
+        io.grpc.examples.routeguide.Point.Builder builderForValue) {
+      if (locationBuilder_ == null) {
+        location_ = builderForValue.build();
+        onChanged();
+      } else {
+        locationBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The point where the feature is detected.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 2;</code>
+     */
+    public Builder mergeLocation(io.grpc.examples.routeguide.Point value) {
+      if (locationBuilder_ == null) {
+        if (location_ != null) {
+          location_ =
+            io.grpc.examples.routeguide.Point.newBuilder(location_).mergeFrom(value).buildPartial();
+        } else {
+          location_ = value;
+        }
+        onChanged();
+      } else {
+        locationBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The point where the feature is detected.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 2;</code>
+     */
+    public Builder clearLocation() {
+      if (locationBuilder_ == null) {
+        location_ = null;
+        onChanged();
+      } else {
+        location_ = null;
+        locationBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The point where the feature is detected.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 2;</code>
+     */
+    public io.grpc.examples.routeguide.Point.Builder getLocationBuilder() {
+      
+      onChanged();
+      return getLocationFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * The point where the feature is detected.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 2;</code>
+     */
+    public io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder() {
+      if (locationBuilder_ != null) {
+        return locationBuilder_.getMessageOrBuilder();
+      } else {
+        return location_ == null ?
+            io.grpc.examples.routeguide.Point.getDefaultInstance() : location_;
+      }
+    }
+    /**
+     * <pre>
+     * The point where the feature is detected.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 2;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> 
+        getLocationFieldBuilder() {
+      if (locationBuilder_ == null) {
+        locationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder>(
+                getLocation(),
+                getParentForChildren(),
+                isClean());
+        location_ = null;
+      }
+      return locationBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:routeguide.Feature)
+  }
+
+  // @@protoc_insertion_point(class_scope:routeguide.Feature)
+  private static final io.grpc.examples.routeguide.Feature DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new io.grpc.examples.routeguide.Feature();
+  }
+
+  public static io.grpc.examples.routeguide.Feature getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<Feature>
+      PARSER = new com.google.protobuf.AbstractParser<Feature>() {
+    @java.lang.Override
+    public Feature parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new Feature(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<Feature> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<Feature> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public io.grpc.examples.routeguide.Feature getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/FeatureDatabase.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/FeatureDatabase.java
new file mode 100644
index 0000000..07ee540
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/FeatureDatabase.java
@@ -0,0 +1,766 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+/**
+ * <pre>
+ * Not used in the RPC.  Instead, this is here for the form serialized to disk.
+ * </pre>
+ *
+ * Protobuf type {@code routeguide.FeatureDatabase}
+ */
+public  final class FeatureDatabase extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:routeguide.FeatureDatabase)
+    FeatureDatabaseOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use FeatureDatabase.newBuilder() to construct.
+  private FeatureDatabase(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private FeatureDatabase() {
+    feature_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private FeatureDatabase(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              feature_ = new java.util.ArrayList<io.grpc.examples.routeguide.Feature>();
+              mutable_bitField0_ |= 0x00000001;
+            }
+            feature_.add(
+                input.readMessage(io.grpc.examples.routeguide.Feature.parser(), extensionRegistry));
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      if (((mutable_bitField0_ & 0x00000001) != 0)) {
+        feature_ = java.util.Collections.unmodifiableList(feature_);
+      }
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_FeatureDatabase_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_FeatureDatabase_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            io.grpc.examples.routeguide.FeatureDatabase.class, io.grpc.examples.routeguide.FeatureDatabase.Builder.class);
+  }
+
+  public static final int FEATURE_FIELD_NUMBER = 1;
+  private java.util.List<io.grpc.examples.routeguide.Feature> feature_;
+  /**
+   * <code>repeated .routeguide.Feature feature = 1;</code>
+   */
+  public java.util.List<io.grpc.examples.routeguide.Feature> getFeatureList() {
+    return feature_;
+  }
+  /**
+   * <code>repeated .routeguide.Feature feature = 1;</code>
+   */
+  public java.util.List<? extends io.grpc.examples.routeguide.FeatureOrBuilder> 
+      getFeatureOrBuilderList() {
+    return feature_;
+  }
+  /**
+   * <code>repeated .routeguide.Feature feature = 1;</code>
+   */
+  public int getFeatureCount() {
+    return feature_.size();
+  }
+  /**
+   * <code>repeated .routeguide.Feature feature = 1;</code>
+   */
+  public io.grpc.examples.routeguide.Feature getFeature(int index) {
+    return feature_.get(index);
+  }
+  /**
+   * <code>repeated .routeguide.Feature feature = 1;</code>
+   */
+  public io.grpc.examples.routeguide.FeatureOrBuilder getFeatureOrBuilder(
+      int index) {
+    return feature_.get(index);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    for (int i = 0; i < feature_.size(); i++) {
+      output.writeMessage(1, feature_.get(i));
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    for (int i = 0; i < feature_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, feature_.get(i));
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof io.grpc.examples.routeguide.FeatureDatabase)) {
+      return super.equals(obj);
+    }
+    io.grpc.examples.routeguide.FeatureDatabase other = (io.grpc.examples.routeguide.FeatureDatabase) obj;
+
+    if (!getFeatureList()
+        .equals(other.getFeatureList())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (getFeatureCount() > 0) {
+      hash = (37 * hash) + FEATURE_FIELD_NUMBER;
+      hash = (53 * hash) + getFeatureList().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.FeatureDatabase parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(io.grpc.examples.routeguide.FeatureDatabase prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * Not used in the RPC.  Instead, this is here for the form serialized to disk.
+   * </pre>
+   *
+   * Protobuf type {@code routeguide.FeatureDatabase}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:routeguide.FeatureDatabase)
+      io.grpc.examples.routeguide.FeatureDatabaseOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_FeatureDatabase_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_FeatureDatabase_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              io.grpc.examples.routeguide.FeatureDatabase.class, io.grpc.examples.routeguide.FeatureDatabase.Builder.class);
+    }
+
+    // Construct using io.grpc.examples.routeguide.FeatureDatabase.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getFeatureFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (featureBuilder_ == null) {
+        feature_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+      } else {
+        featureBuilder_.clear();
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_FeatureDatabase_descriptor;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.FeatureDatabase getDefaultInstanceForType() {
+      return io.grpc.examples.routeguide.FeatureDatabase.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.FeatureDatabase build() {
+      io.grpc.examples.routeguide.FeatureDatabase result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.FeatureDatabase buildPartial() {
+      io.grpc.examples.routeguide.FeatureDatabase result = new io.grpc.examples.routeguide.FeatureDatabase(this);
+      int from_bitField0_ = bitField0_;
+      if (featureBuilder_ == null) {
+        if (((bitField0_ & 0x00000001) != 0)) {
+          feature_ = java.util.Collections.unmodifiableList(feature_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.feature_ = feature_;
+      } else {
+        result.feature_ = featureBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof io.grpc.examples.routeguide.FeatureDatabase) {
+        return mergeFrom((io.grpc.examples.routeguide.FeatureDatabase)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(io.grpc.examples.routeguide.FeatureDatabase other) {
+      if (other == io.grpc.examples.routeguide.FeatureDatabase.getDefaultInstance()) return this;
+      if (featureBuilder_ == null) {
+        if (!other.feature_.isEmpty()) {
+          if (feature_.isEmpty()) {
+            feature_ = other.feature_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureFeatureIsMutable();
+            feature_.addAll(other.feature_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.feature_.isEmpty()) {
+          if (featureBuilder_.isEmpty()) {
+            featureBuilder_.dispose();
+            featureBuilder_ = null;
+            feature_ = other.feature_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+            featureBuilder_ = 
+              com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                 getFeatureFieldBuilder() : null;
+          } else {
+            featureBuilder_.addAllMessages(other.feature_);
+          }
+        }
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      io.grpc.examples.routeguide.FeatureDatabase parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (io.grpc.examples.routeguide.FeatureDatabase) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private java.util.List<io.grpc.examples.routeguide.Feature> feature_ =
+      java.util.Collections.emptyList();
+    private void ensureFeatureIsMutable() {
+      if (!((bitField0_ & 0x00000001) != 0)) {
+        feature_ = new java.util.ArrayList<io.grpc.examples.routeguide.Feature>(feature_);
+        bitField0_ |= 0x00000001;
+       }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        io.grpc.examples.routeguide.Feature, io.grpc.examples.routeguide.Feature.Builder, io.grpc.examples.routeguide.FeatureOrBuilder> featureBuilder_;
+
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public java.util.List<io.grpc.examples.routeguide.Feature> getFeatureList() {
+      if (featureBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(feature_);
+      } else {
+        return featureBuilder_.getMessageList();
+      }
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public int getFeatureCount() {
+      if (featureBuilder_ == null) {
+        return feature_.size();
+      } else {
+        return featureBuilder_.getCount();
+      }
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public io.grpc.examples.routeguide.Feature getFeature(int index) {
+      if (featureBuilder_ == null) {
+        return feature_.get(index);
+      } else {
+        return featureBuilder_.getMessage(index);
+      }
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public Builder setFeature(
+        int index, io.grpc.examples.routeguide.Feature value) {
+      if (featureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureFeatureIsMutable();
+        feature_.set(index, value);
+        onChanged();
+      } else {
+        featureBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public Builder setFeature(
+        int index, io.grpc.examples.routeguide.Feature.Builder builderForValue) {
+      if (featureBuilder_ == null) {
+        ensureFeatureIsMutable();
+        feature_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        featureBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public Builder addFeature(io.grpc.examples.routeguide.Feature value) {
+      if (featureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureFeatureIsMutable();
+        feature_.add(value);
+        onChanged();
+      } else {
+        featureBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public Builder addFeature(
+        int index, io.grpc.examples.routeguide.Feature value) {
+      if (featureBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureFeatureIsMutable();
+        feature_.add(index, value);
+        onChanged();
+      } else {
+        featureBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public Builder addFeature(
+        io.grpc.examples.routeguide.Feature.Builder builderForValue) {
+      if (featureBuilder_ == null) {
+        ensureFeatureIsMutable();
+        feature_.add(builderForValue.build());
+        onChanged();
+      } else {
+        featureBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public Builder addFeature(
+        int index, io.grpc.examples.routeguide.Feature.Builder builderForValue) {
+      if (featureBuilder_ == null) {
+        ensureFeatureIsMutable();
+        feature_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        featureBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public Builder addAllFeature(
+        java.lang.Iterable<? extends io.grpc.examples.routeguide.Feature> values) {
+      if (featureBuilder_ == null) {
+        ensureFeatureIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, feature_);
+        onChanged();
+      } else {
+        featureBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public Builder clearFeature() {
+      if (featureBuilder_ == null) {
+        feature_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+      } else {
+        featureBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public Builder removeFeature(int index) {
+      if (featureBuilder_ == null) {
+        ensureFeatureIsMutable();
+        feature_.remove(index);
+        onChanged();
+      } else {
+        featureBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public io.grpc.examples.routeguide.Feature.Builder getFeatureBuilder(
+        int index) {
+      return getFeatureFieldBuilder().getBuilder(index);
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public io.grpc.examples.routeguide.FeatureOrBuilder getFeatureOrBuilder(
+        int index) {
+      if (featureBuilder_ == null) {
+        return feature_.get(index);  } else {
+        return featureBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public java.util.List<? extends io.grpc.examples.routeguide.FeatureOrBuilder> 
+         getFeatureOrBuilderList() {
+      if (featureBuilder_ != null) {
+        return featureBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(feature_);
+      }
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public io.grpc.examples.routeguide.Feature.Builder addFeatureBuilder() {
+      return getFeatureFieldBuilder().addBuilder(
+          io.grpc.examples.routeguide.Feature.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public io.grpc.examples.routeguide.Feature.Builder addFeatureBuilder(
+        int index) {
+      return getFeatureFieldBuilder().addBuilder(
+          index, io.grpc.examples.routeguide.Feature.getDefaultInstance());
+    }
+    /**
+     * <code>repeated .routeguide.Feature feature = 1;</code>
+     */
+    public java.util.List<io.grpc.examples.routeguide.Feature.Builder> 
+         getFeatureBuilderList() {
+      return getFeatureFieldBuilder().getBuilderList();
+    }
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+        io.grpc.examples.routeguide.Feature, io.grpc.examples.routeguide.Feature.Builder, io.grpc.examples.routeguide.FeatureOrBuilder> 
+        getFeatureFieldBuilder() {
+      if (featureBuilder_ == null) {
+        featureBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+            io.grpc.examples.routeguide.Feature, io.grpc.examples.routeguide.Feature.Builder, io.grpc.examples.routeguide.FeatureOrBuilder>(
+                feature_,
+                ((bitField0_ & 0x00000001) != 0),
+                getParentForChildren(),
+                isClean());
+        feature_ = null;
+      }
+      return featureBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:routeguide.FeatureDatabase)
+  }
+
+  // @@protoc_insertion_point(class_scope:routeguide.FeatureDatabase)
+  private static final io.grpc.examples.routeguide.FeatureDatabase DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new io.grpc.examples.routeguide.FeatureDatabase();
+  }
+
+  public static io.grpc.examples.routeguide.FeatureDatabase getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<FeatureDatabase>
+      PARSER = new com.google.protobuf.AbstractParser<FeatureDatabase>() {
+    @java.lang.Override
+    public FeatureDatabase parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new FeatureDatabase(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<FeatureDatabase> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<FeatureDatabase> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public io.grpc.examples.routeguide.FeatureDatabase getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/FeatureDatabaseOrBuilder.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/FeatureDatabaseOrBuilder.java
new file mode 100644
index 0000000..717c23f
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/FeatureDatabaseOrBuilder.java
@@ -0,0 +1,33 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+public interface FeatureDatabaseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:routeguide.FeatureDatabase)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>repeated .routeguide.Feature feature = 1;</code>
+   */
+  java.util.List<io.grpc.examples.routeguide.Feature> 
+      getFeatureList();
+  /**
+   * <code>repeated .routeguide.Feature feature = 1;</code>
+   */
+  io.grpc.examples.routeguide.Feature getFeature(int index);
+  /**
+   * <code>repeated .routeguide.Feature feature = 1;</code>
+   */
+  int getFeatureCount();
+  /**
+   * <code>repeated .routeguide.Feature feature = 1;</code>
+   */
+  java.util.List<? extends io.grpc.examples.routeguide.FeatureOrBuilder> 
+      getFeatureOrBuilderList();
+  /**
+   * <code>repeated .routeguide.Feature feature = 1;</code>
+   */
+  io.grpc.examples.routeguide.FeatureOrBuilder getFeatureOrBuilder(
+      int index);
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/FeatureOrBuilder.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/FeatureOrBuilder.java
new file mode 100644
index 0000000..6e5cba1
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/FeatureOrBuilder.java
@@ -0,0 +1,52 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+public interface FeatureOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:routeguide.Feature)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * The name of the feature.
+   * </pre>
+   *
+   * <code>string name = 1;</code>
+   */
+  java.lang.String getName();
+  /**
+   * <pre>
+   * The name of the feature.
+   * </pre>
+   *
+   * <code>string name = 1;</code>
+   */
+  com.google.protobuf.ByteString
+      getNameBytes();
+
+  /**
+   * <pre>
+   * The point where the feature is detected.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 2;</code>
+   */
+  boolean hasLocation();
+  /**
+   * <pre>
+   * The point where the feature is detected.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 2;</code>
+   */
+  io.grpc.examples.routeguide.Point getLocation();
+  /**
+   * <pre>
+   * The point where the feature is detected.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 2;</code>
+   */
+  io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder();
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/Point.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/Point.java
new file mode 100644
index 0000000..3a96ea0
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/Point.java
@@ -0,0 +1,541 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+/**
+ * <pre>
+ * Points are represented as latitude-longitude pairs in the E7 representation
+ * (degrees multiplied by 10**7 and rounded to the nearest integer).
+ * Latitudes should be in the range +/- 90 degrees and longitude should be in
+ * the range +/- 180 degrees (inclusive).
+ * </pre>
+ *
+ * Protobuf type {@code routeguide.Point}
+ */
+public  final class Point extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:routeguide.Point)
+    PointOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use Point.newBuilder() to construct.
+  private Point(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private Point() {
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private Point(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+
+            latitude_ = input.readInt32();
+            break;
+          }
+          case 16: {
+
+            longitude_ = input.readInt32();
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Point_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Point_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            io.grpc.examples.routeguide.Point.class, io.grpc.examples.routeguide.Point.Builder.class);
+  }
+
+  public static final int LATITUDE_FIELD_NUMBER = 1;
+  private int latitude_;
+  /**
+   * <code>int32 latitude = 1;</code>
+   */
+  public int getLatitude() {
+    return latitude_;
+  }
+
+  public static final int LONGITUDE_FIELD_NUMBER = 2;
+  private int longitude_;
+  /**
+   * <code>int32 longitude = 2;</code>
+   */
+  public int getLongitude() {
+    return longitude_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (latitude_ != 0) {
+      output.writeInt32(1, latitude_);
+    }
+    if (longitude_ != 0) {
+      output.writeInt32(2, longitude_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (latitude_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(1, latitude_);
+    }
+    if (longitude_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(2, longitude_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof io.grpc.examples.routeguide.Point)) {
+      return super.equals(obj);
+    }
+    io.grpc.examples.routeguide.Point other = (io.grpc.examples.routeguide.Point) obj;
+
+    if (getLatitude()
+        != other.getLatitude()) return false;
+    if (getLongitude()
+        != other.getLongitude()) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + LATITUDE_FIELD_NUMBER;
+    hash = (53 * hash) + getLatitude();
+    hash = (37 * hash) + LONGITUDE_FIELD_NUMBER;
+    hash = (53 * hash) + getLongitude();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static io.grpc.examples.routeguide.Point parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.Point parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Point parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.Point parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Point parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.Point parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Point parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.Point parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Point parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.Point parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Point parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.Point parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(io.grpc.examples.routeguide.Point prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * Points are represented as latitude-longitude pairs in the E7 representation
+   * (degrees multiplied by 10**7 and rounded to the nearest integer).
+   * Latitudes should be in the range +/- 90 degrees and longitude should be in
+   * the range +/- 180 degrees (inclusive).
+   * </pre>
+   *
+   * Protobuf type {@code routeguide.Point}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:routeguide.Point)
+      io.grpc.examples.routeguide.PointOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Point_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Point_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              io.grpc.examples.routeguide.Point.class, io.grpc.examples.routeguide.Point.Builder.class);
+    }
+
+    // Construct using io.grpc.examples.routeguide.Point.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      latitude_ = 0;
+
+      longitude_ = 0;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Point_descriptor;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.Point getDefaultInstanceForType() {
+      return io.grpc.examples.routeguide.Point.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.Point build() {
+      io.grpc.examples.routeguide.Point result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.Point buildPartial() {
+      io.grpc.examples.routeguide.Point result = new io.grpc.examples.routeguide.Point(this);
+      result.latitude_ = latitude_;
+      result.longitude_ = longitude_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof io.grpc.examples.routeguide.Point) {
+        return mergeFrom((io.grpc.examples.routeguide.Point)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(io.grpc.examples.routeguide.Point other) {
+      if (other == io.grpc.examples.routeguide.Point.getDefaultInstance()) return this;
+      if (other.getLatitude() != 0) {
+        setLatitude(other.getLatitude());
+      }
+      if (other.getLongitude() != 0) {
+        setLongitude(other.getLongitude());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      io.grpc.examples.routeguide.Point parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (io.grpc.examples.routeguide.Point) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private int latitude_ ;
+    /**
+     * <code>int32 latitude = 1;</code>
+     */
+    public int getLatitude() {
+      return latitude_;
+    }
+    /**
+     * <code>int32 latitude = 1;</code>
+     */
+    public Builder setLatitude(int value) {
+      
+      latitude_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int32 latitude = 1;</code>
+     */
+    public Builder clearLatitude() {
+      
+      latitude_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private int longitude_ ;
+    /**
+     * <code>int32 longitude = 2;</code>
+     */
+    public int getLongitude() {
+      return longitude_;
+    }
+    /**
+     * <code>int32 longitude = 2;</code>
+     */
+    public Builder setLongitude(int value) {
+      
+      longitude_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>int32 longitude = 2;</code>
+     */
+    public Builder clearLongitude() {
+      
+      longitude_ = 0;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:routeguide.Point)
+  }
+
+  // @@protoc_insertion_point(class_scope:routeguide.Point)
+  private static final io.grpc.examples.routeguide.Point DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new io.grpc.examples.routeguide.Point();
+  }
+
+  public static io.grpc.examples.routeguide.Point getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<Point>
+      PARSER = new com.google.protobuf.AbstractParser<Point>() {
+    @java.lang.Override
+    public Point parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new Point(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<Point> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<Point> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public io.grpc.examples.routeguide.Point getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/PointOrBuilder.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/PointOrBuilder.java
new file mode 100644
index 0000000..70df4b0
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/PointOrBuilder.java
@@ -0,0 +1,19 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+public interface PointOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:routeguide.Point)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>int32 latitude = 1;</code>
+   */
+  int getLatitude();
+
+  /**
+   * <code>int32 longitude = 2;</code>
+   */
+  int getLongitude();
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/Rectangle.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/Rectangle.java
new file mode 100644
index 0000000..797a824
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/Rectangle.java
@@ -0,0 +1,881 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+/**
+ * <pre>
+ * A latitude-longitude rectangle, represented as two diagonally opposite
+ * points "lo" and "hi".
+ * </pre>
+ *
+ * Protobuf type {@code routeguide.Rectangle}
+ */
+public  final class Rectangle extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:routeguide.Rectangle)
+    RectangleOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use Rectangle.newBuilder() to construct.
+  private Rectangle(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private Rectangle() {
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private Rectangle(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            io.grpc.examples.routeguide.Point.Builder subBuilder = null;
+            if (lo_ != null) {
+              subBuilder = lo_.toBuilder();
+            }
+            lo_ = input.readMessage(io.grpc.examples.routeguide.Point.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(lo_);
+              lo_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            io.grpc.examples.routeguide.Point.Builder subBuilder = null;
+            if (hi_ != null) {
+              subBuilder = hi_.toBuilder();
+            }
+            hi_ = input.readMessage(io.grpc.examples.routeguide.Point.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(hi_);
+              hi_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Rectangle_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Rectangle_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            io.grpc.examples.routeguide.Rectangle.class, io.grpc.examples.routeguide.Rectangle.Builder.class);
+  }
+
+  public static final int LO_FIELD_NUMBER = 1;
+  private io.grpc.examples.routeguide.Point lo_;
+  /**
+   * <pre>
+   * One corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point lo = 1;</code>
+   */
+  public boolean hasLo() {
+    return lo_ != null;
+  }
+  /**
+   * <pre>
+   * One corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point lo = 1;</code>
+   */
+  public io.grpc.examples.routeguide.Point getLo() {
+    return lo_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : lo_;
+  }
+  /**
+   * <pre>
+   * One corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point lo = 1;</code>
+   */
+  public io.grpc.examples.routeguide.PointOrBuilder getLoOrBuilder() {
+    return getLo();
+  }
+
+  public static final int HI_FIELD_NUMBER = 2;
+  private io.grpc.examples.routeguide.Point hi_;
+  /**
+   * <pre>
+   * The other corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point hi = 2;</code>
+   */
+  public boolean hasHi() {
+    return hi_ != null;
+  }
+  /**
+   * <pre>
+   * The other corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point hi = 2;</code>
+   */
+  public io.grpc.examples.routeguide.Point getHi() {
+    return hi_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : hi_;
+  }
+  /**
+   * <pre>
+   * The other corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point hi = 2;</code>
+   */
+  public io.grpc.examples.routeguide.PointOrBuilder getHiOrBuilder() {
+    return getHi();
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (lo_ != null) {
+      output.writeMessage(1, getLo());
+    }
+    if (hi_ != null) {
+      output.writeMessage(2, getHi());
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (lo_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getLo());
+    }
+    if (hi_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(2, getHi());
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof io.grpc.examples.routeguide.Rectangle)) {
+      return super.equals(obj);
+    }
+    io.grpc.examples.routeguide.Rectangle other = (io.grpc.examples.routeguide.Rectangle) obj;
+
+    if (hasLo() != other.hasLo()) return false;
+    if (hasLo()) {
+      if (!getLo()
+          .equals(other.getLo())) return false;
+    }
+    if (hasHi() != other.hasHi()) return false;
+    if (hasHi()) {
+      if (!getHi()
+          .equals(other.getHi())) return false;
+    }
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasLo()) {
+      hash = (37 * hash) + LO_FIELD_NUMBER;
+      hash = (53 * hash) + getLo().hashCode();
+    }
+    if (hasHi()) {
+      hash = (37 * hash) + HI_FIELD_NUMBER;
+      hash = (53 * hash) + getHi().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static io.grpc.examples.routeguide.Rectangle parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.Rectangle parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(io.grpc.examples.routeguide.Rectangle prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * A latitude-longitude rectangle, represented as two diagonally opposite
+   * points "lo" and "hi".
+   * </pre>
+   *
+   * Protobuf type {@code routeguide.Rectangle}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:routeguide.Rectangle)
+      io.grpc.examples.routeguide.RectangleOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Rectangle_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Rectangle_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              io.grpc.examples.routeguide.Rectangle.class, io.grpc.examples.routeguide.Rectangle.Builder.class);
+    }
+
+    // Construct using io.grpc.examples.routeguide.Rectangle.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (loBuilder_ == null) {
+        lo_ = null;
+      } else {
+        lo_ = null;
+        loBuilder_ = null;
+      }
+      if (hiBuilder_ == null) {
+        hi_ = null;
+      } else {
+        hi_ = null;
+        hiBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_Rectangle_descriptor;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.Rectangle getDefaultInstanceForType() {
+      return io.grpc.examples.routeguide.Rectangle.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.Rectangle build() {
+      io.grpc.examples.routeguide.Rectangle result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.Rectangle buildPartial() {
+      io.grpc.examples.routeguide.Rectangle result = new io.grpc.examples.routeguide.Rectangle(this);
+      if (loBuilder_ == null) {
+        result.lo_ = lo_;
+      } else {
+        result.lo_ = loBuilder_.build();
+      }
+      if (hiBuilder_ == null) {
+        result.hi_ = hi_;
+      } else {
+        result.hi_ = hiBuilder_.build();
+      }
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof io.grpc.examples.routeguide.Rectangle) {
+        return mergeFrom((io.grpc.examples.routeguide.Rectangle)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(io.grpc.examples.routeguide.Rectangle other) {
+      if (other == io.grpc.examples.routeguide.Rectangle.getDefaultInstance()) return this;
+      if (other.hasLo()) {
+        mergeLo(other.getLo());
+      }
+      if (other.hasHi()) {
+        mergeHi(other.getHi());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      io.grpc.examples.routeguide.Rectangle parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (io.grpc.examples.routeguide.Rectangle) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private io.grpc.examples.routeguide.Point lo_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> loBuilder_;
+    /**
+     * <pre>
+     * One corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point lo = 1;</code>
+     */
+    public boolean hasLo() {
+      return loBuilder_ != null || lo_ != null;
+    }
+    /**
+     * <pre>
+     * One corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point lo = 1;</code>
+     */
+    public io.grpc.examples.routeguide.Point getLo() {
+      if (loBuilder_ == null) {
+        return lo_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : lo_;
+      } else {
+        return loBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * One corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point lo = 1;</code>
+     */
+    public Builder setLo(io.grpc.examples.routeguide.Point value) {
+      if (loBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        lo_ = value;
+        onChanged();
+      } else {
+        loBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * One corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point lo = 1;</code>
+     */
+    public Builder setLo(
+        io.grpc.examples.routeguide.Point.Builder builderForValue) {
+      if (loBuilder_ == null) {
+        lo_ = builderForValue.build();
+        onChanged();
+      } else {
+        loBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * One corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point lo = 1;</code>
+     */
+    public Builder mergeLo(io.grpc.examples.routeguide.Point value) {
+      if (loBuilder_ == null) {
+        if (lo_ != null) {
+          lo_ =
+            io.grpc.examples.routeguide.Point.newBuilder(lo_).mergeFrom(value).buildPartial();
+        } else {
+          lo_ = value;
+        }
+        onChanged();
+      } else {
+        loBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * One corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point lo = 1;</code>
+     */
+    public Builder clearLo() {
+      if (loBuilder_ == null) {
+        lo_ = null;
+        onChanged();
+      } else {
+        lo_ = null;
+        loBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * One corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point lo = 1;</code>
+     */
+    public io.grpc.examples.routeguide.Point.Builder getLoBuilder() {
+      
+      onChanged();
+      return getLoFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * One corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point lo = 1;</code>
+     */
+    public io.grpc.examples.routeguide.PointOrBuilder getLoOrBuilder() {
+      if (loBuilder_ != null) {
+        return loBuilder_.getMessageOrBuilder();
+      } else {
+        return lo_ == null ?
+            io.grpc.examples.routeguide.Point.getDefaultInstance() : lo_;
+      }
+    }
+    /**
+     * <pre>
+     * One corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point lo = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> 
+        getLoFieldBuilder() {
+      if (loBuilder_ == null) {
+        loBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder>(
+                getLo(),
+                getParentForChildren(),
+                isClean());
+        lo_ = null;
+      }
+      return loBuilder_;
+    }
+
+    private io.grpc.examples.routeguide.Point hi_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> hiBuilder_;
+    /**
+     * <pre>
+     * The other corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point hi = 2;</code>
+     */
+    public boolean hasHi() {
+      return hiBuilder_ != null || hi_ != null;
+    }
+    /**
+     * <pre>
+     * The other corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point hi = 2;</code>
+     */
+    public io.grpc.examples.routeguide.Point getHi() {
+      if (hiBuilder_ == null) {
+        return hi_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : hi_;
+      } else {
+        return hiBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * The other corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point hi = 2;</code>
+     */
+    public Builder setHi(io.grpc.examples.routeguide.Point value) {
+      if (hiBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        hi_ = value;
+        onChanged();
+      } else {
+        hiBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The other corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point hi = 2;</code>
+     */
+    public Builder setHi(
+        io.grpc.examples.routeguide.Point.Builder builderForValue) {
+      if (hiBuilder_ == null) {
+        hi_ = builderForValue.build();
+        onChanged();
+      } else {
+        hiBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The other corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point hi = 2;</code>
+     */
+    public Builder mergeHi(io.grpc.examples.routeguide.Point value) {
+      if (hiBuilder_ == null) {
+        if (hi_ != null) {
+          hi_ =
+            io.grpc.examples.routeguide.Point.newBuilder(hi_).mergeFrom(value).buildPartial();
+        } else {
+          hi_ = value;
+        }
+        onChanged();
+      } else {
+        hiBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The other corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point hi = 2;</code>
+     */
+    public Builder clearHi() {
+      if (hiBuilder_ == null) {
+        hi_ = null;
+        onChanged();
+      } else {
+        hi_ = null;
+        hiBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The other corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point hi = 2;</code>
+     */
+    public io.grpc.examples.routeguide.Point.Builder getHiBuilder() {
+      
+      onChanged();
+      return getHiFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * The other corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point hi = 2;</code>
+     */
+    public io.grpc.examples.routeguide.PointOrBuilder getHiOrBuilder() {
+      if (hiBuilder_ != null) {
+        return hiBuilder_.getMessageOrBuilder();
+      } else {
+        return hi_ == null ?
+            io.grpc.examples.routeguide.Point.getDefaultInstance() : hi_;
+      }
+    }
+    /**
+     * <pre>
+     * The other corner of the rectangle.
+     * </pre>
+     *
+     * <code>.routeguide.Point hi = 2;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> 
+        getHiFieldBuilder() {
+      if (hiBuilder_ == null) {
+        hiBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder>(
+                getHi(),
+                getParentForChildren(),
+                isClean());
+        hi_ = null;
+      }
+      return hiBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:routeguide.Rectangle)
+  }
+
+  // @@protoc_insertion_point(class_scope:routeguide.Rectangle)
+  private static final io.grpc.examples.routeguide.Rectangle DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new io.grpc.examples.routeguide.Rectangle();
+  }
+
+  public static io.grpc.examples.routeguide.Rectangle getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<Rectangle>
+      PARSER = new com.google.protobuf.AbstractParser<Rectangle>() {
+    @java.lang.Override
+    public Rectangle parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new Rectangle(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<Rectangle> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<Rectangle> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public io.grpc.examples.routeguide.Rectangle getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RectangleOrBuilder.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RectangleOrBuilder.java
new file mode 100644
index 0000000..6d43cf9
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RectangleOrBuilder.java
@@ -0,0 +1,59 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+public interface RectangleOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:routeguide.Rectangle)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * One corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point lo = 1;</code>
+   */
+  boolean hasLo();
+  /**
+   * <pre>
+   * One corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point lo = 1;</code>
+   */
+  io.grpc.examples.routeguide.Point getLo();
+  /**
+   * <pre>
+   * One corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point lo = 1;</code>
+   */
+  io.grpc.examples.routeguide.PointOrBuilder getLoOrBuilder();
+
+  /**
+   * <pre>
+   * The other corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point hi = 2;</code>
+   */
+  boolean hasHi();
+  /**
+   * <pre>
+   * The other corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point hi = 2;</code>
+   */
+  io.grpc.examples.routeguide.Point getHi();
+  /**
+   * <pre>
+   * The other corner of the rectangle.
+   * </pre>
+   *
+   * <code>.routeguide.Point hi = 2;</code>
+   */
+  io.grpc.examples.routeguide.PointOrBuilder getHiOrBuilder();
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteGuideGrpc.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteGuideGrpc.java
new file mode 100644
index 0000000..71d3f15
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteGuideGrpc.java
@@ -0,0 +1,614 @@
+package io.grpc.examples.routeguide;
+
+import static io.grpc.MethodDescriptor.generateFullMethodName;
+import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncUnaryCall;
+import static io.grpc.stub.ClientCalls.blockingServerStreamingCall;
+import static io.grpc.stub.ClientCalls.blockingUnaryCall;
+import static io.grpc.stub.ClientCalls.futureUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
+
+/**
+ * <pre>
+ * Interface exported by the server.
+ * </pre>
+ */
+@javax.annotation.Generated(
+    value = "by gRPC proto compiler (version 1.19.0-SNAPSHOT)",
+    comments = "Source: route_guide.proto")
+public final class RouteGuideGrpc {
+
+  private RouteGuideGrpc() {}
+
+  public static final String SERVICE_NAME = "routeguide.RouteGuide";
+
+  // Static method descriptors that strictly reflect the proto.
+  private static volatile io.grpc.MethodDescriptor<io.grpc.examples.routeguide.Point,
+      io.grpc.examples.routeguide.Feature> getGetFeatureMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetFeature",
+      requestType = io.grpc.examples.routeguide.Point.class,
+      responseType = io.grpc.examples.routeguide.Feature.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<io.grpc.examples.routeguide.Point,
+      io.grpc.examples.routeguide.Feature> getGetFeatureMethod() {
+    io.grpc.MethodDescriptor<io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Feature> getGetFeatureMethod;
+    if ((getGetFeatureMethod = RouteGuideGrpc.getGetFeatureMethod) == null) {
+      synchronized (RouteGuideGrpc.class) {
+        if ((getGetFeatureMethod = RouteGuideGrpc.getGetFeatureMethod) == null) {
+          RouteGuideGrpc.getGetFeatureMethod = getGetFeatureMethod = 
+              io.grpc.MethodDescriptor.<io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Feature>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(
+                  "routeguide.RouteGuide", "GetFeature"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.routeguide.Point.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.routeguide.Feature.getDefaultInstance()))
+                  .setSchemaDescriptor(new RouteGuideMethodDescriptorSupplier("GetFeature"))
+                  .build();
+          }
+        }
+     }
+     return getGetFeatureMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<io.grpc.examples.routeguide.Rectangle,
+      io.grpc.examples.routeguide.Feature> getListFeaturesMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "ListFeatures",
+      requestType = io.grpc.examples.routeguide.Rectangle.class,
+      responseType = io.grpc.examples.routeguide.Feature.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.SERVER_STREAMING)
+  public static io.grpc.MethodDescriptor<io.grpc.examples.routeguide.Rectangle,
+      io.grpc.examples.routeguide.Feature> getListFeaturesMethod() {
+    io.grpc.MethodDescriptor<io.grpc.examples.routeguide.Rectangle, io.grpc.examples.routeguide.Feature> getListFeaturesMethod;
+    if ((getListFeaturesMethod = RouteGuideGrpc.getListFeaturesMethod) == null) {
+      synchronized (RouteGuideGrpc.class) {
+        if ((getListFeaturesMethod = RouteGuideGrpc.getListFeaturesMethod) == null) {
+          RouteGuideGrpc.getListFeaturesMethod = getListFeaturesMethod = 
+              io.grpc.MethodDescriptor.<io.grpc.examples.routeguide.Rectangle, io.grpc.examples.routeguide.Feature>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.SERVER_STREAMING)
+              .setFullMethodName(generateFullMethodName(
+                  "routeguide.RouteGuide", "ListFeatures"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.routeguide.Rectangle.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.routeguide.Feature.getDefaultInstance()))
+                  .setSchemaDescriptor(new RouteGuideMethodDescriptorSupplier("ListFeatures"))
+                  .build();
+          }
+        }
+     }
+     return getListFeaturesMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<io.grpc.examples.routeguide.Point,
+      io.grpc.examples.routeguide.RouteSummary> getRecordRouteMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "RecordRoute",
+      requestType = io.grpc.examples.routeguide.Point.class,
+      responseType = io.grpc.examples.routeguide.RouteSummary.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.CLIENT_STREAMING)
+  public static io.grpc.MethodDescriptor<io.grpc.examples.routeguide.Point,
+      io.grpc.examples.routeguide.RouteSummary> getRecordRouteMethod() {
+    io.grpc.MethodDescriptor<io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.RouteSummary> getRecordRouteMethod;
+    if ((getRecordRouteMethod = RouteGuideGrpc.getRecordRouteMethod) == null) {
+      synchronized (RouteGuideGrpc.class) {
+        if ((getRecordRouteMethod = RouteGuideGrpc.getRecordRouteMethod) == null) {
+          RouteGuideGrpc.getRecordRouteMethod = getRecordRouteMethod = 
+              io.grpc.MethodDescriptor.<io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.RouteSummary>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.CLIENT_STREAMING)
+              .setFullMethodName(generateFullMethodName(
+                  "routeguide.RouteGuide", "RecordRoute"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.routeguide.Point.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.routeguide.RouteSummary.getDefaultInstance()))
+                  .setSchemaDescriptor(new RouteGuideMethodDescriptorSupplier("RecordRoute"))
+                  .build();
+          }
+        }
+     }
+     return getRecordRouteMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<io.grpc.examples.routeguide.RouteNote,
+      io.grpc.examples.routeguide.RouteNote> getRouteChatMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "RouteChat",
+      requestType = io.grpc.examples.routeguide.RouteNote.class,
+      responseType = io.grpc.examples.routeguide.RouteNote.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING)
+  public static io.grpc.MethodDescriptor<io.grpc.examples.routeguide.RouteNote,
+      io.grpc.examples.routeguide.RouteNote> getRouteChatMethod() {
+    io.grpc.MethodDescriptor<io.grpc.examples.routeguide.RouteNote, io.grpc.examples.routeguide.RouteNote> getRouteChatMethod;
+    if ((getRouteChatMethod = RouteGuideGrpc.getRouteChatMethod) == null) {
+      synchronized (RouteGuideGrpc.class) {
+        if ((getRouteChatMethod = RouteGuideGrpc.getRouteChatMethod) == null) {
+          RouteGuideGrpc.getRouteChatMethod = getRouteChatMethod = 
+              io.grpc.MethodDescriptor.<io.grpc.examples.routeguide.RouteNote, io.grpc.examples.routeguide.RouteNote>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING)
+              .setFullMethodName(generateFullMethodName(
+                  "routeguide.RouteGuide", "RouteChat"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.routeguide.RouteNote.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  io.grpc.examples.routeguide.RouteNote.getDefaultInstance()))
+                  .setSchemaDescriptor(new RouteGuideMethodDescriptorSupplier("RouteChat"))
+                  .build();
+          }
+        }
+     }
+     return getRouteChatMethod;
+  }
+
+  /**
+   * Creates a new async stub that supports all call types for the service
+   */
+  public static RouteGuideStub newStub(io.grpc.Channel channel) {
+    return new RouteGuideStub(channel);
+  }
+
+  /**
+   * Creates a new blocking-style stub that supports unary and streaming output calls on the service
+   */
+  public static RouteGuideBlockingStub newBlockingStub(
+      io.grpc.Channel channel) {
+    return new RouteGuideBlockingStub(channel);
+  }
+
+  /**
+   * Creates a new ListenableFuture-style stub that supports unary calls on the service
+   */
+  public static RouteGuideFutureStub newFutureStub(
+      io.grpc.Channel channel) {
+    return new RouteGuideFutureStub(channel);
+  }
+
+  /**
+   * <pre>
+   * Interface exported by the server.
+   * </pre>
+   */
+  public static final class RouteGuideStub extends io.grpc.stub.AbstractStub<RouteGuideStub> {
+    private RouteGuideStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private RouteGuideStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected RouteGuideStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new RouteGuideStub(channel, callOptions);
+    }
+
+    /**
+     * <pre>
+     * A simple RPC.
+     * Obtains the feature at a given position.
+     * A feature with an empty name is returned if there's no feature at the given
+     * position.
+     * </pre>
+     */
+    public void getFeature(io.grpc.examples.routeguide.Point request,
+        io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Feature> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getGetFeatureMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     * <pre>
+     * A server-to-client streaming RPC.
+     * Obtains the Features available within the given Rectangle.  Results are
+     * streamed rather than returned at once (e.g. in a response message with a
+     * repeated field), as the rectangle may cover a large area and contain a
+     * huge number of features.
+     * </pre>
+     */
+    public void listFeatures(io.grpc.examples.routeguide.Rectangle request,
+        io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Feature> responseObserver) {
+      asyncServerStreamingCall(
+          getChannel().newCall(getListFeaturesMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     * <pre>
+     * A client-to-server streaming RPC.
+     * Accepts a stream of Points on a route being traversed, returning a
+     * RouteSummary when traversal is completed.
+     * </pre>
+     */
+    public io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Point> recordRoute(
+        io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteSummary> responseObserver) {
+      return asyncClientStreamingCall(
+          getChannel().newCall(getRecordRouteMethod(), getCallOptions()), responseObserver);
+    }
+
+    /**
+     * <pre>
+     * A Bidirectional streaming RPC.
+     * Accepts a stream of RouteNotes sent while a route is being traversed,
+     * while receiving other RouteNotes (e.g. from other users).
+     * </pre>
+     */
+    public io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteNote> routeChat(
+        io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteNote> responseObserver) {
+      return asyncBidiStreamingCall(
+          getChannel().newCall(getRouteChatMethod(), getCallOptions()), responseObserver);
+    }
+  }
+
+  /**
+   * <pre>
+   * Interface exported by the server.
+   * </pre>
+   */
+  public static final class RouteGuideBlockingStub extends io.grpc.stub.AbstractStub<RouteGuideBlockingStub> {
+    private RouteGuideBlockingStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private RouteGuideBlockingStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected RouteGuideBlockingStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new RouteGuideBlockingStub(channel, callOptions);
+    }
+
+    /**
+     * <pre>
+     * A simple RPC.
+     * Obtains the feature at a given position.
+     * A feature with an empty name is returned if there's no feature at the given
+     * position.
+     * </pre>
+     */
+    public io.grpc.examples.routeguide.Feature getFeature(io.grpc.examples.routeguide.Point request) {
+      return blockingUnaryCall(
+          getChannel(), getGetFeatureMethod(), getCallOptions(), request);
+    }
+
+    /**
+     * <pre>
+     * A server-to-client streaming RPC.
+     * Obtains the Features available within the given Rectangle.  Results are
+     * streamed rather than returned at once (e.g. in a response message with a
+     * repeated field), as the rectangle may cover a large area and contain a
+     * huge number of features.
+     * </pre>
+     */
+    public java.util.Iterator<io.grpc.examples.routeguide.Feature> listFeatures(
+        io.grpc.examples.routeguide.Rectangle request) {
+      return blockingServerStreamingCall(
+          getChannel(), getListFeaturesMethod(), getCallOptions(), request);
+    }
+  }
+
+  /**
+   * <pre>
+   * Interface exported by the server.
+   * </pre>
+   */
+  public static final class RouteGuideFutureStub extends io.grpc.stub.AbstractStub<RouteGuideFutureStub> {
+    private RouteGuideFutureStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private RouteGuideFutureStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected RouteGuideFutureStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new RouteGuideFutureStub(channel, callOptions);
+    }
+
+    /**
+     * <pre>
+     * A simple RPC.
+     * Obtains the feature at a given position.
+     * A feature with an empty name is returned if there's no feature at the given
+     * position.
+     * </pre>
+     */
+    public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.routeguide.Feature> getFeature(
+        io.grpc.examples.routeguide.Point request) {
+      return futureUnaryCall(
+          getChannel().newCall(getGetFeatureMethod(), getCallOptions()), request);
+    }
+  }
+
+  public static abstract class RouteGuideImplBase implements io.grpc.BindableService, IRouteGuide {
+
+  @java.lang.Override
+  public final io.grpc.examples.routeguide.Feature getFeature(io.grpc.examples.routeguide.Point request) {
+     throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+  }
+
+  @java.lang.Override
+  public final com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.routeguide.Feature> getFeatureAsync(
+      io.grpc.examples.routeguide.Point request) {
+     throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+  }
+
+  public void getFeature(io.grpc.examples.routeguide.Point request,
+      io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Feature> responseObserver) {
+      asyncUnimplementedUnaryCall(getGetFeatureMethod(), responseObserver);
+  }
+
+@java.lang.Override
+public final java.util.Iterator<io.grpc.examples.routeguide.Feature> listFeatures(
+    io.grpc.examples.routeguide.Rectangle request) {
+   throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+}
+
+public void listFeatures(io.grpc.examples.routeguide.Rectangle request,
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Feature> responseObserver) {
+    asyncUnimplementedUnaryCall(getListFeaturesMethod(), responseObserver);
+
+}
+public io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Point> recordRoute(
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteSummary> responseObserver) {
+    return asyncUnimplementedStreamingCall(getRecordRouteMethod(), responseObserver);
+}
+
+public io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteNote> routeChat(
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteNote> responseObserver) {
+    return asyncUnimplementedStreamingCall(getRouteChatMethod(), responseObserver);
+}
+
+
+@java.lang.Override
+ public final io.grpc.ServerServiceDefinition bindService() {
+  return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+      .addMethod(
+        getGetFeatureMethod(),
+        asyncUnaryCall(
+          new MethodHandlers<
+            io.grpc.examples.routeguide.Point,
+            io.grpc.examples.routeguide.Feature>(
+              this, METHODID_GET_FEATURE)))
+      .addMethod(
+        getListFeaturesMethod(),
+        asyncServerStreamingCall(
+          new MethodHandlers<
+            io.grpc.examples.routeguide.Rectangle,
+            io.grpc.examples.routeguide.Feature>(
+              this, METHODID_LIST_FEATURES)))
+      .addMethod(
+        getRecordRouteMethod(),
+        asyncClientStreamingCall(
+          new MethodHandlers<
+            io.grpc.examples.routeguide.Point,
+            io.grpc.examples.routeguide.RouteSummary>(
+              this, METHODID_RECORD_ROUTE)))
+      .addMethod(
+        getRouteChatMethod(),
+        asyncBidiStreamingCall(
+          new MethodHandlers<
+            io.grpc.examples.routeguide.RouteNote,
+            io.grpc.examples.routeguide.RouteNote>(
+              this, METHODID_ROUTE_CHAT)))
+      .build();
+}
+}
+
+/**
+ * Code generated for Dubbo
+ */
+public interface IRouteGuide {
+
+default public io.grpc.examples.routeguide.Feature getFeature(io.grpc.examples.routeguide.Point request) {
+   throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+}
+
+default public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.routeguide.Feature> getFeatureAsync(
+    io.grpc.examples.routeguide.Point request) {
+   throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+}
+
+public void getFeature(io.grpc.examples.routeguide.Point request,
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Feature> responseObserver);
+
+default public java.util.Iterator<io.grpc.examples.routeguide.Feature> listFeatures(
+    io.grpc.examples.routeguide.Rectangle request) {
+   throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+}
+
+public void listFeatures(io.grpc.examples.routeguide.Rectangle request,
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Feature> responseObserver);
+
+public io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Point> recordRoute(
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteSummary> responseObserver);
+
+public io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteNote> routeChat(
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteNote> responseObserver);
+
+}
+
+public static class DubboRouteGuideStub implements IRouteGuide {
+
+private RouteGuideBlockingStub blockingStub;
+private RouteGuideFutureStub futureStub;
+private RouteGuideStub stub;
+
+public DubboRouteGuideStub(io.grpc.Channel channel) {
+   blockingStub = RouteGuideGrpc.newBlockingStub(channel);
+   futureStub = RouteGuideGrpc.newFutureStub(channel);
+   stub = RouteGuideGrpc.newStub(channel);
+}
+
+public io.grpc.examples.routeguide.Feature getFeature(io.grpc.examples.routeguide.Point request) {
+    return blockingStub.getFeature(request);
+}
+
+public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.routeguide.Feature> getFeatureAsync(
+    io.grpc.examples.routeguide.Point request) {
+    return futureStub.getFeature(request);
+}
+
+public void getFeature(io.grpc.examples.routeguide.Point request,
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Feature> responseObserver){
+    stub.getFeature(request, responseObserver);
+}
+
+public java.util.Iterator<io.grpc.examples.routeguide.Feature> listFeatures(
+    io.grpc.examples.routeguide.Rectangle request) {
+    return blockingStub.listFeatures(request);
+}
+
+public void listFeatures(io.grpc.examples.routeguide.Rectangle request,
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Feature> responseObserver) {
+    stub.listFeatures(request, responseObserver);
+}
+
+public io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Point> recordRoute(
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteSummary> responseObserver) {
+    return stub.recordRoute(responseObserver);
+}
+
+public io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteNote> routeChat(
+    io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteNote> responseObserver) {
+    return stub.routeChat(responseObserver);
+}
+
+}
+
+public static DubboRouteGuideStub getDubboStub(io.grpc.Channel channel) {
+
+  return new DubboRouteGuideStub(channel);}
+
+private static final int METHODID_GET_FEATURE = 0;
+private static final int METHODID_LIST_FEATURES = 1;
+private static final int METHODID_RECORD_ROUTE = 2;
+private static final int METHODID_ROUTE_CHAT = 3;
+
+private static final class MethodHandlers<Req, Resp> implements
+    io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+    io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+    io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+    io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+  private final RouteGuideImplBase serviceImpl;
+  private final int methodId;
+
+  MethodHandlers(RouteGuideImplBase serviceImpl, int methodId) {
+    this.serviceImpl = serviceImpl;
+    this.methodId = methodId;
+  }
+
+  @java.lang.Override
+  @java.lang.SuppressWarnings("unchecked")
+  public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+    switch (methodId) {
+      case METHODID_GET_FEATURE:
+        serviceImpl.getFeature((io.grpc.examples.routeguide.Point) request,
+            (io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Feature>) responseObserver);
+        break;
+      case METHODID_LIST_FEATURES:
+        serviceImpl.listFeatures((io.grpc.examples.routeguide.Rectangle) request,
+            (io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.Feature>) responseObserver);
+        break;
+      default:
+        throw new AssertionError();
+    }
+  }
+
+  @java.lang.Override
+  @java.lang.SuppressWarnings("unchecked")
+  public io.grpc.stub.StreamObserver<Req> invoke(
+      io.grpc.stub.StreamObserver<Resp> responseObserver) {
+    switch (methodId) {
+      case METHODID_RECORD_ROUTE:
+        return (io.grpc.stub.StreamObserver<Req>) serviceImpl.recordRoute(
+            (io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteSummary>) responseObserver);
+      case METHODID_ROUTE_CHAT:
+        return (io.grpc.stub.StreamObserver<Req>) serviceImpl.routeChat(
+            (io.grpc.stub.StreamObserver<io.grpc.examples.routeguide.RouteNote>) responseObserver);
+      default:
+        throw new AssertionError();
+    }
+  }
+}
+
+private static abstract class RouteGuideBaseDescriptorSupplier
+    implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
+  RouteGuideBaseDescriptorSupplier() {}
+
+  @java.lang.Override
+  public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
+    return io.grpc.examples.routeguide.RouteGuideProto.getDescriptor();
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
+    return getFileDescriptor().findServiceByName("RouteGuide");
+  }
+}
+
+private static final class RouteGuideFileDescriptorSupplier
+    extends RouteGuideBaseDescriptorSupplier {
+  RouteGuideFileDescriptorSupplier() {}
+}
+
+private static final class RouteGuideMethodDescriptorSupplier
+    extends RouteGuideBaseDescriptorSupplier
+    implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
+  private final String methodName;
+
+  RouteGuideMethodDescriptorSupplier(String methodName) {
+    this.methodName = methodName;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
+    return getServiceDescriptor().findMethodByName(methodName);
+  }
+}
+
+private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
+
+public static io.grpc.ServiceDescriptor getServiceDescriptor() {
+  io.grpc.ServiceDescriptor result = serviceDescriptor;
+  if (result == null) {
+    synchronized (RouteGuideGrpc.class) {
+      result = serviceDescriptor;
+      if (result == null) {
+        serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
+            .setSchemaDescriptor(new RouteGuideFileDescriptorSupplier())
+            .addMethod(getGetFeatureMethod())
+            .addMethod(getListFeaturesMethod())
+            .addMethod(getRecordRouteMethod())
+            .addMethod(getRouteChatMethod())
+            .build();
+      }
+    }
+  }
+  return result;
+}
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteGuideProto.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteGuideProto.java
new file mode 100644
index 0000000..7d345a7
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteGuideProto.java
@@ -0,0 +1,128 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+public final class RouteGuideProto {
+  private RouteGuideProto() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_routeguide_Point_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_routeguide_Point_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_routeguide_Rectangle_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_routeguide_Rectangle_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_routeguide_Feature_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_routeguide_Feature_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_routeguide_FeatureDatabase_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_routeguide_FeatureDatabase_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_routeguide_RouteNote_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_routeguide_RouteNote_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_routeguide_RouteSummary_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_routeguide_RouteSummary_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\021route_guide.proto\022\nrouteguide\",\n\005Point" +
+      "\022\020\n\010latitude\030\001 \001(\005\022\021\n\tlongitude\030\002 \001(\005\"I\n" +
+      "\tRectangle\022\035\n\002lo\030\001 \001(\0132\021.routeguide.Poin" +
+      "t\022\035\n\002hi\030\002 \001(\0132\021.routeguide.Point\"<\n\007Feat" +
+      "ure\022\014\n\004name\030\001 \001(\t\022#\n\010location\030\002 \001(\0132\021.ro" +
+      "uteguide.Point\"7\n\017FeatureDatabase\022$\n\007fea" +
+      "ture\030\001 \003(\0132\023.routeguide.Feature\"A\n\tRoute" +
+      "Note\022#\n\010location\030\001 \001(\0132\021.routeguide.Poin" +
+      "t\022\017\n\007message\030\002 \001(\t\"b\n\014RouteSummary\022\023\n\013po" +
+      "int_count\030\001 \001(\005\022\025\n\rfeature_count\030\002 \001(\005\022\020" +
+      "\n\010distance\030\003 \001(\005\022\024\n\014elapsed_time\030\004 \001(\0052\205" +
+      "\002\n\nRouteGuide\0226\n\nGetFeature\022\021.routeguide" +
+      ".Point\032\023.routeguide.Feature\"\000\022>\n\014ListFea" +
+      "tures\022\025.routeguide.Rectangle\032\023.routeguid" +
+      "e.Feature\"\0000\001\022>\n\013RecordRoute\022\021.routeguid" +
+      "e.Point\032\030.routeguide.RouteSummary\"\000(\001\022?\n" +
+      "\tRouteChat\022\025.routeguide.RouteNote\032\025.rout" +
+      "eguide.RouteNote\"\000(\0010\001B6\n\033io.grpc.exampl" +
+      "es.routeguideB\017RouteGuideProtoP\001\242\002\003RTGb\006" +
+      "proto3"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+        new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {
+          public com.google.protobuf.ExtensionRegistry assignDescriptors(
+              com.google.protobuf.Descriptors.FileDescriptor root) {
+            descriptor = root;
+            return null;
+          }
+        };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+    internal_static_routeguide_Point_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_routeguide_Point_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_routeguide_Point_descriptor,
+        new java.lang.String[] { "Latitude", "Longitude", });
+    internal_static_routeguide_Rectangle_descriptor =
+      getDescriptor().getMessageTypes().get(1);
+    internal_static_routeguide_Rectangle_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_routeguide_Rectangle_descriptor,
+        new java.lang.String[] { "Lo", "Hi", });
+    internal_static_routeguide_Feature_descriptor =
+      getDescriptor().getMessageTypes().get(2);
+    internal_static_routeguide_Feature_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_routeguide_Feature_descriptor,
+        new java.lang.String[] { "Name", "Location", });
+    internal_static_routeguide_FeatureDatabase_descriptor =
+      getDescriptor().getMessageTypes().get(3);
+    internal_static_routeguide_FeatureDatabase_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_routeguide_FeatureDatabase_descriptor,
+        new java.lang.String[] { "Feature", });
+    internal_static_routeguide_RouteNote_descriptor =
+      getDescriptor().getMessageTypes().get(4);
+    internal_static_routeguide_RouteNote_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_routeguide_RouteNote_descriptor,
+        new java.lang.String[] { "Location", "Message", });
+    internal_static_routeguide_RouteSummary_descriptor =
+      getDescriptor().getMessageTypes().get(5);
+    internal_static_routeguide_RouteSummary_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_routeguide_RouteSummary_descriptor,
+        new java.lang.String[] { "PointCount", "FeatureCount", "Distance", "ElapsedTime", });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteNote.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteNote.java
new file mode 100644
index 0000000..e7c5e02
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteNote.java
@@ -0,0 +1,805 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+/**
+ * <pre>
+ * A RouteNote is a message sent while at a given point.
+ * </pre>
+ *
+ * Protobuf type {@code routeguide.RouteNote}
+ */
+public  final class RouteNote extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:routeguide.RouteNote)
+    RouteNoteOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use RouteNote.newBuilder() to construct.
+  private RouteNote(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private RouteNote() {
+    message_ = "";
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private RouteNote(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            io.grpc.examples.routeguide.Point.Builder subBuilder = null;
+            if (location_ != null) {
+              subBuilder = location_.toBuilder();
+            }
+            location_ = input.readMessage(io.grpc.examples.routeguide.Point.parser(), extensionRegistry);
+            if (subBuilder != null) {
+              subBuilder.mergeFrom(location_);
+              location_ = subBuilder.buildPartial();
+            }
+
+            break;
+          }
+          case 18: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            message_ = s;
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_RouteNote_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_RouteNote_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            io.grpc.examples.routeguide.RouteNote.class, io.grpc.examples.routeguide.RouteNote.Builder.class);
+  }
+
+  public static final int LOCATION_FIELD_NUMBER = 1;
+  private io.grpc.examples.routeguide.Point location_;
+  /**
+   * <pre>
+   * The location from which the message is sent.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 1;</code>
+   */
+  public boolean hasLocation() {
+    return location_ != null;
+  }
+  /**
+   * <pre>
+   * The location from which the message is sent.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 1;</code>
+   */
+  public io.grpc.examples.routeguide.Point getLocation() {
+    return location_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : location_;
+  }
+  /**
+   * <pre>
+   * The location from which the message is sent.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 1;</code>
+   */
+  public io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder() {
+    return getLocation();
+  }
+
+  public static final int MESSAGE_FIELD_NUMBER = 2;
+  private volatile java.lang.Object message_;
+  /**
+   * <pre>
+   * The message to be sent.
+   * </pre>
+   *
+   * <code>string message = 2;</code>
+   */
+  public java.lang.String getMessage() {
+    java.lang.Object ref = message_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      message_ = s;
+      return s;
+    }
+  }
+  /**
+   * <pre>
+   * The message to be sent.
+   * </pre>
+   *
+   * <code>string message = 2;</code>
+   */
+  public com.google.protobuf.ByteString
+      getMessageBytes() {
+    java.lang.Object ref = message_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      message_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (location_ != null) {
+      output.writeMessage(1, getLocation());
+    }
+    if (!getMessageBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, message_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (location_ != null) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(1, getLocation());
+    }
+    if (!getMessageBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, message_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof io.grpc.examples.routeguide.RouteNote)) {
+      return super.equals(obj);
+    }
+    io.grpc.examples.routeguide.RouteNote other = (io.grpc.examples.routeguide.RouteNote) obj;
+
+    if (hasLocation() != other.hasLocation()) return false;
+    if (hasLocation()) {
+      if (!getLocation()
+          .equals(other.getLocation())) return false;
+    }
+    if (!getMessage()
+        .equals(other.getMessage())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasLocation()) {
+      hash = (37 * hash) + LOCATION_FIELD_NUMBER;
+      hash = (53 * hash) + getLocation().hashCode();
+    }
+    hash = (37 * hash) + MESSAGE_FIELD_NUMBER;
+    hash = (53 * hash) + getMessage().hashCode();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static io.grpc.examples.routeguide.RouteNote parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.RouteNote parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(io.grpc.examples.routeguide.RouteNote prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * A RouteNote is a message sent while at a given point.
+   * </pre>
+   *
+   * Protobuf type {@code routeguide.RouteNote}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:routeguide.RouteNote)
+      io.grpc.examples.routeguide.RouteNoteOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_RouteNote_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_RouteNote_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              io.grpc.examples.routeguide.RouteNote.class, io.grpc.examples.routeguide.RouteNote.Builder.class);
+    }
+
+    // Construct using io.grpc.examples.routeguide.RouteNote.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      if (locationBuilder_ == null) {
+        location_ = null;
+      } else {
+        location_ = null;
+        locationBuilder_ = null;
+      }
+      message_ = "";
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_RouteNote_descriptor;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.RouteNote getDefaultInstanceForType() {
+      return io.grpc.examples.routeguide.RouteNote.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.RouteNote build() {
+      io.grpc.examples.routeguide.RouteNote result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.RouteNote buildPartial() {
+      io.grpc.examples.routeguide.RouteNote result = new io.grpc.examples.routeguide.RouteNote(this);
+      if (locationBuilder_ == null) {
+        result.location_ = location_;
+      } else {
+        result.location_ = locationBuilder_.build();
+      }
+      result.message_ = message_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof io.grpc.examples.routeguide.RouteNote) {
+        return mergeFrom((io.grpc.examples.routeguide.RouteNote)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(io.grpc.examples.routeguide.RouteNote other) {
+      if (other == io.grpc.examples.routeguide.RouteNote.getDefaultInstance()) return this;
+      if (other.hasLocation()) {
+        mergeLocation(other.getLocation());
+      }
+      if (!other.getMessage().isEmpty()) {
+        message_ = other.message_;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      io.grpc.examples.routeguide.RouteNote parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (io.grpc.examples.routeguide.RouteNote) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private io.grpc.examples.routeguide.Point location_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> locationBuilder_;
+    /**
+     * <pre>
+     * The location from which the message is sent.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 1;</code>
+     */
+    public boolean hasLocation() {
+      return locationBuilder_ != null || location_ != null;
+    }
+    /**
+     * <pre>
+     * The location from which the message is sent.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 1;</code>
+     */
+    public io.grpc.examples.routeguide.Point getLocation() {
+      if (locationBuilder_ == null) {
+        return location_ == null ? io.grpc.examples.routeguide.Point.getDefaultInstance() : location_;
+      } else {
+        return locationBuilder_.getMessage();
+      }
+    }
+    /**
+     * <pre>
+     * The location from which the message is sent.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 1;</code>
+     */
+    public Builder setLocation(io.grpc.examples.routeguide.Point value) {
+      if (locationBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        location_ = value;
+        onChanged();
+      } else {
+        locationBuilder_.setMessage(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The location from which the message is sent.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 1;</code>
+     */
+    public Builder setLocation(
+        io.grpc.examples.routeguide.Point.Builder builderForValue) {
+      if (locationBuilder_ == null) {
+        location_ = builderForValue.build();
+        onChanged();
+      } else {
+        locationBuilder_.setMessage(builderForValue.build());
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The location from which the message is sent.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 1;</code>
+     */
+    public Builder mergeLocation(io.grpc.examples.routeguide.Point value) {
+      if (locationBuilder_ == null) {
+        if (location_ != null) {
+          location_ =
+            io.grpc.examples.routeguide.Point.newBuilder(location_).mergeFrom(value).buildPartial();
+        } else {
+          location_ = value;
+        }
+        onChanged();
+      } else {
+        locationBuilder_.mergeFrom(value);
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The location from which the message is sent.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 1;</code>
+     */
+    public Builder clearLocation() {
+      if (locationBuilder_ == null) {
+        location_ = null;
+        onChanged();
+      } else {
+        location_ = null;
+        locationBuilder_ = null;
+      }
+
+      return this;
+    }
+    /**
+     * <pre>
+     * The location from which the message is sent.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 1;</code>
+     */
+    public io.grpc.examples.routeguide.Point.Builder getLocationBuilder() {
+      
+      onChanged();
+      return getLocationFieldBuilder().getBuilder();
+    }
+    /**
+     * <pre>
+     * The location from which the message is sent.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 1;</code>
+     */
+    public io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder() {
+      if (locationBuilder_ != null) {
+        return locationBuilder_.getMessageOrBuilder();
+      } else {
+        return location_ == null ?
+            io.grpc.examples.routeguide.Point.getDefaultInstance() : location_;
+      }
+    }
+    /**
+     * <pre>
+     * The location from which the message is sent.
+     * </pre>
+     *
+     * <code>.routeguide.Point location = 1;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder> 
+        getLocationFieldBuilder() {
+      if (locationBuilder_ == null) {
+        locationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            io.grpc.examples.routeguide.Point, io.grpc.examples.routeguide.Point.Builder, io.grpc.examples.routeguide.PointOrBuilder>(
+                getLocation(),
+                getParentForChildren(),
+                isClean());
+        location_ = null;
+      }
+      return locationBuilder_;
+    }
+
+    private java.lang.Object message_ = "";
+    /**
+     * <pre>
+     * The message to be sent.
+     * </pre>
+     *
+     * <code>string message = 2;</code>
+     */
+    public java.lang.String getMessage() {
+      java.lang.Object ref = message_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        message_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The message to be sent.
+     * </pre>
+     *
+     * <code>string message = 2;</code>
+     */
+    public com.google.protobuf.ByteString
+        getMessageBytes() {
+      java.lang.Object ref = message_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        message_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <pre>
+     * The message to be sent.
+     * </pre>
+     *
+     * <code>string message = 2;</code>
+     */
+    public Builder setMessage(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      message_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The message to be sent.
+     * </pre>
+     *
+     * <code>string message = 2;</code>
+     */
+    public Builder clearMessage() {
+      
+      message_ = getDefaultInstance().getMessage();
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The message to be sent.
+     * </pre>
+     *
+     * <code>string message = 2;</code>
+     */
+    public Builder setMessageBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      message_ = value;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:routeguide.RouteNote)
+  }
+
+  // @@protoc_insertion_point(class_scope:routeguide.RouteNote)
+  private static final io.grpc.examples.routeguide.RouteNote DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new io.grpc.examples.routeguide.RouteNote();
+  }
+
+  public static io.grpc.examples.routeguide.RouteNote getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<RouteNote>
+      PARSER = new com.google.protobuf.AbstractParser<RouteNote>() {
+    @java.lang.Override
+    public RouteNote parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new RouteNote(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<RouteNote> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<RouteNote> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public io.grpc.examples.routeguide.RouteNote getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteNoteOrBuilder.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteNoteOrBuilder.java
new file mode 100644
index 0000000..803e02f
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteNoteOrBuilder.java
@@ -0,0 +1,52 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+public interface RouteNoteOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:routeguide.RouteNote)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * The location from which the message is sent.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 1;</code>
+   */
+  boolean hasLocation();
+  /**
+   * <pre>
+   * The location from which the message is sent.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 1;</code>
+   */
+  io.grpc.examples.routeguide.Point getLocation();
+  /**
+   * <pre>
+   * The location from which the message is sent.
+   * </pre>
+   *
+   * <code>.routeguide.Point location = 1;</code>
+   */
+  io.grpc.examples.routeguide.PointOrBuilder getLocationOrBuilder();
+
+  /**
+   * <pre>
+   * The message to be sent.
+   * </pre>
+   *
+   * <code>string message = 2;</code>
+   */
+  java.lang.String getMessage();
+  /**
+   * <pre>
+   * The message to be sent.
+   * </pre>
+   *
+   * <code>string message = 2;</code>
+   */
+  com.google.protobuf.ByteString
+      getMessageBytes();
+}
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteSummary.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteSummary.java
new file mode 100644
index 0000000..ae8446f
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteSummary.java
@@ -0,0 +1,719 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+/**
+ * <pre>
+ * A RouteSummary is received in response to a RecordRoute rpc.
+ * It contains the number of individual points received, the number of
+ * detected features, and the total distance covered as the cumulative sum of
+ * the distance between each point.
+ * </pre>
+ *
+ * Protobuf type {@code routeguide.RouteSummary}
+ */
+public  final class RouteSummary extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:routeguide.RouteSummary)
+    RouteSummaryOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use RouteSummary.newBuilder() to construct.
+  private RouteSummary(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private RouteSummary() {
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private RouteSummary(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 8: {
+
+            pointCount_ = input.readInt32();
+            break;
+          }
+          case 16: {
+
+            featureCount_ = input.readInt32();
+            break;
+          }
+          case 24: {
+
+            distance_ = input.readInt32();
+            break;
+          }
+          case 32: {
+
+            elapsedTime_ = input.readInt32();
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_RouteSummary_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_RouteSummary_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            io.grpc.examples.routeguide.RouteSummary.class, io.grpc.examples.routeguide.RouteSummary.Builder.class);
+  }
+
+  public static final int POINT_COUNT_FIELD_NUMBER = 1;
+  private int pointCount_;
+  /**
+   * <pre>
+   * The number of points received.
+   * </pre>
+   *
+   * <code>int32 point_count = 1;</code>
+   */
+  public int getPointCount() {
+    return pointCount_;
+  }
+
+  public static final int FEATURE_COUNT_FIELD_NUMBER = 2;
+  private int featureCount_;
+  /**
+   * <pre>
+   * The number of known features passed while traversing the route.
+   * </pre>
+   *
+   * <code>int32 feature_count = 2;</code>
+   */
+  public int getFeatureCount() {
+    return featureCount_;
+  }
+
+  public static final int DISTANCE_FIELD_NUMBER = 3;
+  private int distance_;
+  /**
+   * <pre>
+   * The distance covered in metres.
+   * </pre>
+   *
+   * <code>int32 distance = 3;</code>
+   */
+  public int getDistance() {
+    return distance_;
+  }
+
+  public static final int ELAPSED_TIME_FIELD_NUMBER = 4;
+  private int elapsedTime_;
+  /**
+   * <pre>
+   * The duration of the traversal in seconds.
+   * </pre>
+   *
+   * <code>int32 elapsed_time = 4;</code>
+   */
+  public int getElapsedTime() {
+    return elapsedTime_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (pointCount_ != 0) {
+      output.writeInt32(1, pointCount_);
+    }
+    if (featureCount_ != 0) {
+      output.writeInt32(2, featureCount_);
+    }
+    if (distance_ != 0) {
+      output.writeInt32(3, distance_);
+    }
+    if (elapsedTime_ != 0) {
+      output.writeInt32(4, elapsedTime_);
+    }
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (pointCount_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(1, pointCount_);
+    }
+    if (featureCount_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(2, featureCount_);
+    }
+    if (distance_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(3, distance_);
+    }
+    if (elapsedTime_ != 0) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeInt32Size(4, elapsedTime_);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof io.grpc.examples.routeguide.RouteSummary)) {
+      return super.equals(obj);
+    }
+    io.grpc.examples.routeguide.RouteSummary other = (io.grpc.examples.routeguide.RouteSummary) obj;
+
+    if (getPointCount()
+        != other.getPointCount()) return false;
+    if (getFeatureCount()
+        != other.getFeatureCount()) return false;
+    if (getDistance()
+        != other.getDistance()) return false;
+    if (getElapsedTime()
+        != other.getElapsedTime()) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + POINT_COUNT_FIELD_NUMBER;
+    hash = (53 * hash) + getPointCount();
+    hash = (37 * hash) + FEATURE_COUNT_FIELD_NUMBER;
+    hash = (53 * hash) + getFeatureCount();
+    hash = (37 * hash) + DISTANCE_FIELD_NUMBER;
+    hash = (53 * hash) + getDistance();
+    hash = (37 * hash) + ELAPSED_TIME_FIELD_NUMBER;
+    hash = (53 * hash) + getElapsedTime();
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static io.grpc.examples.routeguide.RouteSummary parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static io.grpc.examples.routeguide.RouteSummary parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(io.grpc.examples.routeguide.RouteSummary prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * <pre>
+   * A RouteSummary is received in response to a RecordRoute rpc.
+   * It contains the number of individual points received, the number of
+   * detected features, and the total distance covered as the cumulative sum of
+   * the distance between each point.
+   * </pre>
+   *
+   * Protobuf type {@code routeguide.RouteSummary}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:routeguide.RouteSummary)
+      io.grpc.examples.routeguide.RouteSummaryOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_RouteSummary_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_RouteSummary_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              io.grpc.examples.routeguide.RouteSummary.class, io.grpc.examples.routeguide.RouteSummary.Builder.class);
+    }
+
+    // Construct using io.grpc.examples.routeguide.RouteSummary.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      pointCount_ = 0;
+
+      featureCount_ = 0;
+
+      distance_ = 0;
+
+      elapsedTime_ = 0;
+
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return io.grpc.examples.routeguide.RouteGuideProto.internal_static_routeguide_RouteSummary_descriptor;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.RouteSummary getDefaultInstanceForType() {
+      return io.grpc.examples.routeguide.RouteSummary.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.RouteSummary build() {
+      io.grpc.examples.routeguide.RouteSummary result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public io.grpc.examples.routeguide.RouteSummary buildPartial() {
+      io.grpc.examples.routeguide.RouteSummary result = new io.grpc.examples.routeguide.RouteSummary(this);
+      result.pointCount_ = pointCount_;
+      result.featureCount_ = featureCount_;
+      result.distance_ = distance_;
+      result.elapsedTime_ = elapsedTime_;
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof io.grpc.examples.routeguide.RouteSummary) {
+        return mergeFrom((io.grpc.examples.routeguide.RouteSummary)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(io.grpc.examples.routeguide.RouteSummary other) {
+      if (other == io.grpc.examples.routeguide.RouteSummary.getDefaultInstance()) return this;
+      if (other.getPointCount() != 0) {
+        setPointCount(other.getPointCount());
+      }
+      if (other.getFeatureCount() != 0) {
+        setFeatureCount(other.getFeatureCount());
+      }
+      if (other.getDistance() != 0) {
+        setDistance(other.getDistance());
+      }
+      if (other.getElapsedTime() != 0) {
+        setElapsedTime(other.getElapsedTime());
+      }
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      io.grpc.examples.routeguide.RouteSummary parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (io.grpc.examples.routeguide.RouteSummary) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+
+    private int pointCount_ ;
+    /**
+     * <pre>
+     * The number of points received.
+     * </pre>
+     *
+     * <code>int32 point_count = 1;</code>
+     */
+    public int getPointCount() {
+      return pointCount_;
+    }
+    /**
+     * <pre>
+     * The number of points received.
+     * </pre>
+     *
+     * <code>int32 point_count = 1;</code>
+     */
+    public Builder setPointCount(int value) {
+      
+      pointCount_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The number of points received.
+     * </pre>
+     *
+     * <code>int32 point_count = 1;</code>
+     */
+    public Builder clearPointCount() {
+      
+      pointCount_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private int featureCount_ ;
+    /**
+     * <pre>
+     * The number of known features passed while traversing the route.
+     * </pre>
+     *
+     * <code>int32 feature_count = 2;</code>
+     */
+    public int getFeatureCount() {
+      return featureCount_;
+    }
+    /**
+     * <pre>
+     * The number of known features passed while traversing the route.
+     * </pre>
+     *
+     * <code>int32 feature_count = 2;</code>
+     */
+    public Builder setFeatureCount(int value) {
+      
+      featureCount_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The number of known features passed while traversing the route.
+     * </pre>
+     *
+     * <code>int32 feature_count = 2;</code>
+     */
+    public Builder clearFeatureCount() {
+      
+      featureCount_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private int distance_ ;
+    /**
+     * <pre>
+     * The distance covered in metres.
+     * </pre>
+     *
+     * <code>int32 distance = 3;</code>
+     */
+    public int getDistance() {
+      return distance_;
+    }
+    /**
+     * <pre>
+     * The distance covered in metres.
+     * </pre>
+     *
+     * <code>int32 distance = 3;</code>
+     */
+    public Builder setDistance(int value) {
+      
+      distance_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The distance covered in metres.
+     * </pre>
+     *
+     * <code>int32 distance = 3;</code>
+     */
+    public Builder clearDistance() {
+      
+      distance_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private int elapsedTime_ ;
+    /**
+     * <pre>
+     * The duration of the traversal in seconds.
+     * </pre>
+     *
+     * <code>int32 elapsed_time = 4;</code>
+     */
+    public int getElapsedTime() {
+      return elapsedTime_;
+    }
+    /**
+     * <pre>
+     * The duration of the traversal in seconds.
+     * </pre>
+     *
+     * <code>int32 elapsed_time = 4;</code>
+     */
+    public Builder setElapsedTime(int value) {
+      
+      elapsedTime_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <pre>
+     * The duration of the traversal in seconds.
+     * </pre>
+     *
+     * <code>int32 elapsed_time = 4;</code>
+     */
+    public Builder clearElapsedTime() {
+      
+      elapsedTime_ = 0;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:routeguide.RouteSummary)
+  }
+
+  // @@protoc_insertion_point(class_scope:routeguide.RouteSummary)
+  private static final io.grpc.examples.routeguide.RouteSummary DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new io.grpc.examples.routeguide.RouteSummary();
+  }
+
+  public static io.grpc.examples.routeguide.RouteSummary getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<RouteSummary>
+      PARSER = new com.google.protobuf.AbstractParser<RouteSummary>() {
+    @java.lang.Override
+    public RouteSummary parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new RouteSummary(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<RouteSummary> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<RouteSummary> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public io.grpc.examples.routeguide.RouteSummary getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+
diff --git a/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteSummaryOrBuilder.java b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteSummaryOrBuilder.java
new file mode 100644
index 0000000..bdea28a
--- /dev/null
+++ b/dubbo-samples-grpc/build/generated/source/proto/main/java/io/grpc/examples/routeguide/RouteSummaryOrBuilder.java
@@ -0,0 +1,45 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: route_guide.proto
+
+package io.grpc.examples.routeguide;
+
+public interface RouteSummaryOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:routeguide.RouteSummary)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <pre>
+   * The number of points received.
+   * </pre>
+   *
+   * <code>int32 point_count = 1;</code>
+   */
+  int getPointCount();
+
+  /**
+   * <pre>
+   * The number of known features passed while traversing the route.
+   * </pre>
+   *
+   * <code>int32 feature_count = 2;</code>
+   */
+  int getFeatureCount();
+
+  /**
+   * <pre>
+   * The distance covered in metres.
+   * </pre>
+   *
+   * <code>int32 distance = 3;</code>
+   */
+  int getDistance();
+
+  /**
+   * <pre>
+   * The duration of the traversal in seconds.
+   * </pre>
+   *
+   * <code>int32 elapsed_time = 4;</code>
+   */
+  int getElapsedTime();
+}
diff --git a/dubbo-samples-grpc/pom.xml b/dubbo-samples-grpc/pom.xml
new file mode 100644
index 0000000..7a4a6e5
--- /dev/null
+++ b/dubbo-samples-grpc/pom.xml
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <groupId>org.apache.dubbo</groupId>
+    <version>1.0-SNAPSHOT</version>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>dubbo-samples-grpc</artifactId>
+
+    <properties>
+        <source.level>1.8</source.level>
+        <target.level>1.8</target.level>
+        <dubbo.version>2.7.4-grpc-SNAPSHOT</dubbo.version>
+        <junit.version>4.12</junit.version>
+        <spring-test.version>4.3.16.RELEASE</spring-test.version>
+        <docker-maven-plugin.version>0.30.0</docker-maven-plugin.version>
+        <jib-maven-plugin.version>1.2.0</jib-maven-plugin.version>
+        <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
+        <maven-failsafe-plugin.version>2.21.0</maven-failsafe-plugin.version>
+        <image.name>${artifactId}:${dubbo.version}</image.name>
+        <java-image.name>openjdk:8</java-image.name>
+        <dubbo.port>20880</dubbo.port>
+        <zookeeper.port>2181</zookeeper.port>
+        <main-class>org.apache.dubbo.samples.basic.BasicProvider</main-class>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo</artifactId>
+            <version>${dubbo.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-grpc</artifactId>
+            <version>${dubbo.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-dependencies-zookeeper</artifactId>
+            <version>${dubbo.version}</version>
+            <type>pom</type>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>${spring-test.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <id>dubbo-integration-test</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.dubbo</groupId>
+                        <artifactId>dubbo-maven-address-plugin</artifactId>
+                        <version>1.0-SNAPSHOT</version>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>local-address</goal>
+                                </goals>
+                                <configuration>
+                                    <localAddress>dubbo-local-address</localAddress>
+                                </configuration>
+                                <phase>initialize</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+
+                    <plugin>
+                        <groupId>com.google.cloud.tools</groupId>
+                        <artifactId>jib-maven-plugin</artifactId>
+                        <version>${jib-maven-plugin.version}</version>
+                        <configuration>
+                            <from>
+                                <image>${java-image.name}</image>
+                            </from>
+                            <to>
+                                <image>${image.name}</image>
+                            </to>
+                            <container>
+                                <mainClass>${main-class}</mainClass>
+                                <environment>
+                                    <DUBBO_IP_TO_REGISTRY>${dubbo-local-address}</DUBBO_IP_TO_REGISTRY>
+                                </environment>
+                            </container>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>dockerBuild</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+
+                    <plugin>
+                        <groupId>io.fabric8</groupId>
+                        <artifactId>docker-maven-plugin</artifactId>
+                        <version>${docker-maven-plugin.version}</version>
+                        <configuration>
+                            <images>
+                                <image>
+                                    <name>${image.name}</name>
+                                    <run>
+                                        <ports>
+                                            <port>${dubbo.port}:${dubbo.port}</port>
+                                            <port>${zookeeper.port}:${zookeeper.port}</port>
+                                        </ports>
+                                        <wait>
+                                            <log>dubbo service started</log>
+                                        </wait>
+                                    </run>
+                                </image>
+                            </images>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <id>start</id>
+                                <phase>pre-integration-test</phase>
+                                <goals>
+                                    <goal>start</goal>
+                                </goals>
+                            </execution>
+                            <execution>
+                                <id>stop</id>
+                                <phase>post-integration-test</phase>
+                                <goals>
+                                    <goal>stop</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <version>${maven-failsafe-plugin.version}</version>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                                <configuration>
+                                    <systemPropertyVariables>
+                                        <zookeeper.address>${dubbo-local-address}</zookeeper.address>
+                                    </systemPropertyVariables>
+                                    <includes>
+                                        <include>**/*IT.java</include>
+                                    </includes>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+    <build>
+        <extensions>
+            <extension>
+                <groupId>kr.motd.maven</groupId>
+                <artifactId>os-maven-plugin</artifactId>
+                <version>1.6.1</version>
+            </extension>
+        </extensions>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin.version}</version>
+                <configuration>
+                    <source>${source.level}</source>
+                    <target>${target.level}</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.xolstice.maven.plugins</groupId>
+                <artifactId>protobuf-maven-plugin</artifactId>
+                <version>0.5.1</version>
+                <configuration>
+                    <protocArtifact>com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier}</protocArtifact>
+                    <pluginId>grpc-java</pluginId>
+                    <pluginArtifact>com.alibaba:protoc-gen-grpc-java:1.19.0-SNAPSHOT:exe:${os.detected.classifier}</pluginArtifact>
+                    <outputDirectory>build/generated/source/proto/main/java</outputDirectory>
+                    <clearOutputDirectory>false</clearOutputDirectory>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>compile</goal>
+                            <goal>compile-custom</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>build/generated/source/proto/main/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/BasicConsumer.java b/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/BasicConsumer.java
new file mode 100644
index 0000000..673c9e1
--- /dev/null
+++ b/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/BasicConsumer.java
@@ -0,0 +1,40 @@
+/*
+ *
+ *   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.dubbo.samples.basic;
+
+import io.grpc.examples.helloworld.GreeterGrpc;
+import io.grpc.examples.helloworld.HelloReply;
+import io.grpc.examples.helloworld.HelloRequest;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import java.io.IOException;
+
+public class BasicConsumer {
+
+    public static void main(String[] args) throws IOException {
+        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-demo-consumer.xml");
+        context.start();
+
+        GreeterGrpc.IGreeter greeter = (GreeterGrpc.IGreeter) context.getBean("greeter");
+        HelloReply reply = greeter.sayHello(HelloRequest.newBuilder().setName("world!").build());
+        System.out.println(reply.getMessage());
+        System.in.read();
+    }
+}
diff --git a/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/BasicProvider.java b/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/BasicProvider.java
new file mode 100644
index 0000000..f51aa2e
--- /dev/null
+++ b/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/BasicProvider.java
@@ -0,0 +1,39 @@
+/*
+ *
+ *   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.dubbo.samples.basic;
+
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import java.util.concurrent.CountDownLatch;
+
+public class BasicProvider {
+
+    public static void main(String[] args) throws Exception {
+        new EmbeddedZooKeeper(2181, false).start();
+        // wait for embedded zookeeper start completely.
+        Thread.sleep(1000);
+
+        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-demo-provider.xml");
+        context.start();
+
+        System.out.println("dubbo service started");
+        new CountDownLatch(1).await();
+    }
+}
diff --git a/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/EmbeddedZooKeeper.java b/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/EmbeddedZooKeeper.java
new file mode 100644
index 0000000..13504d5
--- /dev/null
+++ b/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/EmbeddedZooKeeper.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2014 the original author or authors.
+ *
+ * Licensed 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.dubbo.samples.basic;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.Properties;
+import java.util.UUID;
+
+import org.apache.zookeeper.server.ServerConfig;
+import org.apache.zookeeper.server.ZooKeeperServerMain;
+import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.context.SmartLifecycle;
+import org.springframework.util.ErrorHandler;
+import org.springframework.util.SocketUtils;
+
+/**
+ * from: https://github.com/spring-projects/spring-xd/blob/v1.3.1.RELEASE/spring-xd-dirt/src/main/java/org/springframework/xd/dirt/zookeeper/ZooKeeperUtils.java
+ *
+ * Helper class to start an embedded instance of standalone (non clustered) ZooKeeper.
+ *
+ * NOTE: at least an external standalone server (if not an ensemble) are recommended, even for
+ * {@link org.springframework.xd.dirt.server.singlenode.SingleNodeApplication}
+ *
+ * @author Patrick Peralta
+ * @author Mark Fisher
+ * @author David Turanski
+ */
+public class EmbeddedZooKeeper implements SmartLifecycle {
+
+    /**
+     * Logger.
+     */
+    private static final Logger logger = LoggerFactory.getLogger(EmbeddedZooKeeper.class);
+
+    /**
+     * ZooKeeper client port. This will be determined dynamically upon startup.
+     */
+    private final int clientPort;
+
+    /**
+     * Whether to auto-start. Default is true.
+     */
+    private boolean autoStartup = true;
+
+    /**
+     * Lifecycle phase. Default is 0.
+     */
+    private int phase = 0;
+
+    /**
+     * Thread for running the ZooKeeper server.
+     */
+    private volatile Thread zkServerThread;
+
+    /**
+     * ZooKeeper server.
+     */
+    private volatile ZooKeeperServerMain zkServer;
+
+    /**
+     * {@link ErrorHandler} to be invoked if an Exception is thrown from the ZooKeeper server thread.
+     */
+    private ErrorHandler errorHandler;
+
+    private boolean daemon = true;
+
+    /**
+     * Construct an EmbeddedZooKeeper with a random port.
+     */
+    public EmbeddedZooKeeper() {
+        clientPort = SocketUtils.findAvailableTcpPort();
+    }
+
+    /**
+     * Construct an EmbeddedZooKeeper with the provided port.
+     *
+     * @param clientPort  port for ZooKeeper server to bind to
+     */
+    public EmbeddedZooKeeper(int clientPort, boolean daemon) {
+        this.clientPort = clientPort;
+        this.daemon = daemon;
+    }
+
+    /**
+     * Returns the port that clients should use to connect to this embedded server.
+     *
+     * @return dynamically determined client port
+     */
+    public int getClientPort() {
+        return this.clientPort;
+    }
+
+    /**
+     * Specify whether to start automatically. Default is true.
+     *
+     * @param autoStartup whether to start automatically
+     */
+    public void setAutoStartup(boolean autoStartup) {
+        this.autoStartup = autoStartup;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isAutoStartup() {
+        return this.autoStartup;
+    }
+
+    /**
+     * Specify the lifecycle phase for the embedded server.
+     *
+     * @param phase the lifecycle phase
+     */
+    public void setPhase(int phase) {
+        this.phase = phase;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public int getPhase() {
+        return this.phase;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean isRunning() {
+        return (zkServerThread != null);
+    }
+
+    /**
+     * Start the ZooKeeper server in a background thread.
+     * <p>
+     * Register an error handler via {@link #setErrorHandler} in order to handle
+     * any exceptions thrown during startup or execution.
+     */
+    @Override
+    public synchronized void start() {
+        if (zkServerThread == null) {
+            zkServerThread = new Thread(new ServerRunnable(), "ZooKeeper Server Starter");
+            zkServerThread.setDaemon(daemon);
+            zkServerThread.start();
+        }
+    }
+
+    /**
+     * Shutdown the ZooKeeper server.
+     */
+    @Override
+    public synchronized void stop() {
+        if (zkServerThread != null) {
+            // The shutdown method is protected...thus this hack to invoke it.
+            // This will log an exception on shutdown; see
+            // https://issues.apache.org/jira/browse/ZOOKEEPER-1873 for details.
+            try {
+                Method shutdown = ZooKeeperServerMain.class.getDeclaredMethod("shutdown");
+                shutdown.setAccessible(true);
+                shutdown.invoke(zkServer);
+            }
+
+            catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+
+            // It is expected that the thread will exit after
+            // the server is shutdown; this will block until
+            // the shutdown is complete.
+            try {
+                zkServerThread.join(5000);
+                zkServerThread = null;
+            }
+            catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                logger.warn("Interrupted while waiting for embedded ZooKeeper to exit");
+                // abandoning zk thread
+                zkServerThread = null;
+            }
+        }
+    }
+
+    /**
+     * Stop the server if running and invoke the callback when complete.
+     */
+    @Override
+    public void stop(Runnable callback) {
+        stop();
+        callback.run();
+    }
+
+    /**
+     * Provide an {@link ErrorHandler} to be invoked if an Exception is thrown from the ZooKeeper server thread. If none
+     * is provided, only error-level logging will occur.
+     *
+     * @param errorHandler the {@link ErrorHandler} to be invoked
+     */
+    public void setErrorHandler(ErrorHandler errorHandler) {
+        this.errorHandler = errorHandler;
+    }
+
+    /**
+     * Runnable implementation that starts the ZooKeeper server.
+     */
+    private class ServerRunnable implements Runnable {
+
+        @Override
+        public void run() {
+            try {
+                Properties properties = new Properties();
+                File file = new File(System.getProperty("java.io.tmpdir")
+                    + File.separator + UUID.randomUUID());
+                file.deleteOnExit();
+                properties.setProperty("dataDir", file.getAbsolutePath());
+                properties.setProperty("clientPort", String.valueOf(clientPort));
+
+                QuorumPeerConfig quorumPeerConfig = new QuorumPeerConfig();
+                quorumPeerConfig.parseProperties(properties);
+
+                zkServer = new ZooKeeperServerMain();
+                ServerConfig configuration = new ServerConfig();
+                configuration.readFrom(quorumPeerConfig);
+
+                zkServer.runFromConfig(configuration);
+            }
+            catch (Exception e) {
+                if (errorHandler != null) {
+                    errorHandler.handleError(e);
+                }
+                else {
+                    logger.error("Exception running embedded ZooKeeper", e);
+                }
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/impl/GrpcGreeterImpl.java b/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/impl/GrpcGreeterImpl.java
new file mode 100644
index 0000000..2caa3e6
--- /dev/null
+++ b/dubbo-samples-grpc/src/main/java/org/apache/dubbo/samples/basic/impl/GrpcGreeterImpl.java
@@ -0,0 +1,36 @@
+/*
+ * 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.dubbo.samples.basic.impl;
+
+import io.grpc.examples.helloworld.GreeterGrpc;
+import io.grpc.examples.helloworld.HelloReply;
+import io.grpc.examples.helloworld.HelloRequest;
+import io.grpc.stub.StreamObserver;
+
+/**
+ *
+ */
+public class GrpcGreeterImpl extends GreeterGrpc.GreeterImplBase {
+
+    @Override
+    public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
+        HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + request.getName()).build();
+        responseObserver.onNext(reply);
+        responseObserver.onCompleted();
+    }
+
+}
diff --git a/dubbo-samples-grpc/src/main/proto/hello_streaming.proto b/dubbo-samples-grpc/src/main/proto/hello_streaming.proto
new file mode 100644
index 0000000..325b909
--- /dev/null
+++ b/dubbo-samples-grpc/src/main/proto/hello_streaming.proto
@@ -0,0 +1,37 @@
+// Copyright 2015 The gRPC Authors
+//
+// Licensed 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.
+syntax = "proto3";
+
+option java_multiple_files = true;
+option java_package = "io.grpc.examples.manualflowcontrol";
+option java_outer_classname = "HelloStreamingProto";
+option objc_class_prefix = "HLWS";
+
+package manualflowcontrol;
+
+// The greeting service definition.
+service StreamingGreeter {
+  // Streams a many greetings
+  rpc SayHelloStreaming (stream HelloRequest) returns (stream HelloReply) {}
+}
+
+// The request message containing the user's name.
+message HelloRequest {
+  string name = 1;
+}
+
+// The response message containing the greetings
+message HelloReply {
+  string message = 1;
+}
diff --git a/dubbo-samples-grpc/src/main/proto/helloworld.proto b/dubbo-samples-grpc/src/main/proto/helloworld.proto
new file mode 100644
index 0000000..c60d941
--- /dev/null
+++ b/dubbo-samples-grpc/src/main/proto/helloworld.proto
@@ -0,0 +1,37 @@
+// Copyright 2015 The gRPC Authors
+//
+// Licensed 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.
+syntax = "proto3";
+
+option java_multiple_files = true;
+option java_package = "io.grpc.examples.helloworld";
+option java_outer_classname = "HelloWorldProto";
+option objc_class_prefix = "HLW";
+
+package helloworld;
+
+// The greeting service definition.
+service Greeter {
+  // Sends a greeting
+  rpc SayHello (HelloRequest) returns (HelloReply) {}
+}
+
+// The request message containing the user's name.
+message HelloRequest {
+  string name = 1;
+}
+
+// The response message containing the greetings
+message HelloReply {
+  string message = 1;
+}
diff --git a/dubbo-samples-grpc/src/main/proto/route_guide.proto b/dubbo-samples-grpc/src/main/proto/route_guide.proto
new file mode 100644
index 0000000..3c179f2
--- /dev/null
+++ b/dubbo-samples-grpc/src/main/proto/route_guide.proto
@@ -0,0 +1,115 @@
+// Copyright 2015 The gRPC Authors
+//
+// Licensed 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.
+syntax = "proto3";
+
+option java_multiple_files = true;
+option java_package = "io.grpc.examples.routeguide";
+option java_outer_classname = "RouteGuideProto";
+option objc_class_prefix = "RTG";
+
+package routeguide;
+
+// Interface exported by the server.
+service RouteGuide {
+  // A simple RPC.
+  //
+  // Obtains the feature at a given position.
+  //
+  // A feature with an empty name is returned if there's no feature at the given
+  // position.
+  rpc GetFeature(Point) returns (Feature) {}
+
+  // A server-to-client streaming RPC.
+  //
+  // Obtains the Features available within the given Rectangle.  Results are
+  // streamed rather than returned at once (e.g. in a response message with a
+  // repeated field), as the rectangle may cover a large area and contain a
+  // huge number of features.
+  rpc ListFeatures(Rectangle) returns (stream Feature) {}
+
+  // A client-to-server streaming RPC.
+  //
+  // Accepts a stream of Points on a route being traversed, returning a
+  // RouteSummary when traversal is completed.
+  rpc RecordRoute(stream Point) returns (RouteSummary) {}
+
+  // A Bidirectional streaming RPC.
+  //
+  // Accepts a stream of RouteNotes sent while a route is being traversed,
+  // while receiving other RouteNotes (e.g. from other users).
+  rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
+}
+
+// Points are represented as latitude-longitude pairs in the E7 representation
+// (degrees multiplied by 10**7 and rounded to the nearest integer).
+// Latitudes should be in the range +/- 90 degrees and longitude should be in
+// the range +/- 180 degrees (inclusive).
+message Point {
+  int32 latitude = 1;
+  int32 longitude = 2;
+}
+
+// A latitude-longitude rectangle, represented as two diagonally opposite
+// points "lo" and "hi".
+message Rectangle {
+  // One corner of the rectangle.
+  Point lo = 1;
+
+  // The other corner of the rectangle.
+  Point hi = 2;
+}
+
+// A feature names something at a given point.
+//
+// If a feature could not be named, the name is empty.
+message Feature {
+  // The name of the feature.
+  string name = 1;
+
+  // The point where the feature is detected.
+  Point location = 2;
+}
+
+// Not used in the RPC.  Instead, this is here for the form serialized to disk.
+message FeatureDatabase {
+  repeated Feature feature = 1;
+}
+
+// A RouteNote is a message sent while at a given point.
+message RouteNote {
+  // The location from which the message is sent.
+  Point location = 1;
+
+  // The message to be sent.
+  string message = 2;
+}
+
+// A RouteSummary is received in response to a RecordRoute rpc.
+//
+// It contains the number of individual points received, the number of
+// detected features, and the total distance covered as the cumulative sum of
+// the distance between each point.
+message RouteSummary {
+  // The number of points received.
+  int32 point_count = 1;
+
+  // The number of known features passed while traversing the route.
+  int32 feature_count = 2;
+
+  // The distance covered in metres.
+  int32 distance = 3;
+
+  // The duration of the traversal in seconds.
+  int32 elapsed_time = 4;
+}
diff --git a/dubbo-samples-grpc/src/main/resources/log4j.properties b/dubbo-samples-grpc/src/main/resources/log4j.properties
new file mode 100644
index 0000000..d6ecd5c
--- /dev/null
+++ b/dubbo-samples-grpc/src/main/resources/log4j.properties
@@ -0,0 +1,26 @@
+#
+#
+#   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.
+#
+#
+
+###set log levels###
+log4j.rootLogger=info, stdout
+###output to the console###
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n
\ No newline at end of file
diff --git a/dubbo-samples-grpc/src/main/resources/spring/dubbo-demo-consumer.xml b/dubbo-samples-grpc/src/main/resources/spring/dubbo-demo-consumer.xml
new file mode 100644
index 0000000..707e86f
--- /dev/null
+++ b/dubbo-samples-grpc/src/main/resources/spring/dubbo-demo-consumer.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
+       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+    <context:property-placeholder/>
+
+    <dubbo:application name="demo-consumer"/>
+
+    <dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/>
+
+    <dubbo:reference id="greeter" interface="io.grpc.examples.helloworld.GreeterGrpc$IGreeter" protocol="grpc"/>
+
+</beans>
diff --git a/dubbo-samples-grpc/src/main/resources/spring/dubbo-demo-provider.xml b/dubbo-samples-grpc/src/main/resources/spring/dubbo-demo-provider.xml
new file mode 100644
index 0000000..b6736d9
--- /dev/null
+++ b/dubbo-samples-grpc/src/main/resources/spring/dubbo-demo-provider.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
+       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+    <context:property-placeholder/>
+
+    <dubbo:application name="demo-provider"/>
+
+    <dubbo:protocol id="grpc" name="grpc"/>
+
+    <dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/>
+
+    <bean id="greeter" class="org.apache.dubbo.samples.basic.impl.GrpcGreeterImpl"/>
+
+    <dubbo:service interface="io.grpc.examples.helloworld.GreeterGrpc$IGreeter" ref="greeter" protocol="grpc"/>
+
+</beans>
diff --git a/pom.xml b/pom.xml
index ad8db95..f765cf1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -72,6 +72,7 @@
         <module>dubbo-samples-nacos</module>
         <module>dubbo-samples-metrics</module>
         <module>dubbo-samples-environment-keys</module>
+        <module>dubbo-samples-grpc</module>
     </modules>
 
     <repositories>


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@dubbo.apache.org
For additional commands, e-mail: notifications-help@dubbo.apache.org