This project is created to get experience on Microservices With Netflix OSS. This is a simple project by coded imperative programming with simple business requirements.
ELK Stack has been integrated for monitoring since version 1.1.0.
- Accounts : This microservice is responsible for managing accounts. An account could be buyer, seller or an backoffice account but there is only buyer account.
- Products : This microservice is responsible for managing products.
- Orders : This microservice is responsible for managing orders. It doesn't know anything about account and product except id.
- Backoffice: This microservice is provides endpoints for backoffice ui.
Backoffice microservice has an endpoint with path "/api/v1/backoffice/orders". This endpoint return a list of orders with name of product and account. It connects accounts, products and orders microservices via Feign.
Service | EndPoint | Port | Method | Description |
---|---|---|---|---|
Accounts | /api/v1/accounts/{id} | 7500 | GET | Return detail of specified account |
Accounts | /api/v1/accounts | 7500 | GET | Return details of all acounts |
Products | /api/v1/products/{id} | 7501 | GET | Return detail of specified product |
Products | /api/v1/products | 7501 | GET | Return details of all products |
Orders | /api/v1/orders/{id} | 7502 | GET | Return detail of order |
Orders | /api/v1/orders | 7502 | GET | Return details of orders |
Backoffice | /api/v1/backoffice/orders | 7503 | GET | Return orders with product name and account name |
Service | EndPoint |
---|---|
Accounts | /account/api/v1/accounts/{id} |
Accounts | /account/api/v1/accounts |
Products | /product/api/v1/products/{id} |
Products | /product/api/v1/products |
Orders | /order/api/v1/orders/{id} |
Orders | /order/api/v1/orders |
Backoffice | /backoffice/api/v1/backoffice/orders |
URI for gateway : http://localhost:8762
- Netflix Eureka is used for discovery service.
- Netflix Ribbon is used for client side load-balancing.
- Netflix Zuul is used for gateway.
- Sleuth and Zipkin
You can open Zipkin : http://localhost:9411
- ElasticSearch is on 6972 port
- Logstash TCP is on 5000 port
- Kibana is on 5601 port
Open kibana with http://localhost:5601/. You must define an index pattern (taner-*) on Management/Stack Management.
You can open Grafana : http://localhost:3000/ Predefined dashboard : http://localhost:3000/d/dLsDQIUnzb/spring-boot-observability?orgId=1&refresh=5s
Grafana has loki for log aggregation and tempo for distributed tracing backend.
- >mvn clean package : to build
- >docker-compose up --build : build docker images and containers and run containers
- >docker-compose stop : stop the dockerized services
- Each maven module has a Dockerfile.
In docker-compose.yml file:
- Accounts Service : 2222 port is mapped to 7500 port of host
- Products Service : 2222 port is mapped to 7501 port of host
- Orders Service : 2222 port is mapped to 7502 port of host
- Backoffice Service : 2222 port is mapped to 7503 port of host
- Eureka Discovery Service : 8761 port is mapped to 8761 port of host
- Spring Boot (/ Zuul) Gateway Service : 8762 port is mapped to 8762 port of host
-
kubectl create -f containerized-accounts/k8n/deployment.yml
-
kubectl create -f containerized-accounts/k8n/service.yml
-
kubectl port-forward svc/containerized-accounts 7500:7500
-
curl localhost:7500/account/api/v1/accounts
-
kubectl create -f containerized-products/k8n/deployment.yml
-
kubectl create -f containerized-products/k8n/service.yml
-
kubectl port-forward svc/containerized-products 7501:7501
-
kubectl create -f containerized-orders/k8n/deployment.yml
-
kubectl create -f containerized-orders/k8n/service.yml
-
kubectl port-forward svc/containerized-orders 7502:7502
-
curl localhost:7502/order/api/v1/orders
-
kubectl create -f containerized-main/k8n/deployment.yml
-
kubectl create -f containerized-main/k8n/service.yml
-
kubectl port-forward svc/containerized-main 7503:7503
-
curl localhost:7503/backoffice/api/v1/backoffice/orders
-
kubectl create -f containerized-discovery/k8n/deployment.yml
-
kubectl create -f containerized-discovery/k8n/service.yml
-
kubectl port-forward svc/discovery 8761:8761
-
kubectl create -f containerized-gateway/k8n/deployment.yml
-
kubectl create -f containerized-gateway/k8n/service.yml
-
kubectl port-forward svc/gateway 8762:8762
-
curl localhost:8762/backoffice/api/v1/backoffice/orders
-
feign-micrometer dependency and Capability bean added to send trace-id on resttemplate calls
@Bean public Capability capability(final MeterRegistry registry) { return new MicrometerCapability(registry); } <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-micrometer</artifactId> </dependency>
-
micrometer-tracing-bridge-brave added to generate trace-id and span-id
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency>
-
Integrate Grafana OSS : Grafana, Loki, Tempo
- Update Spring-Boot version to 3.2.1
- Start to use micrometer tracing
- Zipkin will be replaced by Grafana
- Add kubernetes yaml files (still using Eureka discovery)
- Update Spring Boot version to 2.5.1
- Switch to Spring Boot Gateway
- Sleuth and Zipkin Integration
- Making some refactorings
- Lombok Integration
- ElasticSearch, Kibana, Logstash integration
- Spring-Boot 2.3.1.RELEASE
- Java 11
- Docker Image updated
- Spring-Cloud artifacts have been changed
- Open Feign integrated
- Spring-Boot 2.0.2.RELEASE
- Java 8
- ![RestTemplate & Micrometer & OpenFeign (https://www.appsdeveloperblog.com/micrometer-and-zipkin-in-spring-boot/#google_vignette)]