Project này triển khai hệ thống microservice sau:
Sau khi chạy docker-compose up -d
- Dashboard cho keylock: http://localhost:8181/
- Service Discovery dardboard: http://localhost:8761/
- Distributed Tracing dashboard: http://localhost:9411/zipkin/
- Health check của order-service: http://localhost:8081/actuator
Outline project
- Produce Servece
- Order Service
- Service Discovery
- API gateway
- Distributed tracing
- Message Queue
Cụ thể gồm các phần sau
1 Product service:
Dùng cho việc truy vấn các sản phẩm mà hệ thống có hay không?
- Dùng mongodb cho việc get dữ liệu nhiều mà hầu như không có thao tác chỉnh sửa
- không có user/pass, nếu các bạn thích cấu hình security cho mongodb có thể tham khảo spring boot with mongodb, mình đã làm
- Dùng MongoCompass GUI để thao thác với mongodb
2 Order service:
Thực hiện order sản phẩm, frontend sẽ gọi nó
- database: postgresql, mình chuyển từ mysql sang postgresql
- user/pass: root/root
- database: order-service
2.1 Communication between services
- Mình dùng webflux vì nó hỗ trợ sync và async, các bạn có thể dùng restemplate(theo mình biết nó chỉ hỗ trợ sync call)
3 Service Discover using Netflix Eureka của Spring Cloud
Về cạch cấu hình các bạn xem ở application.properties Thằng cha sẽ có
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
Thằng con:
eureka.client.serviceUrl.defaultZone=http://eureka:password@localhost:8761/eureka
eureka.client.fetch-registry=true
eureka.client.register-with-eureka=true
eureka.instance.prefer-ip-address=true
4 API GATEWAY
Mục đích là để route request từ bên ngoài vào hệ thống, mình dùng Spring Cloud Gateway của Sring Cloud, nó cũng có hỗ trợ Circui Breaker, Load Balancer,...
4.1 Authen Service tại API GATEWAY
Mình dùng Keycloak, vì mình đã cấu hình sẵn realm ở thư mục realms, các bạn có thể truy cập vào dashboard của Keycloak để setup rồi export ra file để dùng cho chạy lần sau không phải tạo lại nữa
4.2 Circuit Breaker
Đây là một pattern để ngắt một quá trình khi hệ thống gặp sự cố, khi số lượng requests đột ngột tăng cao thì hệ thông không bị chết, ở đây mình dùng Resilient4J
Nó gồm 3 trạng thái normal và 2 trạng thái đặc biệt, ở project này mình chỉ cần dùng 3 trạng thái normal: closed, open, half open
- Closed: khi hệ thống hoạt động bình thường thì circuit state là closed
- Open: khi hệ thống có vấn đề, ví dụ khi order service gọi inventory service, đợi mãi mà không thấy phản hồi thì trạng thái của nó là open
- Half open: trạng thái trung gian để gọi inventory sau một khoảng duration time, nếu ok thì chuyển về closed, nếu không ok thì lại chuyển về open Chi tiết về cấu hình, các bạn xem ở application.properties của order service
5 Distributed tracing
Để quản lý hành trình của request, biết nó có lỗi ở đâu mà thời gian ở đoạn nào chiểm nhiều Ví dụ:
6 Message Queue
Mình dùng kafka, ngoài ra các bạn có thể dùng RabbitMQ, ở đây mình triển khai đơn giản nên chưa có nhiều sự khác biệt, mình cũng không có nhiều kinh nghiệm về cái này, chỉ đơn giản là log event, khi order thành công sẽ produce một message đến broker và inventory service sẽ consume nó, ở đây các bạn hoàn toàn có thể gửi email hoặc tin nhắn đến điện thoại,...
7 Nên làm
Nếu cảm thấy hữu ích đừng ngần ngại gửi tặng tôi một ngôi sao (star) để tôi có động lực hơn hoàn thành những giáo án chất lượng, cám ơn các bạn rất nhiều.