gRPC Hostname Example
=====================

The hostname example is a Hello World server whose response includes its
hostname. It also supports health and reflection services. This makes it a good
server to test infrastructure, like load balancing.

The example requires grpc-java to already be built. You are strongly encouraged
to check out a git release tag, since there will already be a build of grpc
available. Otherwise you must follow [COMPILING](../../COMPILING.md).

### Build the example

1. Build the hello-world example client. See [the examples README](../README.md)

2. Build this server. From the `grpc-java/examples/examples-hostname` directory:
```
$ ../gradlew installDist
```

This creates the script `build/install/hostname-server/bin/hostname-server` that
runs the example.

To run the hostname example, run:

```
$ ./build/install/hostname-server/bin/hostname-server
```

And in a different terminal window run the hello-world client:

```
$ ../build/install/examples/bin/hello-world-client
```

### Maven

If you prefer to use Maven:
1. Build the hello-world example client. See [the examples README](../README.md)

2. Run in this directory:
```
$ mvn verify
$ # Run the server (from the examples-hostname directory)
$ mvn exec:java -Dexec.mainClass=io.grpc.examples.hostname.HostnameServer
$ # In another terminal run the client (from the examples directory)
$ cd ..
$ mvn exec:java -Dexec.mainClass=io.grpc.examples.helloworld.HelloWorldClient
```

### Bazel

If you prefer to use Bazel, run from the `grpc-java/examples` directory:
```
$ bazel build :hello-world-client example-hostname:hostname-server
$ # Run the server
$ ./bazel-bin/example-hostname/hostname-server
$ # In another terminal run the client
$ ./bazel-bin/hello-world-client
```
