Tích hợp Nacos trong hệ sinh thái Spring Cloud

1. Tổng quan về Nacos

Nacos là một nền tảng quản lý cấu hình và dịch vụ mạnh mẽ, hỗ trợ cả discovery (phát hiện dịch vụ) và configuration management (quản lý cấu hình). Nó có thể thay thế đồng thời Eureka (dịch vụ registry), Spring Cloud Config (cấu hình tập trung) và Spring Cloud Bus (cập nhật cấu hình thời gian thực). Ngoài ra, Nacos tích hợp sẵn cơ chế load balancing thông qua Ribbon.

2. Cài đặt Nacos

Tải Nacos từ trang chủ chính thức. Với môi trường phát triển đơn giản (standalone mode), chỉnh sửa file startup.cmd (Windows) hoặc startup.sh (Linux/macOS) để bật chế độ standalone, sau đó khởi động bằng lệnh tương ứng. Truy cập giao diện quản trị tại http://localhost:8848/nacos/ với tài khoản mặc định nacos/nacos.

3. Xây dựng dịch vụ cung cấp (Provider)

Cấu hình Maven (pom.xml):

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

Cấu hình ứng dụng (application.yml):

server:
  port: 9001

spring:
  application:
    name: payment-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

Lớp khởi động:

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(PaymentServiceApplication.class, args);
    }
}

Controller mẫu:

@RestController
public class PaymentController {

    @Value("${server.port}")
    private String port;

    @GetMapping("/api/payment")
    public String getInfo() {
        return "Payment service running on port: " + port;
    }
}

Lặp lại quy trình tương tự để tạo thêm instance thứ hai trên cổng 9002 nhằm kiểm tra khả năng load balancing.

4. Xây dựng dịch vụ tiêu thụ (Consumer)

Cấu hình Maven tương tự provider, bổ sung RestTemplate có hỗ trợ cân bằng tải:

@Configuration
public class WebClientConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

Cấu hình ứng dụng (application.yml):

server:
  port: 83

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

service:
  payment-url: http://payment-service

Controller gọi đến provider:

@RestController
public class OrderController {

    @Value("${service.payment-url}")
    private String paymentUrl;

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/api/order")
    public String callPayment() {
        return restTemplate.getForObject(paymentUrl + "/api/payment", String.class);
    }
}

5. Tích hợp Nacos làm Configuration Center

Thêm dependency:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
</dependency>

Sử dụng bootstrap.yml để tải cấu hình trước khi ứng dụng khởi động:

spring:
  application:
    name: config-client-app
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yaml
      discovery:
        server-addr: localhost:8848

Kích hoạt refresh cấu hình động:

@RestController
@RefreshScope
public class ConfigController {

    @Value("${app.message:default}")
    private String message;

    @GetMapping("/config/message")
    public String getMessage() {
        return "Message: " + message;
    }
}

Trên giao diện Nacos, tạo cấu hình với Data ID theo định dạng: {application-name}-{profile}.{file-extension}, ví dụ: config-client-app-dev.yaml.

6. Quản lý cấu hình nâng cao: Namespace và Group

Để phân tách môi trường hoặc nhóm dự án, cấu hình namespace và group trong bootstrap.yml:

spring:
  cloud:
    nacos:
      config:
        namespace: your-namespace-id
        group: CUSTOM_GROUP

Tạo namespace và group tương ứng trên giao diện Nacos, sau đó đăng ký cấu hình vào đúng không gian đã chỉ định.

7. Lưu trữ cấu hình bền vững

Mặc định Nacos sử dụng cơ sở dữ liệu nhúng. Để lưu trữ lâu dài, khởi tạo cơ sở dữ liệu MySQL và chạy script nacos/conf/mysql-schema.sql. Cập nhật thông tin kết nối trong file nacos/conf/application.properties:

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos

8. Triển khai trên Linux

Sau khi cấu hình database, mở cổng 8848 trên tường lửa:

sudo firewall-cmd --permanent --add-port=8848/tcp
sudo firewall-cmd --reload

Hoặc dùng iptables nếu cần. Khởi động Nacos bằng lệnh:

sh bin/startup.sh -m standalone

Thẻ: Spring Cloud Nacos Service Discovery Configuration Management Load Balancing

Đăng vào ngày 21 tháng 5 lúc 08:40