1. Tìm hiểu về Consul
Consul là một nền tảng mã nguồn mở do HashiCorp phát triển bằng ngôn ngữ Go, chuyên cung cấp khả năng phát hiện dịch vụ phân tán (service discovery) và quản lý cấu hình tập trung. Hệ thống này tích hợp sẵn nhiều tính năng như đăng ký dịch vụ, health checking, key/value store, và cơ chế lựa chọn dịch vụ. Bạn có thể sử dụng từng thành phần riêng lẻ hoặc kết hợp chúng để xây dựng một service mesh hoàn chỉnh, giúp đơn giản hóa việc giao tiếp giữa các microservices.
2. Cài đặt và khởi chạy Consul
Truy cập trang tải xuống chính thức để lấy phiên bản phù hợp với hệ điều hành. Sau khi giải nén, bạn có thể kiểm tra bằng lệnh:
consul --version
Để chạy ở chế độ phát triển (dev mode), sử dụng:
consul agent -dev
Sau khi khởi động thành công, giao diện web quản lý Consul có thể truy cập tại http://localhost:8500. Tài liệu chi tiết có tại HashiCorp Learn và Spring Cloud Consul.
3. Xây dựng Provider Service tích hợp Consul
Dưới đây là ví dụ tạo một service có tên payment-consul-service, đóng vai trò nhà cung cấp dữ liệu và tự động đăng ký vào Consul.
3.1. File cấu hình Maven (pom.xml)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- Các dependency khác như web, actuator... được bổ sung tùy dự án -->
3.2. Cấu hình application.yml
server:
port: 9001
spring:
application:
name: payment-consul-service
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
health-check-path: /actuator/health
health-check-interval: 10s
3.3. Lớp khởi động chính
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentConsulProviderApp {
public static void main(String[] args) {
SpringApplication.run(PaymentConsulProviderApp.class, args);
}
}
Với các phiên bản Spring Cloud mới, bạn có thể bỏ qua @EnableDiscoveryClient nhưng giữ lại sẽ giúp code tường minh hơn.
4. Xây dựng Consumer Service gọi qua Consul
Service bên gọi sẽ sử dụng RestTemplate kết hợp @LoadBalanced để truy xuất địa chỉ của provider thông qua tên logic đã đăng ký.
4.1. Cấu hình application.yml cho Consumer
server:
port: 8081
spring:
application:
name: order-consul-consumer
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
4.2. Cấu hình Bean RestTemplate
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4.3. Lớp Controller gọi Provider
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/pay")
public String pay() {
return restTemplate.getForObject(
"http://payment-consul-service/payment/pay", String.class);
}
}
Lưu ý: spring-cloud-starter-consul-discovery đã tự động kéo theo spring-cloud-starter-loadbalance, do đó khả năng cân bằng tải phía client được kích hoạt sẵn.
5. Lý thuyết CAP trong hệ phân tán
Định lý CAP chỉ ra rằng một hệ thống phân tán không thể đồng thời đảm bảo hoàn hảo cả ba yếu tố: Tính nhất quán (Consistency - C), Tính sẵn sàng (Availability - A) và Dung sai phân vùng (Partition Tolerance - P). Thực tế, với mô hình phân tán, P bắt buộc phải có, do đó các hệ thống thường rơi vào hai nhánh:
- CP: nhất quán và chịu lỗi phân vùng, nhưng có thể từ chối yêu cầu khi mất liên lạc giữa các node (hi sinh A).
- AP: sẵn sàng và chịu lỗi phân vùng, chấp nhận trả về dữ liệu có thể chưa được đồng bộ hoàn toàn (hi sinh C).
6. So sánh Eureka, Zookeeper và Consul
| Tiêu chí | Eureka | Zookeeper | Consul |
|---|---|---|---|
| Ngôn ngữ | Java | Java | Go |
| Mô hình CAP | AP | CP | CP |
| Kiểm tra sức khỏe | Có (hỗ trợ cấu hình) | Có (qua keep-alive) | Có (nhiều hình thức: HTTP/TCP/Script) |
| Giao thức truy cập | HTTP | TCP (ZAB) | HTTP / DNS |
| Tích hợp Spring Cloud | Có | Có | Có |
| Đặc điểm nổi bật | Cơ chế tự bảo vệ: nếu trong 15 phút có trên 85% client không gửi heartbeat, server vào chế độ self-preservation – không loại bỏ instance nào, ưu tiên tính sẵn sàng. | Bầu chọn leader thông qua giao thức ZAB, đảm bảo nhất quán mạnh nhưng có thể ngừng phục vụ khi mất quá bán số phiếu. | Hỗ trợ health check chủ động, key/value store, và có thể hoạt động như DNS server cho service discovery. |