blob: 47be7c2396b40c971985fff1e933ac8f62dc3759 [file] [log] [blame] [view]
Eric Gribkoffe08034c2017-01-30 12:57:48 -08001# gRPC Server Reflection Tutorial
2
3gRPC Server Reflection provides information about publicly-accessible gRPC
4services on a server, and assists clients at runtime with constructing RPC
5requests and responses without precompiled service information. It is used by
6the gRPC command line tool (gRPC CLI), which can be used to introspect server
7protos and send/receive test RPCs. Reflection is only supported for
8proto-based services.
9
10## Enable Server Reflection
11
12gRPC-Java Server Reflection is implemented by
13`io.grpc.protobuf.service.ProtoReflectionService` in the `grpc-services`
14package. To enable server reflection, you need to add the
15`ProtoReflectionService` to your gRPC server.
16
17For example, to enable server reflection in
18`examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java`, we
19need to make the following changes:
20
21```diff
22--- a/examples/build.gradle
23+++ b/examples/build.gradle
Eric Andersona7b4dfd2017-02-01 10:20:44 -080024@@ -27,6 +27,7 @@
Eric Gribkoffe08034c2017-01-30 12:57:48 -080025 dependencies {
26 compile "io.grpc:grpc-netty:${grpcVersion}"
27 compile "io.grpc:grpc-protobuf:${grpcVersion}"
28+ compile "io.grpc:grpc-services:${grpcVersion}"
29 compile "io.grpc:grpc-stub:${grpcVersion}"
30
31 testCompile "junit:junit:4.11"
32diff --git a/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java b/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java
33index ce1158a4..788bcc62 100644
34--- a/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java
35+++ b/examples/src/main/java/io/grpc/examples/helloworld/HelloWorldServer.java
36@@ -33,6 +33,7 @@ package io.grpc.examples.helloworld;
37
38 import io.grpc.Server;
39 import io.grpc.ServerBuilder;
40+import io.grpc.protobuf.service.ProtoReflectionService;
41 import io.grpc.stub.StreamObserver;
42
43 import java.io.IOException;
44@@ -51,6 +52,7 @@ public class HelloWorldServer {
45 int port = 50051;
46 server = ServerBuilder.forPort(port)
47 .addService(new GreeterImpl())
48+ .addService(ProtoReflectionService.getInstance())
49 .build()
50 .start();
51 logger.info("Server started, listening on " + port);
52```
53
54In the following examples, we assume you have made these changes to
55enable reflection in `HelloWorldServer.java`.
56
57## gRPC CLI
58
59After enabling server reflection in a server application, you can use gRPC
60CLI to get information about its available services. gRPC CLI is written
61in C++. Instructions on how to build gRPC CLI can be found at
62[command_line_tool.md](https://github.com/grpc/grpc/blob/master/doc/command_line_tool.md).
63
64## Use gRPC CLI to check services
65
66First, build and start the `hello-world-server`:
67
68```sh
69$ cd examples/
70$ ./gradlew installDist
71$ build/install/examples/bin/hello-world-server
72```
73
74Open a new terminal and make sure you are in the directory where the `grpc_cli`
75binary is located:
76
77```sh
78$ cd <grpc-cpp-directory>/bins/opt
79```
80
81### List services
82
83`grpc_cli ls` command lists services and methods exposed at a given port:
84
85- List all the services exposed at a given port
86
87 ```sh
88 $ ./grpc_cli ls localhost:50051
89 ```
90
91 output:
92 ```sh
93 helloworld.Greeter
94 grpc.reflection.v1alpha.ServerReflection
95 ```
96
97- List one service with details
98
99 `grpc_cli ls` command inspects a service given its full name (in the format of
100 \<package\>.\<service\>). It can print information with a long listing format
101 when `-l` flag is set. This flag can be used to get more details about a
102 service.
103
104 ```sh
105 $ ./grpc_cli ls localhost:50051 helloworld.Greeter -l
106 ```
107
108 output:
109 ```sh
110 filename: helloworld.proto
111 package: helloworld;
112 service Greeter {
113 rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {}
114 }
115
116 ```
117
118### List methods
119
120- List one method with details
121
122 `grpc_cli ls` command also inspects a method given its full name (in the
123 format of \<package\>.\<service\>.\<method\>).
124
125 ```sh
126 $ ./grpc_cli ls localhost:50051 helloworld.Greeter.SayHello -l
127 ```
128
129 output:
130 ```sh
131 rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {}
132 ```
133
134### Inspect message types
135
136We can use`grpc_cli type` command to inspect request/response types given the
137full name of the type (in the format of \<package\>.\<type\>).
138
139- Get information about the request type
140
141 ```sh
142 $ ./grpc_cli type localhost:50051 helloworld.HelloRequest
143 ```
144
145 output:
146 ```sh
147 message HelloRequest {
148 optional string name = 1[json_name = "name"];
149 }
150 ```
151
152### Call a remote method
153
154We can send RPCs to a server and get responses using `grpc_cli call` command.
155
156- Call a unary method
157
158 ```sh
159 $ ./grpc_cli call localhost:50051 SayHello "name: 'gRPC CLI'"
160 ```
161
162 output:
163 ```sh
164 message: "Hello gRPC CLI"
165 ```