| # gRPC Server Reflection Tutorial | |
| 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. | |
| ## Enable Server Reflection | |
| gRPC-Java Server Reflection is implemented by | |
| `io.grpc.protobuf.services.ProtoReflectionService` in the `grpc-services` | |
| package. To enable server reflection, you need to add the | |
| `ProtoReflectionService` to your gRPC server. | |
| For example, to enable server reflection in | |
| `examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java`, we | |
| need to make the following changes: | |
| ```diff | |
| --- 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`. | |
| ## gRPC CLI | |
| 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](https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md). | |
| ## Use gRPC CLI to check services | |
| First, build and start the `hello-world-server`: | |
| ```sh | |
| $ 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: | |
| ```sh | |
| $ cd <grpc-cpp-directory>/bins/opt | |
| ``` | |
| ### List services | |
| `grpc_cli ls` command lists services and methods exposed at a given port: | |
| - List all the services exposed at a given port | |
| ```sh | |
| $ ./grpc_cli ls localhost:50051 | |
| ``` | |
| output: | |
| ```sh | |
| helloworld.Greeter | |
| grpc.reflection.v1alpha.ServerReflection | |
| ``` | |
| - List one service with details | |
| `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) {} | |
| } | |
| ``` | |
| ### List methods | |
| - List one method with details | |
| `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) {} | |
| ``` | |
| ### Inspect message types | |
| We can use`grpc_cli type` command to inspect request/response types given the | |
| full name of the type (in the format of \<package\>.\<type\>). | |
| - Get information about the request type | |
| ```sh | |
| $ ./grpc_cli type localhost:50051 helloworld.HelloRequest | |
| ``` | |
| output: | |
| ```sh | |
| message HelloRequest { | |
| optional string name = 1[json_name = "name"]; | |
| } | |
| ``` | |
| ### Call a remote method | |
| We can send RPCs to a server and get responses using `grpc_cli call` command. | |
| - Call a unary method | |
| ```sh | |
| $ ./grpc_cli call localhost:50051 SayHello "name: 'gRPC CLI'" | |
| ``` | |
| output: | |
| ```sh | |
| message: "Hello gRPC CLI" | |
| ``` |