gRPC Reflection Example
================

The reflection example has a Hello World server with `ProtoReflectionServiceV1` registered. 

### Build the example

To build the example server, from the `grpc-java/examples/examples-reflection`
directory:
```
$ ../gradlew installDist
```

This creates the scripts `build/install/example-reflection/bin/reflection-server`.

### Run the example

gRPC Server Reflection provides information about publicly-accessible gRPC services on a server,
and assists clients at runtime to construct RPC requests and responses without precompiled
service information. It is used by gRPCurl, which can be used to introspect server protos and
send/receive test RPCs.

1. To start the reflection example server on its default port of 50051, run:
```
$ ./build/install/example-reflection/bin/reflection-server
```

2. After enabling Server Reflection in a server application, you can use gRPCurl to check its
services. Instructions on how to install and use gRPCurl can be found at [gRPCurl Installation](https://github.com/fullstorydev/grpcurl#installation)

After installing gRPCurl, open a new terminal and run the commands from the new terminal.

### List all the services exposed at a given port

  ```
  $ grpcurl -plaintext localhost:50051 list
  ```

Output

  ```
  grpc.reflection.v1alpha.ServerReflection
  helloworld.Greeter
  ```

### List all the methods of a service
  ```
  $ grpcurl -plaintext localhost:50051 list helloworld.Greeter
  ```
Output
  ```
  helloworld.Greeter.SayHello
  ```

### Describe services and methods

The describe command inspects a method given its full name(in the format of 
`<package>.<service>.<method>`).

  ```
$ grpcurl -plaintext localhost:50051 describe helloworld.Greeter.SayHello
  ```

Output

  ```
  helloworld.Greeter.SayHello is a method:
  rpc SayHello ( .helloworld.HelloRequest ) returns ( .helloworld.HelloReply );
  ```

### Inspect message types

We can use the describe 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:

  ```
$ grpcurl -plaintext localhost:50051 describe helloworld.HelloRequest
  ```

Output

  ```
  helloworld.HelloRequest is a message:
  message HelloRequest {
    string name = 1;
  }
  ```

### Call a remote method

We can send RPCs to a server and get responses using the full method name
(in the format of `<package>.<service>.<method>`). The `-d <string>` flag represents the request data
and the -format text flag indicates that the request data is in text format.

  ```
  $ grpcurl -plaintext -format text -d 'name: "gRPCurl"' \
    localhost:50051 helloworld.Greeter.SayHello
  ```

Output

  ```
  message: "Hello gRPCurl"
  ```
