Google Cloud Endpoints Sample for Go using gRPC
This sample demonstrates how to use Google Cloud Endpoints using Go and gRPC.
Test the code locally (optional)
Run the backend using go run
:
$ go run server/main.go
Send a request from another terminal:
$ go run client/main.go
2017/03/30 17:08:32 Greeting: Hello world
Deploying service config
-
First, generate out.pb
from the proto file:
protoc \
--include_imports \
--include_source_info \
--descriptor_set_out out.pb \
helloworld/helloworld.proto
-
Edit api_config.yaml
. Replace YOUR_PROJECT_ID
:
name: hellogrpc.endpoints.YOUR_PROJECT_ID.cloud.goog
-
Deploy your service:
gcloud endpoints services deploy out.pb api_config.yaml
Building the server's Docker container
Build and tag your gRPC server, storing it in your private container registry:
gcloud builds submit --tag gcr.io/YOUR_PROJECT_ID/go-grpc-hello:1.0 .
Deploy to GCE or GKE
Deploy to GCE
-
Create an instance and SSH into it:
gcloud compute instances create grpc-host --image-family cos-stable --image-project cos-cloud --tags=http-server
gcloud compute ssh grpc-host
-
Set some environment variables:
GOOGLE_CLOUD_PROJECT=$(curl -s "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google")
SERVICE_NAME=hellogrpc.endpoints.${GOOGLE_CLOUD_PROJECT}.cloud.goog
-
Pull your credentials to access your private container registry:
docker-credential-gcr configure-docker
-
Create your own container network called esp_net:
docker network create --driver bridge esp_net
-
Run your gRPC server's container:
docker run --detach --net=esp_net --name=grpc-hello gcr.io/${GOOGLE_CLOUD_PROJECT}/go-grpc-hello:1.0
-
Run Endpoints proxy:
docker run \
--detach \
--name=esp \
--publish=80:9000 \
--net=esp_net \
gcr.io/endpoints-release/endpoints-runtime:1 \
--service=${SERVICE_NAME} \
--rollout_strategy=managed \
--http2_port=9000 \
--backend=grpc://grpc-hello:50051
-
On your local machine, get the IP address of your secured gRPC server:
gcloud compute instances list --filter=grpc-host
-
Send a request to the API server (see "Running the client" below)
Deploy to GKE
If you haven't got a cluster, first create one.
-
Edit deployment.yaml
. Replace <YOUR_PROJECT_ID>
.
-
Create the deployment and service:
kubectl apply -f deployment.yaml
-
Wait until the load balancer is active:
kubectl get svc grpc-hello --watch
-
Send a request to the API server (see "Running the client" below)
Running the client
-
First, create a project API key.
-
Then, on your local machine, after you have your server's IP address (via
GKE's kubectl get svc
or your GCE instance's IP), run:
go run client/main.go --api-key=AIza.... --addr=YOUR_SERVER_IP_ADDRESS:80 [message]
Configuring authentication and authenticating requests
Configuring Authentication
This sample shows how to make requests authenticated by a service account using a signed JWT token.
-
First, create a service account
-
Edit api_config_auth.yaml
. Replace PROJECT_ID
and SERVICE-ACCOUNT-ID
.
-
Update the service configuration using api_config_auth.yaml
instead of api_config.yaml
:
gcloud endpoints services deploy out.pb api_config_auth.yaml
Authenticating requests
-
First, create and download a service account key in JSON format.
-
Then, run:
go run client/main.go \
--keyfile=SERVICE_ACCOUNT_KEY.json \
--audience=hellogrpc.endpoints.PROJECT_ID.cloud.goog \
--addr=YOUR_SERVER_IP_ADDRESS:80 \
[message]