Thứ tự tải và mức độ ưu tiên của cấu hình trong Spring Boot với Nacos

Trong các ứng dụng Spring Boot tích hợp Spring Cloud Alibaba Nacos Config, thứ tự tải và mức độ ưu tiên của các nguồn cấu hình được xác định rõ ràng bởi cơ chế khởi tạo context và quy tắc ghi đè. Dưới đây là phân tích chi tiết dựa trên hành vi thực tế của framework.

1. Thứ tự tải cấu hình

a) bootstrap.yml hoặc bootstrap.properties

  • Thời điểm tải: Được đọc đầu tiên bởi Bootstrap ApplicationContext, trước khi context chính được khởi tạo.
  • Mục đích: Cung cấp thông tin cần thiết để kết nối tới hệ thống quản lý cấu hình bên ngoài — ví dụ: địa chỉ máy chủ Nacos, tên ứng dụng, namespace, nhóm cấu hình.
  • Ví dụ:
spring.application.name=inventory-service
spring.cloud.nacos.config.server-addr=nacos-prod.example.com:8848
spring.cloud.nacos.config.group=DEFAULT_GROUP
spring.cloud.nacos.config.namespace=5c9e7b2a-1f3d-4a8e-b0a1-3e8d7f9a1b2c

b) Cấu hình từ Nacos (remote)

  • Thời điểm tải: Sau khi bootstrap hoàn tất, client Nacos sẽ truy vấn server để lấy nội dung cấu hình tương ứng với dataIdgroup.
  • Cách xác định dataId: Theo mẫu mặc định: ${spring.application.name}-${profile}.${file-extension} (ví dụ: inventory-service-dev.yml).
  • Ví dụ nội dung trong Nacos:
server.port: 8082
spring.redis.host: redis-dev-cluster.internal
management.endpoint.health.show-details: always

c) application.yml hoặc application.properties

  • Thời điểm tải: Sau khi cấu hình từ Nacos đã được tiêm vào môi trường, context chính mới bắt đầu xử lý các file cấu hình cục bộ.
  • Mục đích: Định nghĩa giá trị mặc định hoặc cấu hình không phụ thuộc vào môi trường vận hành.
  • Ví dụ:
logging.level.com.example.inventory=DEBUG
spring.main.banner-mode=off

2. Quy tắc ưu tiên cấu hình

a) Cấu hình từ Nacos luôn có mức ưu tiên cao hơn cấu hình cục bộ
Nếu cùng một thuộc tính xuất hiện cả trong Nacos và application.yml, giá trị từ Nacos sẽ được áp dụng — trừ khi bật cờ override-none=true.

b) Trong cùng một loại cấu hình, file có hậu tố profile luôn thắng
Ví dụ: Khi spring.profiles.active=staging, thì application-staging.yml > application.yml.

c) Cùng mức profile, định dạng .properties ưu tiên hơn .yml
Tức là application-dev.properties sẽ ghi đè lên application-dev.yml nếu cả hai tồn tại.

d) bootstrap.* không phải là "cao nhất" về mặt giá trị hiệu lực
Mặc dù được tải sớm nhất, nhưng các thuộc tính trong bootstrap.yml vẫn có thể bị Nacos ghi đè — đặc biệt là những thuộc tính nằm trong phạm vi cấu hình động như spring.application.name, spring.profiles.active hoặc server.port.

3. Bảng thứ tự ưu tiên tổng quan (từ cao đến thấp)

  1. Tham số dòng lệnh (--server.port=8090)
  2. Biến môi trường SPRING_APPLICATION_JSON
  3. Cấu hình Nacos (ưu tiên theo thứ tự: {name}-{profile}.{ext}{name}.{ext})
  4. application-{profile}.yml / application-{profile}.properties
  5. application.yml / application.properties
  6. bootstrap-{profile}.yml / bootstrap-{profile}.properties
  7. bootstrap.yml / bootstrap.properties
  8. Các nguồn được khai báo qua @PropertySource
  9. Giá trị mặc định do SpringApplication.setDefaultProperties() thiết lập

4. Hướng dẫn triển khai thực tế

  • Bảo mật cấu hình nhạy cảm: Không lưu mật khẩu cơ sở dữ liệu, khóa API hay token trong mã nguồn. Thay vào đó, đặt chúng trong Nacos với phân quyền chi tiết theo namespace và group.
  • Tách biệt môi trường: Sử dụng riêng namespace cho từng môi trường (dev/test/staging/prod), đồng thời cấu hình spring.cloud.nacos.config.namespace phù hợp trong bootstrap.yml.
  • Kích hoạt cập nhật động: Thiết lập spring.cloud.nacos.config.refresh-enabled=true để kích hoạt lắng nghe thay đổi cấu hình mà không cần restart.
  • Ngăn chặn ghi đè không mong muốn: Nếu yêu cầu giữ nguyên giá trị cục bộ, thêm vào bootstrap.yml:
spring.cloud.nacos.config.override-none: true

Thẻ: spring-boot Nacos spring-cloud-alibaba configuration-management property-sources

Đăng vào ngày 11 tháng 7 lúc 16:22