文章目錄
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
,其中 dev
即 profile
{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"'
注意: 如果有同名的 properties
和 yml
配置文件存在,則只能訪問到 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 參考資料推薦
Zookeeper 完整系列教程 Spring-Cloud-Zookeeper-Based-Demo
5 Github 源碼
Gtihub 源碼地址 : https://github.com/Flying9001/springBootDemo
個人公衆號:404Code,分享半個互聯網人的技術與思考,感興趣的可以關注.