to create microservices faster, you need a backbone. This boilerplate prepared to practise core microservice concepts like:
- cloud-native
- stateless on K8s
- state-full on GCP PaaS (not on K8s)
- REST maturity (L2)
- naming conventions
- actuator (/health)
- error-handling
- logging
- general {Slf4j}
- message format standardization
- distributed-tracing {sleuth}
- monitoring
- api-management
- message-converter (such as text2json and vice versa)
- security
- profiles (dev, test, prod)
- logical boundaries (separating dbs)
- caching
- L2 {JCache | Ehcache}
- rest-template {Feign}
- api-gateway {zuul}
- load-balancing {ribbon}
- fallbacks {hystrix}
- config-server {spring}
- service-discovery {eureka}
- event-sourcing
- CQRS (separate read and write queries)
- Requirements (openjdk 11, docker, k8s)
- spring boot 2.4.x, gradle 6.7, Lombok 1.18, log4j 2.x, Ehcache 3.x, junit 5.x
- project name for a real service will take place below!
- intellij top-level: product-service
- package name: com.backbone.core
- gradle's project name: product-service
- jar name: build/libs/product-service-0.0.1-SNAPSHOT.jar
- deployment name in k8s: product-service
- url format: /product/1 or /products
- Product, Review ... as Entity
- ProductRepository
- ProductService (as JPA cache layer or call APIs)
- ProductController (as REST APIs)
- ProductService (as JPA cache layer or call APIs)
on IDE,
mkdir microservice-backbone-boilerplate && cd microservice-backbone-boilerplate
thengit clone https://github.com/tansudasli/product-service-h2.git && cd product-service-h2
- to Run the application
./gradlew wrapper
to download necessary wrappers. Then./gradlew bootRun
to start,./gradlew bootJar
to create jar lib, and run w/java -jar build/libs/*.jar
- to test run
curl localhost:8080
curl localhost:8080/dummy
orcurl localhost:8080/dummy/name
curl localhost:8080/products
orcurl localhost:8080/products/10
- to access h2-db check
localhost:8080/h2
w/ conn.jdbc:h2:mem:products
on Kubernetes,
- Create GKE cluster by following in Readme.md.
- Prepare and deploy docker images to GCP
- Edit
gradle.properties
- Run
./gradlew dockerTag
. Test w/docker images
thendocker run -d -p 8080:8080 IMAGE_NAME:TAG
- Run
./gradlew dockerPushGCP
- Edit
- Deploy app. to GKE cluster.
- Run
./deploy.sh
to deploy w/ .yaml files - to test, run
kubectl get services
and get EXTERNAL-IP thencurl EXTERNAL-IP:8080
to test.
- Run
an abstract representation of a micro service
a more realistic scenario w/ data pipelines