SpringBoot và Apollo Configuration Center

1. Cơ bản

1.1. Giới thiệu

Với sự phát triển của các ứng dụng phức tạp, việc quản lý cấu hình ngày càng trở nên quan trọng. Apollo Configuration Center là một giải pháp nguồn mở giúp quản lý cấu hình cho các ứng dụng một cách tập trung và hiệu quả.

1.2. Điểm mạnh

  • Thiết lập dễ dàng
  • Cập nhật cấu hình theo thời gian thực
  • Quản lý phiên bản và phát hành
  • API mở
  • Giám sát cấu hình từ xa
  • Hỗ trợ Java và .NET
  • Quản lý cấu hình cục bộ

1.3. Cấu trúc nền tảng

Quy trình cơ bản của Apollo:

  1. Người dùng sửa đổi và phát hành cấu hình từ giao diện quản trị.
  2. Config Service thông báo cho Apollo Client về thay đổi cấu hình.
  3. Apollo Client kéo về cấu hình mới, cập nhật vào bộ nhớ và lưu vào hệ thống tệp cục bộ.

1.4. Bốn chiều管理

  • Ứng dụng: Mỗi ứng dụng cần có một ID duy nhất để nhận cấu hình tương ứng.
  • Môi trường: Các môi trường như FAT, UAT, DEV, PRO được sử dụng để tách biệt các cấu hình khác nhau.
  • Clustering: Phân nhóm các实例 ứng dụng theo数据中心.
  • Namespace: Tách biệt các loại cấu hình khác nhau như CSDL, RPC.

1.5. Cấu hình cục bộ

Apollo Client lưu một bản sao cấu hình vào hệ thống tệp cục bộ để đảm bảo khả dụng cao.

Đường dẫn mặc định:

  • Mac/Linux: /opt/data/{appId}/config-cache
  • Windows: C:\opt\data\{appId}\config-cache

2. Tạo và cấu hình Apollo Configuration Center

2.1. Đăng nhập Apollo

Truy cập Apollo Portal qua NodePort Kubernetes:

  • Username: apollo
  • Password: admin

2.2. Tạo dự án Apollo

Sau khi đăng nhập, tạo một dự án mới với:

  • App ID: apollo-test
  • App Name: apollo-demo

2.3. Thêm tham số cấu hình

Tạo một tham số cấu hình mới:

  • Key: test
  • Giá trị: 123456

3. Tạo Apollo Client Test Project

3.1. Thêm phụ thuộc Apollo vào Maven


<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.1.8.RELEASE</version>
    </parent>
    <groupId>club.mydlq</groupId>
    <artifactId>apollo-demo</artifactId>
    <version>0.0.1</version>
    <name>apollo-demo</name>
    <description>Apollo Demo</description>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.4.0</version>
        </dependency>
    </dependencies>
</project>
        

3.2. Cấu hình tham số Apollo


server:
    port: 8080

spring:
    application:
        name: apollo-demo

apollo:
    cacheDir: /opt/data/
    cluster: default
    meta: http://192.168.2.11:30002
    autoUpdateInjectedSpringProperties: true
    bootstrap:
        enabled: true
        namespaces: application
        eagerLoad:
            enabled: false
        

3.3. Tạo Controller để kiểm tra cấu hình


import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Value("${test:Giá trị mặc định}")
    private String test;

    @GetMapping("/test")
    public String test() {
        return "Giá trị test là: " + test;
    }
}
        

3.4. Tạo class啟動


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

3.5. Thêm tham số JVM


-Dapollo.configService=http://192.168.2.11:30002 -Denv=DEV
        

4. Test ứng dụng

4.1. Kiểm tra nhận giá trị từ Apollo

Khởi động ứng dụng và truy cập http://localhost:8080/test để xem:


Giá trị test là: 123456
        

4.2. Kiểm tra cập nhật cấu hình theo thời gian thực

Thay đổi giá trị test thành 666666 và publish lại. Truy cập lại endpoint để thấy thay đổi.

4.3. Kiểm tra rollback cấu hình

Rollback cấu hình và kiểm tra endpoint thấy giá trị cũ.

4.4. Kiểm tra khi không truy cập được Apollo

Sửa đổi địa chỉ configService sai và khởi động ứng dụng. Xóa file cache và khởi động lại để thấy giá trị mặc định.

5. Sử dụng Cluster và Namespace

5.1. Tạo Namespace mới

Tạo hai Namespace: dev-1 và dev-2, mỗi Namespace có giá trị test khác nhau.

5.2. Sử dụng Namespace

Cập nhật Namespace trong application.yml:


apollo:
    bootstrap:
        namespaces: dev-1
        

6.Deploy SpringBoot lên Kubernetes

6.1. Tạo Docker image


$ mvn clean install
        

6.2. Tạo file Kubernetes deployment


apiVersion: v1
kind: Service
metadata:
    name: springboot-apollo
spec:
    type: NodePort
    ports:
        - name: server
          nodePort: 31080
          port: 8080
          targetPort: 8080
    selector:
        app: springboot-apollo
---
apiVersion: apps/v1
kind: Deployment
metadata:
    name: springboot-apollo
spec:
    replicas: 1
    selector:
        matchLabels:
            app: springboot-apollo
    template:
        metadata:
            labels:
                app: springboot-apollo
        spec:
            containers:
                - name: springboot-apollo
                  image: mydlqclub/springboot-apollo:0.0.1
                  ports:
                      - containerPort: 8080
                  env:
                      - name: JAVA_OPTS
                        value: "-Denv=DEV"
                      - name: APP_OPTS
                        value: "-- app.id=apollo-test -- apollo.meta=http://service-apollo-config-server-dev.mydlqcloud:8080"
        

6.3. Deploy lên Kubernetes


$ kubectl apply -f springboot-apollo.yaml -n mydlqcloud
        

6.4. Kiểm tra endpoint

Truy cập http://192.168.2.11:31080/test để thấy:


Giá trị test là: 123456
        

Thẻ: SpringBoot Apollo Kubernetes Java Configuration Management

Đăng vào ngày 23 tháng 6 lúc 16:01