Tìm Hiểu Nacos: Nền Tảng Quản Lý Cấu Hình và Phát Hiện Dịch Vụ Trong Hệ Thống Phân Tán

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:

  1. Khởi tạo ClientWorker với 2 thread pool
  2. Thread chính kiểm tra định kỳ (10ms/lần)
  3. 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ụ:

  1. HostReactor đăng ký listener vào InstanceChangeNotifier
  2. Lấy thông tin dịch vụ từ máy chủ
  3. Cập nhật định kỳ (1s/lần) qua UpdateTask
  4. 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:

  1. Tạo BeatInfo khi đăng ký
  2. BeatReactor khởi tạo BeatTask (5s/lần)
  3. Gửi yêu cầu đến /instance/beat
  4. 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.

Thẻ: spring-cloud-alibaba service-discovery config-center distributed-systems

Đăng vào ngày 15 tháng 6 lúc 21:53