Khái niệm cơ bản về Nacos
Nacos là nền tảng mã nguồn mở do Alibaba phát triển, cung cấp giải pháp tích hợp cho hệ thống vi dịch vụ với hai chức năng chính: trung tâm cấu hình và trung tâm đăng ký dịch vụ.
Chức năng chính
Trung tâm đăng ký dịch vụ
- Đăng ký dịch vụ: Dịch vụ cung cấp thông tin về bản thân đến Nacos
- Theo dõi dịch vụ: Dịch vụ tiêu dùng lấy danh sách máy chủ từ Nacos
- Thông báo thay đổi: Tự động cập nhật khi có sự thay đổi trong danh sách máy chủ
- Chính sách định tuyến: Phân phối yêu cầu dựa trên quy tắc định tuyến
- Kiểm tra sức khỏe: Giám sát trạng thái hoạt động của các máy chủ
Trung tâm cấu hình
- Quản lý tập trung: Thao tác CRUD trên các cấu hình
- Theo dõi thời gian thực: Cập nhật tự động khi cấu hình thay đổi
- Triển khai từng phần: Áp dụng cấu hình mới cho nhóm máy chủ chọn lọc
- Lưu bản sao: Sử dụng cấu hình cục bộ khi máy chủ không khả dụng
Thành phần cốt lõi
Không gian tên (Namespace): Phân tách môi trường (dev/staging/prod). Namespace mặc định là public.
Nhóm (Group): Phân loại cấu hình theo ứng dụng. Namespace + Group + Data ID tạo định danh duy nhất.
Dữ liệu cấu hình (Data ID): Tên tập cấu hình (ví dụ: cauhinh-csdl.properties).
Trọng số (Weight): Điều chỉnh tỷ lệ lưu lượng đến từng máy chủ (giá trị float).
Ngưỡng bảo vệ: Tỷ lệ tối thiểu máy chủ khỏe mạnh (0.0-1.0) để tránh sụp đổ hệ thống.
Thực thi với Nacos
API cốt lõi
| Chức năng | Phương thức | Endpoint |
|---|---|---|
| Đăng ký dịch vụ | POST | /nacos/v1/ns/instance |
| Lấy cấu hình | GET | /nacos/v1/cs/configs |
| Gửi nhịp tim | PUT | /nacos/v1/ns/instance/beat |
| Tạo không gian tên | POST | /nacos/v1/console/namespaces |
Tích hợp với Java
Thêm phụ thuộc Maven:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.3</version>
</dependency>
Quản lý cấu hình
public class CauHinhManager {
public static void main(String[] args) throws NacosException {
String diaChiMayChu = "localhost:8848";
QuanLyCauHinh qlch = NacosFactory.taoQuanLyCauHinh(diaChiMayChu);
String idDuLieu = "cauhinh-csdl";
String nhom = "ungdung-core";
// Đăng tải cấu hình
String noiDung = "database.url=jdbc:mysql://localhost:3306/app";
qlch.dangTaiCauHinh(idDuLieu, nhom, noiDung);
// Lấy cấu hình
String cauHinh = qlch.layCauHinh(idDuLieu, nhom, 3000);
// Thiết lập theo dõi
qlch.themTheoDoi(idDuLieu, nhom, new TheodoiCauHinh() {
@Override
public void nhanThongBao(String thongBao) {
System.out.println("Cập nhật cấu hình: " + thongBao);
}
});
}
}
Quản lý dịch vụ
public class DichVuManager {
public static void main(String[] args) throws NacosException {
String diaChiNacos = "localhost:8848";
QuanLyDichVu qldv = NacosFactory.taoQuanLyDichVu(diaChiNacos);
// Đăng ký dịch vụ
qldv.dangKyDichVu("dichvu-khachhang", "localhost", 8081);
// Lấy danh sách máy chủ
List<MayChu> danhSach = qldv.layDanhSachKhaDung("dichvu-khachhang");
// Thiết lập theo dõi thay đổi
qldv.theoDoiDichVu("dichvu-khachhang", new SuKienTheoDoi() {
@Override
public void xuLy(SuKien suKien) {
if (suKien instanceof ThayDoiDichVu) {
System.out.println("Dịch vụ thay đổi!");
}
}
});
}
}
Tích hợp với Spring Boot
Thêm cấu hình trong application.properties:
nacos.config.server-addr=localhost:8848
nacos.config.namespace=dev-environment
Sử dụng chú thích trong lớp khởi động:
@NacosPropertySource(dataId = "cauhinh-ungdung", autoRefreshed = true)
public class UngDungChinh { ... }
Ánh xạ cấu hình vào biến:
@NacosValue(value = "${app.timeout:30000}", autoRefreshed = true)
private int thoiGianCho;
Cơ chế hoạt động
Quản lý cấu hình
Nacos Client sử dụng cơ chế pull định kỳ thay vì kết nối dài:
- Khởi tạo ClientWorker với 2 thread pool
- Thread chính kiểm tra định kỳ (10ms/lần)
- Khi phát hiện thay đổi:
- Cập nhật cache cục bộ
- So sánh MD5 với phiên bản trước
- Kích hoạt callback cho listener
Cấu hình được lưu trữ tại ~nacos/config/ để sử dụng khi máy chủ không khả dụng.
Quản lý dịch vụ
Quy trình xử lý thay đổi dịch vụ:
- HostReactor đăng ký listener vào InstanceChangeNotifier
- Lấy thông tin dịch vụ từ máy chủ
- Cập nhật định kỳ (1s/lần) qua UpdateTask
- Khi có thay đổi:
- Cập nhật cache bộ nhớ
- Lưu bản sao đĩa
- Kích hoạt sự kiện qua NotifyCenter
NotifyCenter sử dụng DefaultPublisher để xử lý bất đồng bộ qua hàng đợi.
Giám sát sức khỏe
Dịch vụ tạm thời (ephemeral) thực hiện:
- Tạo BeatInfo khi đăng ký
- BeatReactor khởi tạo BeatTask (5s/lần)
- Gửi yêu cầu đến
/instance/beat - Nếu nhận 404: Tự đăng ký lại
Ngưỡng bảo vệ ngăn hiện tượng "bão tuyết" khi nhiều máy chủ cùng lỗi.
Nacos Client không duy trì kết nối dài mà sử dụng HTTP request định kỳ để giảm tải hệ thống.