gRPC Server Reflection provides information about publicly-accessible gRPC
services on a server, and assists clients at runtime with constructing RPC
requests and responses without precompiled service information. It is used by
the gRPC command line tool (gRPC CLI), which can be used to introspect server
protos and send/receive test RPCs. Reflection is only supported for
proto-based services.
gRPC-Java Server Reflection is implemented byio.grpc.protobuf.services.ProtoReflectionService
in the grpc-services
package. To enable server reflection, you need to add theProtoReflectionService
to your gRPC server.
For example, to enable server reflection inexamples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java
, we
need to make the following changes:
--- a/examples/build.gradle
+++ b/examples/build.gradle
@@ -27,6 +27,7 @@
dependencies {
compile "io.grpc:grpc-netty-shaded:${grpcVersion}"
compile "io.grpc:grpc-protobuf:${grpcVersion}"
+ compile "io.grpc:grpc-services:${grpcVersion}"
compile "io.grpc:grpc-stub:${grpcVersion}"
testCompile "junit:junit:4.12"
--- a/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java
+++ b/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java
@@ -33,6 +33,7 @@ package io.grpc.examples.helloworld;
import io.grpc.Server;
import io.grpc.ServerBuilder;
+import io.grpc.protobuf.services.ProtoReflectionService;
import io.grpc.stub.StreamObserver;
import java.io.IOException;
import java.util.logging.Logger;
@@ -50,6 +51,7 @@ public class HelloWorldServer {
int port = 50051;
server = ServerBuilder.forPort(port)
.addService(new GreeterImpl())
+ .addService(ProtoReflectionService.newInstance())
.build()
.start();
logger.info("Server started, listening on " + port);
In the following examples, we assume you have made these changes to
enable reflection in HelloWorldServer.java
.
After enabling server reflection in a server application, you can use gRPC
CLI to get information about its available services. gRPC CLI is written
in C++. Instructions on how to build gRPC CLI can be found at
command_line_tool.md.
First, build and start the hello-world-server
:
$ cd examples/
$ ./gradlew installDist
$ build/install/examples/bin/hello-world-server
Open a new terminal and make sure you are in the directory where the grpc_cli
binary is located:
$ cd <grpc-cpp-directory>/bins/opt
grpc_cli ls
command lists services and methods exposed at a given port:
sh $ ./grpc_cli ls localhost:50051
output:
sh helloworld.Greeter grpc.reflection.v1alpha.ServerReflection
grpc_cli ls
command inspects a service given its full name (in the format of
<package>.<service>). It can print information with a long listing format
when -l
flag is set. This flag can be used to get more details about a
service.
sh $ ./grpc_cli ls localhost:50051 helloworld.Greeter -l
output:
```sh
filename: helloworld.proto
package: helloworld;
service Greeter {
rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {}
}
```
grpc_cli ls
command also inspects a method given its full name (in the
format of <package>.<service>.<method>).
sh $ ./grpc_cli ls localhost:50051 helloworld.Greeter.SayHello -l
output:
sh rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {}
We can usegrpc_cli type
command to inspect request/response types given the
full name of the type (in the format of <package>.<type>).
sh $ ./grpc_cli type localhost:50051 helloworld.HelloRequest
output:
sh message HelloRequest { optional string name = 1[json_name = "name"]; }
We can send RPCs to a server and get responses using grpc_cli call
command.
sh $ ./grpc_cli call localhost:50051 SayHello "name: 'gRPC CLI'"
output:
sh message: "Hello gRPC CLI"