diff --git a/README.md b/README.md index 7d2db13..4045741 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,13 @@ Kubernetes Engine. It’s **easy to deploy with little to no configuration**. If you’re using this demo, please **★Star** this repository to show your interest! > 👓**Note to Googlers:** Please fill out the form at -[go/microservices-demo](http://go/microservices-demo) if you are using this -application. +> [go/microservices-demo](http://go/microservices-demo) if you are using this +> application. ## Screenshots -| Home Page | Checkout Screen | -|-----------|-----------------| +| Home Page | Checkout Screen | +| ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | | [![Screenshot of store homepage](./docs/img/hipster-shop-frontend-1.png)](./docs/img/hipster-shop-frontend-1.png) | [![Screenshot of checkout screen](./docs/img/hipster-shop-frontend-2.png)](./docs/img/hipster-shop-frontend-2.png) | ## Service Architecture @@ -31,20 +31,19 @@ microservices](./docs/img/architecture-diagram.png)](./docs/img/architecture-dia Find **Protocol Buffers Descriptions** at the [`./pb` directory](./pb). -| Service | Language | Description | -|---------|----------|-------------| -| [frontend](./src/frontend) | Go | Exposes an HTTP server to serve the website. Does not require signup/login and generates session IDs for all users automatically. | -| [cartservice](./src/cartservice) | C# | Stores the items in the user's shipping cart in Redis and retrieves it. | -| [productcatalogservice](./src/productcatalogservice) | Go | Provides the list of products from a JSON file and ability to search products and get individual products. | -| [currencyservice](./src/currencyservice) | Node.js | Converts one money amount to another currency. Uses real values fetched from European Central Bank. It's the highest QPS service. | -| [paymentservice](./src/paymentservice) | Node.js | Charges the given credit card info (mock) with the given amount and returns a transaction ID. | -| [shippingservice](./src/shippingservice) | Go | Gives shipping cost estimates based on the shopping cart. Ships items to the given address (mock) | -| [emailservice](./src/emailservice) | Python | Sends users an order confirmation email (mock). | -| [checkoutservice](./src/checkoutservice) | Go | Retrieves user cart, prepares order and orchestrates the payment, shipping and the email notification. | -| [recommendationservice](./src/recommendationservice) | Python | Recommends other products based on what's given in the cart. | -| [adservice](./src/adservice) | Java | Provides text ads based on given context words. | -| [loadgenerator](./src/loadgenerator) | Python/Locust | Continuously sends requests imitating realistic user shopping flows to the frontend. | - +| Service | Language | Description | +| ---------------------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| [frontend](./src/frontend) | Go | Exposes an HTTP server to serve the website. Does not require signup/login and generates session IDs for all users automatically. | +| [cartservice](./src/cartservice) | C# | Stores the items in the user's shipping cart in Redis and retrieves it. | +| [productcatalogservice](./src/productcatalogservice) | Go | Provides the list of products from a JSON file and ability to search products and get individual products. | +| [currencyservice](./src/currencyservice) | Node.js | Converts one money amount to another currency. Uses real values fetched from European Central Bank. It's the highest QPS service. | +| [paymentservice](./src/paymentservice) | Node.js | Charges the given credit card info (mock) with the given amount and returns a transaction ID. | +| [shippingservice](./src/shippingservice) | Go | Gives shipping cost estimates based on the shopping cart. Ships items to the given address (mock) | +| [emailservice](./src/emailservice) | Python | Sends users an order confirmation email (mock). | +| [checkoutservice](./src/checkoutservice) | Go | Retrieves user cart, prepares order and orchestrates the payment, shipping and the email notification. | +| [recommendationservice](./src/recommendationservice) | Python | Recommends other products based on what's given in the cart. | +| [adservice](./src/adservice) | Java | Provides text ads based on given context words. | +| [loadgenerator](./src/loadgenerator) | Python/Locust | Continuously sends requests imitating realistic user shopping flows to the frontend. | ## Features @@ -84,7 +83,6 @@ We offer three installation methods: option, you will use pre-built container images that are available publicly, instead of building them yourself, which takes a long time). - ### Option 1: Running locally with “Docker for Desktop” > 💡 Recommended if you're planning to develop the application or giving it a @@ -99,16 +97,17 @@ We offer three installation methods: (ensure version ≥v0.20) 1. Launch “Docker for Desktop”. Go to Preferences: + - choose “Enable Kubernetes”, - set CPUs to at least 3, and Memory to at least 6.0 GiB -3. Run `kubectl get nodes` to verify you're connected to “Kubernetes on Docker”. +1. Run `kubectl get nodes` to verify you're connected to “Kubernetes on Docker”. -4. Run `skaffold run` (first time will be slow, it can take ~20 minutes). +1. Run `skaffold run` (first time will be slow, it can take ~20 minutes). This will build and deploy the application. If you need to rebuild the images automatically as you refactor the code, run `skaffold dev` command. -5. Run `kubectl get pods` to verify the Pods are ready and running. The +1. Run `kubectl get pods` to verify the Pods are ready and running. The application frontend should be available at http://localhost:80 on your machine. @@ -117,40 +116,50 @@ We offer three installation methods: > 💡 Recommended if you're using Google Cloud Platform and want to try it on > a realistic cluster. -1. Install tools specified in the previous section (Docker, kubectl, skaffold) +1. Install tools specified in the previous section (Docker, kubectl, skaffold) -1. Create a Google Kubernetes Engine cluster and make sure `kubectl` is pointing - to the cluster. +1. Create a Google Kubernetes Engine cluster and make sure `kubectl` is pointing + to the cluster. - gcloud services enable container.googleapis.com + ```sh + gcloud services enable container.googleapis.com + ``` - gcloud container clusters create demo --enable-autoupgrade \ - --enable-autoscaling --min-nodes=3 --max-nodes=10 --num-nodes=5 --zone=us-central1-a + ```sh + gcloud container clusters create demo --enable-autoupgrade \ + --enable-autoscaling --min-nodes=3 --max-nodes=10 --num-nodes=5 --zone=us-central1-a + ``` - kubectl get nodes + ``` + kubectl get nodes + ``` -1. Enable Google Container Registry (GCR) on your GCP project and configure the - `docker` CLI to authenticate to GCR: +1. Enable Google Container Registry (GCR) on your GCP project and configure the + `docker` CLI to authenticate to GCR: - gcloud services enable containerregistry.googleapis.com + ```sh + gcloud services enable containerregistry.googleapis.com + ``` - gcloud auth configure-docker -q + ```sh + gcloud auth configure-docker -q + ``` -1. In the root of this repository, run `skaffold run --default-repo=gcr.io/[PROJECT_ID]`, - where [PROJECT_ID] is your GCP project ID. +1. In the root of this repository, run `skaffold run --default-repo=gcr.io/[PROJECT_ID]`, + where [PROJECT_ID] is your GCP project ID. - This command: + This command: - - builds the container images - - pushes them to GCR - - applies the `./kubernetes-manifests` deploying the application to - Kubernetes. + - builds the container images + - pushes them to GCR + - applies the `./kubernetes-manifests` deploying the application to + Kubernetes. - **Troubleshooting:** If you get "No space left on device" error on Google - Cloud Shell, you can build the images on Google Cloud Build: [Enable the - Cloud Build - API](https://console.cloud.google.com/flows/enableapi?apiid=cloudbuild.googleapis.com), - then run `skaffold run -p gcb --default-repo=gcr.io/[PROJECT_ID]` instead. + **Troubleshooting:** If you get "No space left on device" error on Google + Cloud Shell, you can build the images on Google Cloud Build: [Enable the + Cloud Build + API](https://console.cloud.google.com/flows/enableapi?apiid=cloudbuild.googleapis.com), + then run `skaffold run -p gcb --default-repo=gcr.io/[PROJECT_ID]` instead. 1. Find the IP address of your application, then visit the application on your browser to confirm installation. @@ -180,10 +189,11 @@ by deploying the [release manifest](./release) directly to an existing cluster. 1. Run `kubectl apply -f ./release/kubernetes-manifests` to deploy the app. 1. Run `kubectl get pods` to see pods are in a Ready state. 1. Find the IP address of your application, then visit the application on your - browser to confirm installation. - - kubectl get service/frontend-external + browser to confirm installation. + ```sh + kubectl get service/frontend-external + ``` ### (Optional) Deploying on a Istio-installed GKE cluster @@ -192,13 +202,15 @@ by deploying the [release manifest](./release) directly to an existing cluster. 1. Create a GKE cluster (described in "Option 2"). -2. Use [Istio on GKE add-on](https://cloud.google.com/istio/docs/istio-on-gke/installing) +1. Use [Istio on GKE add-on](https://cloud.google.com/istio/docs/istio-on-gke/installing) to install Istio to your existing GKE cluster. - gcloud beta container clusters update demo \ - --zone=us-central1-a \ - --update-addons=Istio=ENABLED \ - --istio-config=auth=MTLS_PERMISSIVE + ```sh + gcloud beta container clusters update demo \ + --zone=us-central1-a \ + --update-addons=Istio=ENABLED \ + --istio-config=auth=MTLS_PERMISSIVE + ``` > NOTE: If you need to enable `MTLS_STRICT` mode, you will need to update > several manifest files: @@ -207,43 +219,50 @@ by deploying the [release manifest](./release) directly to an existing cluster. > "readinessProbe" fields. > - `kubernetes-manifests/loadgenerator.yaml`: delete "initContainers" field. -3. (Optional) Enable Stackdriver Tracing/Logging with Istio Stackdriver Adapter +1. (Optional) Enable Stackdriver Tracing/Logging with Istio Stackdriver Adapter by [following this guide](https://cloud.google.com/istio/docs/istio-on-gke/installing#enabling_tracing_and_logging). -4. Install the automatic sidecar injection (annotate the `default` namespace +1. Install the automatic sidecar injection (annotate the `default` namespace with the label): - kubectl label namespace default istio-injection=enabled + ```sh + kubectl label namespace default istio-injection=enabled + ``` -5. Apply the manifests in [`./istio-manifests`](./istio-manifests) directory. +1. Apply the manifests in [`./istio-manifests`](./istio-manifests) directory. + (This is required only once.) - kubectl apply -f ./istio-manifests + ```sh + kubectl apply -f ./istio-manifests + ``` - This is required only once. +1. Deploy the application with `skaffold run --default-repo=gcr.io/[PROJECT_ID]`. -6. Deploy the application with `skaffold run --default-repo=gcr.io/[PROJECT_ID]`. +1. Run `kubectl get pods` to see pods are in a healthy and ready state. -7. Run `kubectl get pods` to see pods are in a healthy and ready state. - -8. Find the IP address of your istio gateway Ingress or Service, and visit the +1. Find the IP address of your Istio gateway Ingress or Service, and visit the application. - INGRESS_HOST="$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')" + ```sh + INGRESS_HOST="$(kubectl -n istio-system get service istio-ingressgateway \ + -o jsonpath='{.status.loadBalancer.ingress[0].ip}')" + echo "$INGRESS_HOST" + ``` - echo "$INGRESS_HOST" - - curl -v "http://$INGRESS_HOST" + ```sh + curl -v "http://$INGRESS_HOST" + ``` ## Conferences featuring Hipster Shop - [Google Cloud Next'18 London – Keynote](https://youtu.be/nIq2pkNcfEI?t=3071) showing Stackdriver Incident Response Management - Google Cloud Next'18 SF - - [Day 1 Keynote](https://youtu.be/vJ9OaAqfxo4?t=2416) showing GKE On-Prem + - [Day 1 Keynote](https://youtu.be/vJ9OaAqfxo4?t=2416) showing GKE On-Prem - [Day 3 – Keynote](https://youtu.be/JQPOPV_VH5w?t=815) showing Stackdriver APM (Tracing, Code Search, Profiler, Google Cloud Build) - [Introduction to Service Management with Istio](https://www.youtube.com/watch?v=wCJrdKdD6UM&feature=youtu.be&t=586) --- -This is not an official Google project. +This is not an official Google project.