Skip to content

Latest commit

 

History

History
executable file
·
364 lines (243 loc) · 12.7 KB

README.md

File metadata and controls

executable file
·
364 lines (243 loc) · 12.7 KB

Microservice Architecture with Multiple Languages

Build Status codecov

The idea for this project is to show a case for applying Microservice Architecture using multiple languages.

Most all services are built in Java with Spring Boot 2 + Webflux + MongoDB but there are other services using NodeJS, Kotlin, Python and Go.

The web application is using React and a beta version using JHipster.

Feel free to create a new microservice using a different language(Ruby?, C#?), just please following the minimal requirements:

  • Create a new folder on root and put your code
  • Add a minimal documentation
  • Add a Rest API
  • Add JWT Validation
  • Add Tests
  • Add Dockerfile
  • Add MongoDB or some other NoSql
  • Add Consul Client(if possible)

PS: A better approach would be a microservice per repository but for simplicity all microservices are in the same repo.

If you want to contribute please check TODO List.

Inspired by the book Microservices Patterns(Chris Richardson - @crichardson).

Contents

  1. Microservice Patterns
  2. Prerequisites
  3. Microservice Diagram
  4. Installing all services using Docker Compose
  5. Docker Commands
  6. Manual Installation - NOT RECOMMENDED
  7. Accessing React Web App
  8. List of default users
  9. Kubernetes - Google Cloud Platform
  10. Travis CI/CD
  11. Github Actions CI/CD
  12. TODO List
  13. References
  14. Postman Collection

Microservice Patterns

The following list of Microservice Patterns was applied so far.

To know more about each pattern look at Microservice Architecture

Prerequisites

  • JDK 1.8
  • Maven 3
  • Docker 17.05.0-ce+ - Not necessary but recommended otherwise the services should run by command
  • Docker Compose 1.23.2 - Not necessary but recommended otherwise the services should run by command

Microservice Diagram

Microservice Architecture

Installing All Services using Docker Compose

The easiest way to run all microservices is using docker-compose, run the following commands:

On root folder first need to generate the docker images.

# at once for building the docker images
mvn clean install jib:dockerBuild

On docker folder run all microservices

docker-compose up -d

Docker Commands

To see logs for a specific docker container:

docker logs -f SERVICE_NAME

PS: Service names are on docker-compose.yml -> container_name

To execute a command inside the container:

docker exec -it week-menu-api sh

To stop and remove all containers:

docker-compose down -v

To restart/start/stop/remove specific container:

docker-compose restart SERVICE_NAME
docker-compose up SERVICE_NAME
docker-compose stop SERVICE_NAME
docker-compose rm SERVICE_NAME

Manual Installation - NOT RECOMMENDED

If for some reason you cannot install docker/docker-compose you can run all services manually using the following command for Java applications.

mvn spring-boot:run -Dspring-boot.run.arguments="--server.port={PORT}"

To run NodeJS and React applications on folders nodejs-service and react-webapp:

sudo npm install

sudo npm start

Accessing React App

To access React Web App.

React1 React2

Default Users

Following the list of default users:

admin@gmail.com/password - ROLE_ADMIN

master@gmail.com/password123 - ROLE_PERSON_CREATE, ROLE_PERSON_READ, ROLE_PERSON_SAVE

anonymous@gmail.com/test - ROLE_PERSON_READ

Kubernetes - Google Cloud Platform

The code is deployed at Google Cloud Platform, to access it go through https://spendingbetter.com.

Following useful commands for kubernetes

Installation

#helm create ingress - RBAC enabled
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
helm init --service-account tiller
helm list
helm init --tiller-tls-verify
helm init
kubectl get deployments -n kube-system
helm install --name nginx-ingress stable/nginx-ingress --set rbac.create=true --set controller.publishService.enabled=true

#helm list
helm list

#create tls
kubectl create secret tls ingress-tls --cert /etc/sslmate/www.spendingbetter.com.chained.crt --key /etc/sslmate/www.spendingbetter.com.key

#create generic certs
kubectl create secret generic spendingbetter-p12 --from-file=/etc/sslmate/www.spendingbetter.com.p12
kubectl create secret generic spendingbetter-crt --from-file=/etc/sslmate/www.spendingbetter.com.crt
kubectl create secret generic spendingbetter-jks --from-file=/etc/sslmate/www.spendingbetter.com.jks

#list certs
kubectl get secrets

#list specific cert
kubectl describe secret ingress-tls

#show ingress
kubectl get ing
kubectl describe ingress


# Istio
# Get Grafana Configuration
kubectl get service grafana --namespace istio-system -o yaml

# Update Grafana Configuration
kubectl edit service grafana --namespace istio-system

Deployment

cd kubernetes

#create docker image
docker tag eureka-server:latest eu.gcr.io/spring-boot-gke-243520/eureka-server:4.0
docker tag docker_react-webapp:latest eu.gcr.io/spring-boot-gke-243520/react-webapp:6.0

#push docker image
docker push eu.gcr.io/spring-boot-gke-243520/eureka-server:4.0
docker push eu.gcr.io/spring-boot-gke-243520/react-webapp:6.0

#Deploy
kubectl apply -f deployment-admin-server.yml

#Undeploy
kubectl delete -f deployment-admin-server.yml

#see logs
kubectl logs admin-server-XXXXX -f

#exec command
kubectl exec -it redis-5b4699dd74-qckm9 -- sh

#show all pods
kubectl get pods --show-labels

#create config map
kubectl create configmap prometheus --from-file=../docker/prometheus-prod.yml

kubectl create configmap grafana-dashboard --from-file=../docker/create-datasource-and-dashboard.sh

kubectl create configmap grafana-datasource --from-file=../docker/grafana-datasource.yaml

#port forward
kubectl port-forward $(kubectl get pod --selector="app=eureka-server" --output jsonpath='{.items[0].metadata.name}') 8761:8761

#delete specific ingress
kubectl delete ingress ingress-gateway-forward-https

#cpu usage
kubectl get nodes --show-labels
kubectl describe nodes gke-your-first-cluster
kubectl top nodes

Enable Ingress

Example Ingress Configuration

Install Helm

Kubernetes + Zuul

Example Spring Boot 2 + Kubernetes + Zuul

Secure Discovery Example

Travis CI/CD

Used travis-ci for building pull requests only.

Github Actions CI/CD

Using GitHub Actions for deploying services into Google Cloud/GKE.

More details of look at .github/workflows/gke-deploy-* for each microservice.

Configuration for Kubernetes was moved to .github/workflows/kubernetes.

Swagger UI

Swagger UI is available for Authentication, Person and User Services

Access it Swagger UI - http://localhost:{SERVICE_PORT}/swagger-ui.html

TODO List

  • Java - Split Person and User in different entities
  • Java - Split back-end and front-end in two different folders
  • Java - Split Java 8 Learning in another folder
  • Java - Add Test for Users Classes
  • Java - Add Spring Cloud Config
  • Java - Add Service Discovery(Eureka)
  • Java - Add Zuul(Gateway)
  • Java - Add Maven Docker Plugin
  • Java - Add Redis for Shared Session between applications
  • Java - Add Authentication for all applications
  • Java - Add Prometheus/Grafana for docker compose
  • Java - Add Oauth2 Security layer
  • Java - Fix Zuul/Edge Server for working with NodeJS Service
  • Kotlin - Add Service using Kotlin Language
  • Quarkus - Add Service using Quarkus framework
  • Scala - Add Service using Scala Language
  • C# - Add Service using C# Language
  • Go - Add Service using Go Language
  • React - Create User List
  • React - Create User Page
  • React - Create User Edit
  • React - Create Categories Edit
  • React - Create Recipes Edit
  • React - Fix User Create/Edit
  • React - Fix Person Create/Edit
  • React - Fix Person List to work with @Tailable and EventSource.
  • React - Fix Docker Web App to use Nginx
  • Kubernetes/Minikube - Add example to use Kubernetes with Minikube
  • Deploy - Google Cloud/GKE
  • CI/CD - Add Travis
  • CI/CD - - Add Herokuy
  • CI/CD - Add GitHub Actions for deploy in GCP
  • Add documentation for libraries used
  • Add documentation/how-to for each language
  • Add tests for Python
  • Add React Legacy
  • Rename /api/persons to /api/people
  • Replace Eureka/Spring Config Server to Consul

References

Pattern Microservice Architecture

Spring Guide

Spring Boot

React ad Spring WebFlux

Spring WebFlux Security Jwt

Junit 5

Keytool Commands

Spring Boot Kotlin Example

Istio with SDS - Manual Instalation

Istio on GKE

Istio Gateway

Automatic Deployment using Travis and GKE

Microprofile with Metrics

Go with MongoDB

Go Echo Rest Api

Go Tutorial

Go Consul