1. Quản lý phụ thuộc Maven
Để tích hợp Nacos vào một dự án Spring Cloud Alibaba, trước tiên cần khai báo các phụ thuộc Maven cần thiết. Các phụ thuộc này thường được quản lý thông qua tệp pom.xml gốc (parent) và các module con.
Cấu hình tệp pom.xml gốc
Trong tệp pom.xml cha, chúng ta sẽ định nghĩa các phiên bản quản lý cho Spring Boot, Spring Cloud và Spring Cloud Alibaba. Điều này giúp đảm bảo sự đồng bộ về phiên bản trên toàn bộ dự án.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.17</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.platform</groupId>
<artifactId>core-platform-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>api-gateway-module</module>
<module>user-service-module</module>
<module>common-libraries</module>
</modules>
<properties>
<spring-cloud.version>2021.0.8</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
Cấu hình tệp pom.xml cho module Cổng API (API Gateway Module)
Module API Gateway cần các phụ thuộc cụ thể để hoạt động như một cổng API và để kết nối với Nacos cho việc khám phá dịch vụ và quản lý cấu hình.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example.platform</groupId>
<artifactId>core-platform-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>api-gateway-module</artifactId>
<dependencies>
<!-- Spring Cloud Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Spring Cloud LoadBalancer (thường đi kèm với Gateway) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!-- Nacos Discovery cho việc đăng ký và khám phá dịch vụ -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos Config cho quản lý cấu hình động -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
</project>
2. Cấu hình ứng dụng chung
Sau khi đã có các phụ thuộc Maven, bước tiếp theo là cấu hình tệp application.yml. Đây là nơi bạn định nghĩa các thông số kết nối đến Nacos và các thuộc tính ứng dụng cơ bản.
# Định danh hệ thống chung, được sử dụng làm Namespace ID trong Nacos
platform:
system-id: microservice-platform-dev
spring:
# Cấu hình môi trường hoạt động của ứng dụng (ví dụ: dev, prod)
profiles:
active: dev
application:
# Tên của ứng dụng này, sẽ được đăng ký trong Nacos
name: @project.artifactId@ # Lấy từ Maven project artifactId
cloud:
nacos:
# Địa chỉ máy chủ Nacos
server-addr: localhost:8848
discovery:
username: nacos
password: nacos
# ID của Namespace trong Nacos. Dùng để cách ly các môi trường hoặc dự án
namespace: ${platform.system-id}
# Group dịch vụ. Thường dùng để phân biệt các môi trường con (dev, staging, prod)
group: ${spring.profiles.active}
config:
# Namespace cho cấu hình, thường giống với Discovery
namespace: ${spring.cloud.nacos.discovery.namespace}
username: ${spring.cloud.nacos.discovery.username}
password: ${spring.cloud.nacos.discovery.password}
# Group cấu hình, thường giống với Discovery
group: ${spring.cloud.nacos.discovery.group}
config:
# Import cấu hình từ Nacos. Định dạng: nacos:dataId?refreshEnabled=true
# Các thuộc tính trong 'dataId.yml' sẽ được tải và có thể làm mới động
import:
- nacos:${spring.application.name}.yml?refreshEnabled=true
3. Thiết lập Namespace và Cấu hình trên Nacos
Để Nacos hoạt động hiệu quả trong môi trường đa dự án hoặc đa môi trường, việc tổ chức các Namespace và Group là rất quan trọng.
- Namespace ID: Nên ánh xạ với một định danh duy nhất cho toàn bộ dự án hoặc hệ thống lớn (ví dụ:
microservice-platform-devnhư trong cấu hình). Điều này giúp cách ly hoàn toàn các cấu hình và dịch vụ giữa các dự án hoặc giai đoạn phát triển khác nhau. - Group: Trong mỗi Namespace, bạn có thể sử dụng Group để phân biệt các môi trường hoạt động (ví dụ:
dev,staging,prod). Điều này cho phép một dịch vụ có thể có các cấu hình khác nhau tùy thuộc vào môi trường mà nó đang chạy. - Data ID: Tên của tệp cấu hình thực tế trong Nacos (ví dụ:
api-gateway-module.yml). Mỗi dịch vụ sẽ có một Data ID riêng, chứa các thuộc tính cấu hình cụ thể cho dịch vụ đó.
Khi một dịch vụ khởi động, nó sẽ kết nối đến Nacos bằng cách sử dụng Namespace ID và Group đã cấu hình, sau đó tải về tệp cấu hình tương ứng với Data ID của nó.
4. Tải và Làm mới Cấu hình động
Một trong những tính năng mạnh mẽ của Nacos là khả năng cập nhật cấu hình động mà không cần khởi động lại ứng dụng. Điều này được thực hiện thông qua chú thích @RefreshScope của Spring Cloud.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope // Kích hoạt khả năng làm mới cấu hình động cho bean này
@RestController
public class ConfigUpdateController {
// Lấy giá trị từ cấu hình Nacos
@Value("${app.welcome-message:Default welcome message}")
private String welcomeMessage;
// Ví dụ về một thuộc tính không thể làm mới động mà không khởi động lại
// @Value("${server.port}")
// private String serverPort; // Lưu ý: server.port không thể làm mới động
@GetMapping("/dynamic-message")
public String retrieveMessage() {
return "Thông điệp chào mừng hiện tại: " + welcomeMessage;
}
// Nếu bạn muốn hiển thị port (chỉ cập nhật khi khởi động lại)
// @GetMapping("/current-port")
// public String getCurrentPort() {
// return "Cổng dịch vụ: " + serverPort + " (chỉ cập nhật khi khởi động lại)";
// }
}
Trong ví dụ trên:
@RefreshScope: Đặt trên lớpConfigUpdateController, đảm bảo rằng mọi bean trong lớp này có thể được làm mới khi cấu hình trên Nacos thay đổi.@Value("${app.welcome-message:Default welcome message}"): Chú thích này sẽ tiêm giá trị của thuộc tínhapp.welcome-messagetừ cấu hình Nacos vào biếnwelcomeMessage. Nếu thuộc tính này được thay đổi trên Nacos, Spring Cloud sẽ tự động làm mới giá trị củawelcomeMessagemà không cần khởi động lại ứng dụng.- Lưu ý quan trọng về
server.port: Một số thuộc tính cốt lõi của Spring Boot nhưserver.portchỉ được đọc và áp dụng trong quá trình khởi động ứng dụng. Mặc dù bạn có thể đặt@Value("${server.port}"), giá trị này sẽ không thay đổi động ngay cả khi bạn cập nhật nó trên Nacos. Để thay đổi cổng, bạn cần phải khởi động lại ứng dụng.