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:09 UTC

[dubbo-samples] branch gRPC created (now 0d95754)

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

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


      at 0d95754  add grpc sample

This branch includes the following new commits:

     new 0d95754  add grpc sample

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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


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

Posted by li...@apache.org.
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