Spring Boot 2.2 集成 Spring Cloud Zookeeper Config 分佈式配置中心



1 摘要

Spring Cloud Zookeeper 分佈式服務註冊中心搭建可參考:

33 Spring Boot 2.2 集成 Spring Cloud Zookeeper - 分佈式服務註冊中心 — 2020-02-23

Spring Cloud Zookeeper 分佈式服務調用可參考:

34 Spring Boot 2.2 集成 Spring Cloud Zookeeper - Ribbon 分佈式服務消費者 — 2020-02-25

35 Spring Boot 2.2 集成 Spring Cloud Zookeeper - Feign 分佈式服務消費者 — 2020-02-25

本文將介紹 Spring Cloud Zookeeper Config 分佈式配置中心的搭建教程

Spring Cloud Config 分爲 服務端和客戶端,服務端作爲配置中心,客戶端遠程調用獲取服務端配置信息

2 Spring Cloud Config 服務端搭建

2.1 核心 Maven 依賴

./cloud-zookeeper-config-server/pom.xml
        <!-- Spring mvc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring cloud zookeeper -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-all</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- Zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Spring cloud config server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

其中 ${zookeeper.version} 的版本爲 3.4.12 (不要隨意改版本號,會有兼容性問題)

注意: SpringBoot 的版本需要在 2.2及以上

2.2 配置文件

bootstrap.yml

./cloud-zookeeper-config-server/src/main/resources/bootstrap.yml
## Application bootstrap config


## spring config
spring:
  cloud:
    zookeeper:
      connect-string: 172.16.140.10:2181
    config:
      server:
        git:
          uri: https://gitee.com/flying9001/springCloudConfigDemo
          search-paths: config
          username:
          password:
          default-label: master

其中 spring.cloud.config.server.git.uri 爲 Git 倉庫地址

spring.cloud.config.server.git.search-paths 爲倉庫中配置文件的目錄

spring.cloud.config.server.git.username 爲 Git 倉庫用戶名

spring.cloud.config.server.git.password 爲 Git 倉庫密碼

若倉庫權限爲公開的(public),則不需要用戶名和密碼

default-label: 默認讀取 Git 倉庫的分支

application.yml

./cloud-zookeeper-config-server/src/main/resources/application.yml
## Application config

## Server
server:
  port: 8103

## Spring config
spring:
  application:
    name: cloud-zookeeper-config-server

2.3 核心代碼

SpringBoot 啓動類

./cloud-zookeeper-config-server/src/main/java/com/ljq/demo/springboot/cloud/zookeeper/config/server/CloudZookeeperConfigServerApplication.java
package com.ljq.demo.springboot.cloud.zookeeper.config.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.config.server.EnableConfigServer;

/**
 * @author junqiang.lu
 */
@EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class CloudZookeeperConfigServerApplication {

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

}

@EnableConfigServer 表明啓用 Spring Cloud Config 服務端

@EnableDiscoveryClient 用於向 Spring Cloud 註冊中心註冊服務

2.4 HTTP 訪問地址與配置資源

訪問地址與配置資源的關係如下:

{application} : 表示配置文件名

{profile} : 表示文件的後綴(非拓展名),類似 Spring Boot 環境配置,application-dev.yml,其中 devprofile

{label} : 表示 Git 的分支

可以訪問的方式:

/{application}/{profile}(/{label})
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.yml
/{label}/{application}-{profile}.properties

2.5 測試

2.5.1 /{application}/{profile}(/{label})

請求地址:

GET http://127.0.0.1:8103/config/application.yml

返回參數:

{
    "name": "config",
    "profiles": [
        "application.yml"
    ],
    "label": null,
    "version": "a111f963aec3a4be465e9d0e3d53de2a554cbcb7",
    "state": null,
    "propertySources": [
        {
            "name": "https://gitee.com/flying9001/springCloudConfigDemo/config/application.yml",
            "source": {
                "applicationName": "spring-cloud-config-demo-dev"
            }
        }
    ]
}

application.yml 爲主配置文件,返回的結果中包含文件的名稱、路徑以及配置內容等信息

2.5.2 /{application}-{profile}.yml

請求參數:

GET http://127.0.0.1:8103/application-dev.yml

返回參數:

address:
  area: Pudong
  city: Shanghai
  country: China
  detail: 外灘 18 號
  province: Shanghai
applicationName: spring-cloud-config-demo-dev
fileName: '"application-dev.properties"'

注意: 如果有同名的 propertiesyml 配置文件存在,則只能訪問到 properties 中的配置信息

2.5.3 /{application}-{profile}.properties

請求參數:

GET http://127.0.0.1:8103/application-test.properties

返回參數:

address.area: Pudong
address.city: Beijing
address.country: China
address.detail: 外灘 20 號
address.province: Beijing
applicationName: spring-cloud-config-demo-dev
fileName: "application-test.properties"

注意: 無論配置中心的源配置文件的後綴爲 properties 還是 yml 查詢結果展示形式以請求地址中的後綴爲準

即: 源配置文件爲 application-test.yml ,但是訪問地址中爲 application-test.ptoperties,則查詢到的結果會以 properties 的形式展示,數據還是原來的配置,只是展示效果不同, Spring Cloud Config 在這個過程中自動進行格式轉換

2.5.4 /{label}/{application}-{profile}.yml

請求參數:

GET http://127.0.0.1:8103/master/application-dev.yml

返回參數:

address:
  area: Pudong
  city: Shanghai
  country: China
  detail: 外灘 18 號
  province: Shanghai
applicationName: spring-cloud-config-demo-dev
fileName: '"application-dev.properties"'

如果 Git 庫中只有一個 master 分支,且在 Spring 配置文件中指定默認分支,則可以在 URL 中省略分支選項

3 Spring Cloud Config 客戶端搭建

3.1 核心 Maven 依賴

./cloud-zookeeper-config-client/pom.xml
        <!-- Spring mvc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring cloud zookeeper -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-all</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- Zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Spring cloud config client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>

其中 ${zookeeper.version} 的版本爲 3.4.12 (不要隨意改版本號,會有兼容性問題)

注意: SpringBoot 的版本需要在 2.2及以上

3.2 配置文件

bootstrap.yml

./cloud-zookeeper-config-client/src/main/resources/bootstrap.yml
## Application bootstrap config


## spring config
spring:
  main:
    allow-bean-definition-overriding: true
  application:
    name: cloud-zookeeper-config-client
  cloud:
    zookeeper:
      connect-string: 172.16.140.10:2181
      ## 將當前應用註冊到 Zookeeper 中,其默認值爲 true,由於配置了 'spring.cloud.config' 屬性,因此需要手動設置爲 true
      discovery:
        register: true
    config:
      ## 指定配置中心文件的{profile}
      profile: dev
      ## 指定配置中心文件的{label}
      label: master
      discovery:
        ## 發現 Cloud Config 服務
        enabled: true
        ## 指定配置服務的服務 id
        service-id: cloud-zookeeper-config-server

application.yml

./cloud-zookeeper-config-client/src/main/resources/application.yml
## Application config

## Server
server:
  port: 8104

3.3 核心代碼

3.3.1 Controller 層-通過 @Value 註解讀取配置
./cloud-zookeeper-config-client/src/main/java/com/ljq/demo/springboot/cloud/zookeeper/config/client/controller/CloudZookeeperConfigClientController.java
package com.ljq.demo.springboot.cloud.zookeeper.config.client.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * @Description: Spring Cloud Zookeeper 分佈式配置客戶端
 * @Author: junqiang.lu
 * @Date: 2020/2/26
 */
@RestController
@RequestMapping("/api/cloud/zookeeper/config")
public class CloudZookeeperConfigClientController {

    @Value("${spring.application.name: springCloudZookeeperConfigClientDefault}")
    private String springApplicationName;

    @Value("${applicationName: applicationNameDefault}")
    private String applicationName;

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

    @Value("${address.detail: ShanghaiDefault}")
    private String detailAddress;

    @Value("${fileName: fileNameDefault}")
    private String fileName;


    @RequestMapping(value = "/test", method = {RequestMethod.GET, RequestMethod.POST},
            produces = {MediaType.APPLICATION_JSON_VALUE})
    public String readConfig() {
        StringBuilder configBuilder = new StringBuilder();
        configBuilder.append("springApplicationName: ").append(this.springApplicationName).append(",\n");
        configBuilder.append("applicationName: ").append(this.applicationName).append(",\n");
        configBuilder.append("serverPort: ").append(this.serverPort).append(",\n");
        configBuilder.append("detailAddress: ").append(this.detailAddress).append(",\n");
        configBuilder.append("fileName:").append(fileName).append("\n");

        System.out.println(new Date() + "-" + configBuilder.toString());

        return configBuilder.toString();
    }

}

Spring Boot 提供通過 @Value 註解來讀取參數,也可以使用 @Configuration 註解專門寫一個配置類

3.3.2 SpringBoot 啓動類
./cloud-zookeeper-config-client/src/main/java/com/ljq/demo/springboot/cloud/zookeeper/config/client/CloudZookeeperConfigClientApplication.java
package com.ljq.demo.springboot.cloud.zookeeper.config.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author junqiang.lu
 */
@EnableDiscoveryClient
@SpringBootApplication
public class CloudZookeeperConfigClientApplication {

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

}

@EnableDiscoveryClient : 用於發現 Spring Cloud 註冊中心的服務

3.4 測試

請求地址:

GET http://127.0.0.1:8104/api/cloud/zookeeper/config/test

返回參數:

springApplicationName: cloud-zookeeper-config-client,
applicationName: spring-cloud-config-demo-dev,
serverPort: 8104,
detailAddress: 外灘 18 號,
fileName: "application-dev.properties"

至此,一套簡易的 Spring Cloud Config 分佈式配置中心已經搭建完成。

(PS: 預知 Spring Cloud Zookeeper 項目搭建過程中容易遇到的常見問題,且聽下回分解)

4 參考資料推薦

官方文檔 Spring Cloud Zookeeper

Zookeeper 完整系列教程 Spring-Cloud-Zookeeper-Based-Demo

5 Github 源碼

Gtihub 源碼地址 : https://github.com/Flying9001/springBootDemo

個人公衆號:404Code,分享半個互聯網人的技術與思考,感興趣的可以關注.
404Code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章