xref: /aosp_15_r20/external/grpc-grpc/doc/server_reflection_tutorial.md (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker# gRPC Server Reflection Tutorial
2*cc02d7e2SAndroid Build Coastguard Worker
3*cc02d7e2SAndroid Build Coastguard WorkergRPC Server Reflection provides information about publicly-accessible gRPC
4*cc02d7e2SAndroid Build Coastguard Workerservices on a server, and assists clients at runtime to construct RPC
5*cc02d7e2SAndroid Build Coastguard Workerrequests and responses without precompiled service information. It is used by
6*cc02d7e2SAndroid Build Coastguard WorkergRPC CLI, which can be used to introspect server protos and send/receive test
7*cc02d7e2SAndroid Build Coastguard WorkerRPCs.
8*cc02d7e2SAndroid Build Coastguard Worker
9*cc02d7e2SAndroid Build Coastguard Worker## Enable Server Reflection
10*cc02d7e2SAndroid Build Coastguard Worker
11*cc02d7e2SAndroid Build Coastguard Worker### Enable server reflection in C++ servers
12*cc02d7e2SAndroid Build Coastguard Worker
13*cc02d7e2SAndroid Build Coastguard WorkerC++ Server Reflection is an add-on library, `libgrpc++_reflection`. To enable C++
14*cc02d7e2SAndroid Build Coastguard Workerserver reflection, you can link this library to your server binary.
15*cc02d7e2SAndroid Build Coastguard Worker
16*cc02d7e2SAndroid Build Coastguard WorkerSome platforms (e.g. Ubuntu 11.10 onwards) only link in libraries that directly
17*cc02d7e2SAndroid Build Coastguard Workercontain symbols used by the application. On these platforms, LD flag
18*cc02d7e2SAndroid Build Coastguard Worker`--no-as-needed` is needed for dynamic linking and `--whole-archive` is
19*cc02d7e2SAndroid Build Coastguard Workerneeded for static linking.
20*cc02d7e2SAndroid Build Coastguard Worker
21*cc02d7e2SAndroid Build Coastguard WorkerThis [Makefile](../examples/cpp/helloworld/Makefile#L37#L45) demonstrates
22*cc02d7e2SAndroid Build Coastguard Workerenabling c++ server reflection on Linux and MacOS.
23*cc02d7e2SAndroid Build Coastguard Worker
24*cc02d7e2SAndroid Build Coastguard Worker## Test services using Server Reflection
25*cc02d7e2SAndroid Build Coastguard Worker
26*cc02d7e2SAndroid Build Coastguard WorkerAfter enabling Server Reflection in a server application, you can use gRPC CLI
27*cc02d7e2SAndroid Build Coastguard Workerto test its services.
28*cc02d7e2SAndroid Build Coastguard Worker
29*cc02d7e2SAndroid Build Coastguard WorkerInstructions on how to use gRPC CLI can be found at
30*cc02d7e2SAndroid Build Coastguard Worker[command_line_tool.md](command_line_tool.md), or using `grpc_cli help` command.
31*cc02d7e2SAndroid Build Coastguard Worker
32*cc02d7e2SAndroid Build Coastguard WorkerHere we use `examples/cpp/helloworld` as an example to show the use of gRPC
33*cc02d7e2SAndroid Build Coastguard WorkerServer Reflection and gRPC CLI. First, we need to build gRPC CLI and setup an
34*cc02d7e2SAndroid Build Coastguard Workerexample server with Server Reflection enabled.
35*cc02d7e2SAndroid Build Coastguard Worker
36*cc02d7e2SAndroid Build Coastguard Worker- Setup an example server
37*cc02d7e2SAndroid Build Coastguard Worker
38*cc02d7e2SAndroid Build Coastguard Worker  Server Reflection has already been enabled in the
39*cc02d7e2SAndroid Build Coastguard Worker  [Makefile](../examples/cpp/helloworld/Makefile) of the helloworld example. We
40*cc02d7e2SAndroid Build Coastguard Worker  can simply make it and run the greeter_server.
41*cc02d7e2SAndroid Build Coastguard Worker
42*cc02d7e2SAndroid Build Coastguard Worker  ```sh
43*cc02d7e2SAndroid Build Coastguard Worker  $ make -C examples/cpp/helloworld
44*cc02d7e2SAndroid Build Coastguard Worker  $ examples/cpp/helloworld/greeter_server &
45*cc02d7e2SAndroid Build Coastguard Worker  ```
46*cc02d7e2SAndroid Build Coastguard Worker
47*cc02d7e2SAndroid Build Coastguard Worker- Build gRPC CLI
48*cc02d7e2SAndroid Build Coastguard Worker
49*cc02d7e2SAndroid Build Coastguard Worker  ```sh
50*cc02d7e2SAndroid Build Coastguard Worker  make grpc_cli
51*cc02d7e2SAndroid Build Coastguard Worker  cd bins/opt
52*cc02d7e2SAndroid Build Coastguard Worker  ```
53*cc02d7e2SAndroid Build Coastguard Worker
54*cc02d7e2SAndroid Build Coastguard Worker  gRPC CLI binary `grpc_cli` can be found at `bins/opt/` folder. This tool is
55*cc02d7e2SAndroid Build Coastguard Worker  still new and does not have a `make install` target yet.
56*cc02d7e2SAndroid Build Coastguard Worker
57*cc02d7e2SAndroid Build Coastguard Worker### List services
58*cc02d7e2SAndroid Build Coastguard Worker
59*cc02d7e2SAndroid Build Coastguard Worker`grpc_cli ls` command lists services and methods exposed at a given port
60*cc02d7e2SAndroid Build Coastguard Worker
61*cc02d7e2SAndroid Build Coastguard Worker- List all the services exposed at a given port
62*cc02d7e2SAndroid Build Coastguard Worker
63*cc02d7e2SAndroid Build Coastguard Worker  ```sh
64*cc02d7e2SAndroid Build Coastguard Worker  $ grpc_cli ls localhost:50051
65*cc02d7e2SAndroid Build Coastguard Worker  ```
66*cc02d7e2SAndroid Build Coastguard Worker
67*cc02d7e2SAndroid Build Coastguard Worker  output:
68*cc02d7e2SAndroid Build Coastguard Worker  ```sh
69*cc02d7e2SAndroid Build Coastguard Worker  helloworld.Greeter
70*cc02d7e2SAndroid Build Coastguard Worker  grpc.reflection.v1alpha.ServerReflection
71*cc02d7e2SAndroid Build Coastguard Worker  ```
72*cc02d7e2SAndroid Build Coastguard Worker
73*cc02d7e2SAndroid Build Coastguard Worker- List one service with details
74*cc02d7e2SAndroid Build Coastguard Worker
75*cc02d7e2SAndroid Build Coastguard Worker  `grpc_cli ls` command inspects a service given its full name (in the format of
76*cc02d7e2SAndroid Build Coastguard Worker  \<package\>.\<service\>). It can print information with a long listing format
77*cc02d7e2SAndroid Build Coastguard Worker  when `-l` flag is set. This flag can be used to get more details about a
78*cc02d7e2SAndroid Build Coastguard Worker  service.
79*cc02d7e2SAndroid Build Coastguard Worker
80*cc02d7e2SAndroid Build Coastguard Worker  ```sh
81*cc02d7e2SAndroid Build Coastguard Worker  $ grpc_cli ls localhost:50051 helloworld.Greeter -l
82*cc02d7e2SAndroid Build Coastguard Worker  ```
83*cc02d7e2SAndroid Build Coastguard Worker
84*cc02d7e2SAndroid Build Coastguard Worker  output:
85*cc02d7e2SAndroid Build Coastguard Worker  ```sh
86*cc02d7e2SAndroid Build Coastguard Worker  filename: helloworld.proto
87*cc02d7e2SAndroid Build Coastguard Worker  package: helloworld;
88*cc02d7e2SAndroid Build Coastguard Worker  service Greeter {
89*cc02d7e2SAndroid Build Coastguard Worker    rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {}
90*cc02d7e2SAndroid Build Coastguard Worker  }
91*cc02d7e2SAndroid Build Coastguard Worker
92*cc02d7e2SAndroid Build Coastguard Worker  ```
93*cc02d7e2SAndroid Build Coastguard Worker
94*cc02d7e2SAndroid Build Coastguard Worker### List methods
95*cc02d7e2SAndroid Build Coastguard Worker
96*cc02d7e2SAndroid Build Coastguard Worker- List one method with details
97*cc02d7e2SAndroid Build Coastguard Worker
98*cc02d7e2SAndroid Build Coastguard Worker  `grpc_cli ls` command also inspects a method given its full name (in the
99*cc02d7e2SAndroid Build Coastguard Worker  format of \<package\>.\<service\>.\<method\>).
100*cc02d7e2SAndroid Build Coastguard Worker
101*cc02d7e2SAndroid Build Coastguard Worker  ```sh
102*cc02d7e2SAndroid Build Coastguard Worker  $ grpc_cli ls localhost:50051 helloworld.Greeter.SayHello -l
103*cc02d7e2SAndroid Build Coastguard Worker  ```
104*cc02d7e2SAndroid Build Coastguard Worker
105*cc02d7e2SAndroid Build Coastguard Worker  output:
106*cc02d7e2SAndroid Build Coastguard Worker  ```sh
107*cc02d7e2SAndroid Build Coastguard Worker    rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {}
108*cc02d7e2SAndroid Build Coastguard Worker  ```
109*cc02d7e2SAndroid Build Coastguard Worker
110*cc02d7e2SAndroid Build Coastguard Worker### Inspect message types
111*cc02d7e2SAndroid Build Coastguard Worker
112*cc02d7e2SAndroid Build Coastguard WorkerWe can use`grpc_cli type` command to inspect request/response types given the
113*cc02d7e2SAndroid Build Coastguard Workerfull name of the type (in the format of \<package\>.\<type\>).
114*cc02d7e2SAndroid Build Coastguard Worker
115*cc02d7e2SAndroid Build Coastguard Worker- Get information about the request type
116*cc02d7e2SAndroid Build Coastguard Worker
117*cc02d7e2SAndroid Build Coastguard Worker  ```sh
118*cc02d7e2SAndroid Build Coastguard Worker  $ grpc_cli type localhost:50051 helloworld.HelloRequest
119*cc02d7e2SAndroid Build Coastguard Worker  ```
120*cc02d7e2SAndroid Build Coastguard Worker
121*cc02d7e2SAndroid Build Coastguard Worker  output:
122*cc02d7e2SAndroid Build Coastguard Worker  ```sh
123*cc02d7e2SAndroid Build Coastguard Worker  message HelloRequest {
124*cc02d7e2SAndroid Build Coastguard Worker    optional string name = 1;
125*cc02d7e2SAndroid Build Coastguard Worker  }
126*cc02d7e2SAndroid Build Coastguard Worker  ```
127*cc02d7e2SAndroid Build Coastguard Worker
128*cc02d7e2SAndroid Build Coastguard Worker### Call a remote method
129*cc02d7e2SAndroid Build Coastguard Worker
130*cc02d7e2SAndroid Build Coastguard WorkerWe can send RPCs to a server and get responses using `grpc_cli call` command.
131*cc02d7e2SAndroid Build Coastguard Worker
132*cc02d7e2SAndroid Build Coastguard Worker- Call a unary method
133*cc02d7e2SAndroid Build Coastguard Worker
134*cc02d7e2SAndroid Build Coastguard Worker  ```sh
135*cc02d7e2SAndroid Build Coastguard Worker  $ grpc_cli call localhost:50051 SayHello "name: 'gRPC CLI'"
136*cc02d7e2SAndroid Build Coastguard Worker  ```
137*cc02d7e2SAndroid Build Coastguard Worker
138*cc02d7e2SAndroid Build Coastguard Worker  output:
139*cc02d7e2SAndroid Build Coastguard Worker  ```sh
140*cc02d7e2SAndroid Build Coastguard Worker  message: "Hello gRPC CLI"
141*cc02d7e2SAndroid Build Coastguard Worker  ```
142*cc02d7e2SAndroid Build Coastguard Worker
143*cc02d7e2SAndroid Build Coastguard Worker## Use Server Reflection in a C++ client
144*cc02d7e2SAndroid Build Coastguard Worker
145*cc02d7e2SAndroid Build Coastguard WorkerServer Reflection can be used by clients to get information about gRPC services
146*cc02d7e2SAndroid Build Coastguard Workerat runtime. We've provided a descriptor database called
147*cc02d7e2SAndroid Build Coastguard Worker[grpc::ProtoReflectionDescriptorDatabase](../test/cpp/util/proto_reflection_descriptor_database.h)
148*cc02d7e2SAndroid Build Coastguard Workerwhich implements the
149*cc02d7e2SAndroid Build Coastguard Worker[google::protobuf::DescriptorDatabase](https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor_database#DescriptorDatabase)
150*cc02d7e2SAndroid Build Coastguard Workerinterface. It manages the communication between clients and reflection services
151*cc02d7e2SAndroid Build Coastguard Workerand the storage of received information. Clients can use it as using a local
152*cc02d7e2SAndroid Build Coastguard Workerdescriptor database.
153*cc02d7e2SAndroid Build Coastguard Worker
154*cc02d7e2SAndroid Build Coastguard Worker- To use Server Reflection with grpc::ProtoReflectionDescriptorDatabase, first
155*cc02d7e2SAndroid Build Coastguard Worker  initialize an instance with a grpc::Channel.
156*cc02d7e2SAndroid Build Coastguard Worker
157*cc02d7e2SAndroid Build Coastguard Worker  ```c++
158*cc02d7e2SAndroid Build Coastguard Worker  std::shared_ptr<grpc::Channel> channel =
159*cc02d7e2SAndroid Build Coastguard Worker      grpc::CreateChannel(server_address, server_cred);
160*cc02d7e2SAndroid Build Coastguard Worker  grpc::ProtoReflectionDescriptorDatabase reflection_db(channel);
161*cc02d7e2SAndroid Build Coastguard Worker  ```
162*cc02d7e2SAndroid Build Coastguard Worker
163*cc02d7e2SAndroid Build Coastguard Worker- Then use this instance to feed a
164*cc02d7e2SAndroid Build Coastguard Worker  [google::protobuf::DescriptorPool](https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor#DescriptorPool).
165*cc02d7e2SAndroid Build Coastguard Worker
166*cc02d7e2SAndroid Build Coastguard Worker  ```c++
167*cc02d7e2SAndroid Build Coastguard Worker  google::protobuf::DescriptorPool desc_pool(&reflection_db);
168*cc02d7e2SAndroid Build Coastguard Worker  ```
169*cc02d7e2SAndroid Build Coastguard Worker
170*cc02d7e2SAndroid Build Coastguard Worker- Example usage of this descriptor pool
171*cc02d7e2SAndroid Build Coastguard Worker
172*cc02d7e2SAndroid Build Coastguard Worker  * Get Service/method descriptors.
173*cc02d7e2SAndroid Build Coastguard Worker
174*cc02d7e2SAndroid Build Coastguard Worker    ```c++
175*cc02d7e2SAndroid Build Coastguard Worker    const google::protobuf::ServiceDescriptor* service_desc =
176*cc02d7e2SAndroid Build Coastguard Worker        desc_pool->FindServiceByName("helloworld.Greeter");
177*cc02d7e2SAndroid Build Coastguard Worker    const google::protobuf::MethodDescriptor* method_desc =
178*cc02d7e2SAndroid Build Coastguard Worker        desc_pool->FindMethodByName("helloworld.Greeter.SayHello");
179*cc02d7e2SAndroid Build Coastguard Worker    ```
180*cc02d7e2SAndroid Build Coastguard Worker
181*cc02d7e2SAndroid Build Coastguard Worker  * Get message type descriptors and create messages dynamically.
182*cc02d7e2SAndroid Build Coastguard Worker
183*cc02d7e2SAndroid Build Coastguard Worker    ```c++
184*cc02d7e2SAndroid Build Coastguard Worker    const google::protobuf::Descriptor* request_desc =
185*cc02d7e2SAndroid Build Coastguard Worker        desc_pool->FindMessageTypeByName("helloworld.HelloRequest");
186*cc02d7e2SAndroid Build Coastguard Worker    google::protobuf::DynamicMessageFactory dmf;
187*cc02d7e2SAndroid Build Coastguard Worker    google::protobuf::Message* request = dmf.GetPrototype(request_desc)->New();
188*cc02d7e2SAndroid Build Coastguard Worker    ```
189*cc02d7e2SAndroid Build Coastguard Worker
190*cc02d7e2SAndroid Build Coastguard Worker## Use Server Reflection in a Python client
191*cc02d7e2SAndroid Build Coastguard Worker
192*cc02d7e2SAndroid Build Coastguard WorkerSee [Python Server Reflection](python/server_reflection.md).
193*cc02d7e2SAndroid Build Coastguard Worker
194