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