mirror of https://github.com/grpc/grpc.io.git
Add Reflection Guide (#1269)
This commit is contained in:
parent
97ad71b7d1
commit
bda02f92b6
|
|
@ -0,0 +1,78 @@
|
||||||
|
---
|
||||||
|
title: Reflection
|
||||||
|
description: >-
|
||||||
|
Explains how reflection can be used to improve the transparency and
|
||||||
|
interpretability of RPCs.
|
||||||
|
---
|
||||||
|
|
||||||
|
### Overview
|
||||||
|
|
||||||
|
Reflection is [a
|
||||||
|
protocol](https://github.com/grpc/grpc-proto/blob/master/grpc/reflection/v1/reflection.proto)
|
||||||
|
that gRPC servers can use to declare the protobuf-defined APIs they export over
|
||||||
|
a standardized RPC service, including all types referenced by the request and
|
||||||
|
response messages. Clients can then use this information to encode requests and
|
||||||
|
decode responses in human-readable manner.
|
||||||
|
|
||||||
|
Reflection is used heavily by debugging tools such as
|
||||||
|
[`grpcurl`](https://github.com/fullstorydev/grpcurl) and
|
||||||
|
[Postman](https://learning.postman.com/docs/sending-requests/grpc/grpc-client-overview/).
|
||||||
|
One coming from the REST world might compare the gRPC reflection API to serving
|
||||||
|
an OpenAPI document on the HTTP server presenting the REST API being described.
|
||||||
|
|
||||||
|
### Transparency and Interpretability
|
||||||
|
|
||||||
|
A big contributor to gRPC's stellar performance is the use of Protobuf for
|
||||||
|
serialization -- a _binary_ non-human-readable protocol. While this greatly
|
||||||
|
speeds up an RPC, it can also make it more difficult to manually interact with a
|
||||||
|
server. Hypothetically, in order to manually send a gRPC request to a server
|
||||||
|
over HTTP/2 using `curl`, you would have to:
|
||||||
|
|
||||||
|
1. Know which RPC services the server exposed.
|
||||||
|
2. Know the protobuf definition of the request message and all types it
|
||||||
|
references.
|
||||||
|
3. Know the protobuf definition of the response message all the types _it_
|
||||||
|
references.
|
||||||
|
|
||||||
|
Then, you'd have to use that knowledge to hand-craft your request message(s) into
|
||||||
|
binary and painstakingly decode the response message(s). This would be time
|
||||||
|
consuming, frustrating, and error prone. Instead, the reflection protocol
|
||||||
|
enables tools to automate this whole process, making it invisible.
|
||||||
|
|
||||||
|
### Enabling Reflection on a gRPC Server
|
||||||
|
|
||||||
|
Reflection is _not_ automatically enabled on a gRPC server. The server author
|
||||||
|
must call a few additional functions to add a reflection service. These API calls
|
||||||
|
differ slightly from language to language and, in some languages, require adding
|
||||||
|
a dependency on a separate package, named something like `grpc-reflection`
|
||||||
|
|
||||||
|
Follow these links below for details on your specific language:
|
||||||
|
|
||||||
|
| Language | Guide |
|
||||||
|
|----------|------------------|
|
||||||
|
| Java | [Java example] |
|
||||||
|
| Go | [Go example] |
|
||||||
|
| C++ | [C++ example] |
|
||||||
|
| Python | [Python example] |
|
||||||
|
|
||||||
|
[Java example]: https://github.com/grpc/grpc-java/tree/master/examples/example-reflection
|
||||||
|
|
||||||
|
[Go example]: https://github.com/grpc/grpc-go/tree/master/examples/features/reflection
|
||||||
|
|
||||||
|
[C++ example]: https://github.com/grpc/grpc/tree/master/examples/cpp/reflection
|
||||||
|
|
||||||
|
[Python example]: https://github.com/grpc/grpc/blob/master/examples/python/helloworld/greeter_server_with_reflection.py
|
||||||
|
|
||||||
|
### Tips
|
||||||
|
|
||||||
|
Reflection works so seamlessly with tools such as `grpcurl` that oftentimes,
|
||||||
|
people aren't even aware that it's happening under the hood. However, if
|
||||||
|
reflection isn't exposed, things won't work seamlessly at all. Instead, the
|
||||||
|
client will fail with nasty errors. People often run into this when writing the
|
||||||
|
routing configuration for a gRPC service. The _reflection_ service must be
|
||||||
|
routed to the appropriate backend as well as the application's main RPC service.
|
||||||
|
|
||||||
|
If your gRPC API is accessible to public users, you may _not_ want to expose the
|
||||||
|
reflection service, as you may consider this a security issue. Ultimately, you
|
||||||
|
will need to make a call here that strikes the best balance between security and
|
||||||
|
ease-of-use for you and your users.
|
||||||
Loading…
Reference in New Issue