It is assumed that you have a working gRPC, ProtoBuf and Java environment, a Google Cloud account and SDK configured.
-
Build the code:
./gradlew build
-
Test running the code, optional:
# In the background or another terminal run the server: java -jar server/build/libs/server.jar # Check the client parameters: java -jar client/build/libs/client.jar --help # Run the client java -jar client/build/libs/client.jar --greetee 'Endpoints!'
-
Generate the
out.pb
from the proto file.protoc --include_imports --include_source_info api/src/main/proto/helloworld.proto --descriptor_set_out out.pb
-
Edit,
api_config.yaml
. ReplaceMY_PROJECT_ID
with your project id. -
Deploy your service config to Service Management:
gcloud endpoints services deploy out.pb api_config.yaml # The Config ID should be printed out, looks like: 2017-02-01r0, remember this # set your project to make commands easier GCLOUD_PROJECT=<Your Project ID> # Print out your Config ID again, in case you missed it gcloud endpoints configs list --service hellogrpc.endpoints.${GCLOUD_PROJECT}.cloud.goog
-
Also get an API key from the Console's API Manager for use in the client later. (https://console.cloud.google.com/apis/credentials)
-
Build a docker image for your gRPC server, store in your Registry
gcloud container builds submit --tag gcr.io/${GCLOUD_PROJECT}/java-grpc-hello:1.0 .
-
Either deploy to GCE (below) or GKE (further down)
-
Create your instance and ssh in.
gcloud compute instances create grpc-host --image-family gci-stable --image-project google-containers --tags=http-server gcloud compute ssh grpc-host
-
Set some variables to make commands easier
GCLOUD_PROJECT=$(curl -s "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google") SERVICE_NAME=hellogrpc.endpoints.${GCLOUD_PROJECT}.cloud.goog
-
Pull your credentials to access Container Registry, and run your gRPC server container
/usr/share/google/dockercfg_update.sh docker run --detach --name=grpc-hello gcr.io/${GCLOUD_PROJECT}/java-grpc-hello:1.0
-
Run the Endpoints proxy
docker run \ --detach \ --name=esp \ --publish 80:9000 \ --link=grpc-hello:grpc-hello \ gcr.io/endpoints-release/endpoints-runtime:1 \ --service=${SERVICE_NAME} \ --rollout_strategy=managed \ --http2_port=9000 \ --backend=grpc://grpc-hello:50051
-
Back on your local machine, get the external IP of your GCE instance.
gcloud compute instances list
-
Run the client
java -jar client/build/libs/client.jar --host <IP of GCE Instance>:80 --api_key <API Key from Console>
-
Create a cluster
gcloud container clusters create my-cluster
-
Edit
deployment.yaml
. ReplaceSERVICE_NAME
andGCLOUD_PROJECT
with your values. -
Deploy to GKE
kubectl create -f ./deployment.yaml
-
Get IP of load balancer, run until you see an External IP.
kubectl get svc grpc-hello
-
Run the client
java -jar client/build/libs/client.jar --host <IP of GKE LoadBalancer>:80 --api_key <API Key from Console>