goTempM

Lint

goTempM is a full stack Golang microservices sample application built on top of the Micro platform. Note that the original goTemp, which is built directly on the go-Micro framework, is still available and can be found in the goTemp repo. It is worth noting that Micro itself uses go-Micro as its underlying framework.

In it current incarnation (this is wip), this mono-repo uses the following stack as backend:

In terms of the web front end, the stack is as follows:

As far as observability, the application uses:

Finally, for orchestration, the stack is as follows:

Below is a diagram that displays the overall setup of the application:

Diagram showing goTempM components

In a nutshell. the application functionality is as follows in the backend:

Starting the application

Note: At this time, starting multiple services in a row (which the startup scripts do) sometimes causes an error to be thrown. The details of the issue are described in issue 8. As such, portions of the startup scripts may have to be re-run manually to bring the application up fully.

goTempM landing page

Before running the application the first time:

    npm install

Running with the Micro Docker image

Prerequisites
Software

Running the app

To start the application:

   make microup

Depending on whether you have run the application before, docker may have to download all the dependent images (Micro, PostgreSql, TimescaleDB, Nodejs, etc). This may take a while depending on your internet connection speed. Once everything has been downloaded and started, you should see a message in the terminal indicating that the application is listening at localhost:3000. At that point, yo can open your browser and navigate to:

    http://localhost:3000

Additionally, observability tooling can be accessed at the addresses below

    Prometheus:  http://localhost:9090
    Grafana:     http://localhost:3001

To stop the application:

    make microdown

Running on Kubernetes (Minikube) using the Micro Helm chart

Prerequisites
Software
Ingress

The application front end connects with the API gateway using via a K8s ingress resource. As such, the ingress addon must be enabled in Minikube. To enabled it, run:

    minikube addons enable ingress

Check the ingress is working using the command below. The command's results should include an entry for the ingress.

    kubectl get pods -n kube-system
Building and pushing images (optional)

Out of the box, the Kubernetes manifest will pull existing Bolbeck goTemp images for the front end and some of the DBs from Docker Hub. You are welcome to change the Kubernetes manifests in the ./cicd/K8s folder to pull your own images. To build your own image of the front end and push it to docker hub run the command below for each of the services:

    make hubpushcontext SERVICE=web FOLDER=web

where serviceName is the name of the service for which the image should be built folderName is the folder that contains the docker file used to build the service image

Note that Micro will automagically create and deploy the containers for the different services

Running

Enable Port forwarding:

    kubectl port-forward svc/proxy -n micro 8081:443

Note that the application itself does not need this port forwarding, this is only needed so that we can send commands to Micro and start the app.

Start application by running:

    make microk8sup

Once the application is deployed, check the address and host assigned to the ingress:

    kubectl get ingress -n micro

Note that it takes a couple of minutes for K8s to assign the IP to the ingress. As such wait for that happens before moving ahead.

If this is the first time running the app in Minikube: Grab the address & the host from the result of the command above, and add it to your /etc/hosts file:

    <ipAddress> gotempm.tst

Finally, access app:

     minikube service web -n micro
Vault integration

The microservices can be integrated with Vault when running in K8s to manage their credentials. To enable this integration, please first refer to the README in the ./vault directory to setup Vault and all the microservices secrets. Once that is configured, and the application is running, just execute :

    make vkubpatchdeploy

Once that completes, the microservices' credentials to the different dependencies (DBs, brokers,etc ...) can be managed in Vault.

Observability

Observability tools access while the application is running in K8s (with or without Vault):

Stopping the application

to stop the application, execute:

    make microK8sdown

Note: The port forwarding to Micro should also be stopped. Also, if the Vault Integration is enabled, and the VAULT UI is enabled, then the associated port-forwarding should be stopped as well.

Running with Micro locally

Prerequisites

Software

Running

Start the micro server:

    micro server

Wait for the server to be up and ensure that you can access localhost:8080 before continuing to next step. Start the application:

    make microlocalup

Access the application in your browser at:

    http://localhost:3000

To stop the application, run:

    make microlocaldown

Repo organization

The project is organized in a way that each folder represents either a service, a database or a shared library package. Currently, we have the following:

Additionally, we have the following files in the root directory as well:

Services

We use Micro as the main GO microservices platform. Using Micro simplifies many of the tasks associated with building microservices including (but not limited to):

Organization

Each one of the services has a similar structure:

Running individual services
Starting the service

The services must be started using Micro run. Since we are using the Dockerized version of Micro, we can start a service as follows:

If Micro is not already running:

make microserveup

This will start Micro as well as all the DBs used by goTempM. Get into the Micro container, if not in it already:

docker exec -it microservercont bash

Start the service:

make micro<serviceName>

where can be usersrv, auditsrv, customersrv, productsrv or promotionsrv.

Testing the service

Note: all the commands below must be run within the Micro container

To run some data through a service once it is started, we can run the service client:

micro run --name <serviceClientName> <serviceFolder>/client

where can be usercli, auditcli, customercli, productcli or promotioncli. For example, we could start the user client as follows:

micro run --name usercli user/client

This will bring up run the client service which will attempt to create,update and delete a user. The results will be printed to the log. To see the logs, run:

micro logs -f <serviceOrClientName>

The server user service will update the DB as necessary and send the updated information to the broker (NATS) so that the audit service may eventually store it in the time series DB. The audit service can be started using:

make microauditsrv

Databases Initialization

The project initializes each of the DBs and seeds them with tables and data. Data changes made at run time are automatically persisted using mounted volumes when running via docker-compose. See the folders for each DB for details as well as the docker-compose file.

Web front end

Our web front end is built with Svelte and Sapper which have some interesting benefits:

Organization

The web application lives in the ./web folder. Since Sapper and Svelte generate multiple files and folders, we will just discuss the relevant folders below:

Routes

All of our main routes are pretty standard in terms of organization. We will use the customer route (./web/sapper/src/routes/customer) as an example:

There are three routes that do not share the structure above as they have very little functionality and thus are server by a single index.svelte component: root, register and login.

Kubernetes

The application configuration in K8s can be seen in the diagram below. Note that the diagram shows just one of the different microservices and its associated database. The configuration for all other microservices, beyond the shared ingress and API Gateway, is similar to the one depicted in the diagram. Note that Micro builds and spins out the service pods.

Diagram showing goTempM components

Notes:

Organization

The K8s files live in the ./cicd/K8s folder, and is organized as follows:

Note that within each of the folders, most related manifests are organized using a prefix. For example, all the front end related services start with the 'web' prefix.

Additional information:

Additional information can be found in the individual folders either in a readme.md or a doc.go file. Additionally, the Makefile contains many command samples that can be used for development.