SpringCloud Config 配置中心
分散式系統中,由於服務數量非常多,配置檔案分散在不同微服務專案中,管理極其不方便。為了方便配置檔案集中管理,需要分散式配置中心元件。在Spring Cloud中,提供了Spring Cloud Config,它支援配置檔案放在配置服務的本地,也支援配置檔案放在遠端倉庫Git(GitHub、碼雲)。配置中心本質上是一個微服務,同樣需要註冊到Eureka服務中心!
一句話概括:統一管理所有微服務配置檔案的一個微服務
配置中心,也是一個微服務,需要註冊到註冊中心
【配置中心的架構圖】
-
-
配置中心獲取碼雲配置檔案
-
-
-
GitHub主服務在外網,訪問經常不穩定,如果希望服務穩定,可以使用碼雲;
-
碼雲訪問地址:
-
-
application為應用名稱
-
profile用於區分開發環境dev,測試環境test,生產環境pro等
-
開發環境 user-dev.yml
-
測試環境 user-test.yml
-
2. 將user-service工程裡的配置檔案application.yml內容複製作為user-dev.yml檔案內容
3. 建立完user-dev.yml配置檔案之後,gitee中的倉庫如下:
實現步驟:
-
建立配置中心SpringBoot專案config-server
-
勾選Starter:配置中心,Eureka客戶端
-
在啟動引導類上加@EnableConfigServer註解
-
修改配置檔案:埠,應用名稱,註冊中心地址,碼雲倉庫地址
-
啟動測試,測試配置檔案實時同步
實現過程:
1. 建立配置中心SpringBoot專案config-server
2. pom.xml 配置檔案
<?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 https://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.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.zyu</groupId> <artifactId>config-service</artifactId> <version>0.0.1-SNAPSHOT</version> <name>config-service</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <!--SpringCloud所有依賴管理的座標--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3. 啟動類:建立配置中心工程config_server的啟動類ConfigServerApplication
@SpringBootApplication @EnableDiscoveryClient//開啟Eureka客戶端發現功能 @EnableConfigServer //開啟配置服務支援 public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class,args); } }
4. 配置檔案:建立配置中心工程config_server的配置檔案application.yml
server:
port: 12000
spring:
# 應用名稱
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/zyulike/zyu-spring-cloud-config.git
# 註冊中心地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
- 注意:上述spring.cloud.config.server.git.uri是在碼雲建立的倉庫地址
5. 啟動測試:啟動eureka註冊中心和配置中心;
- 並且可以在gitee上修改user-dev.yml,然後重新整理上述測試地址也能及時更新資料
關於application.yml和bootstrap.yml檔案的說明:
- bootstrap.yml檔案是SpringBoot的預設配置檔案,而且其載入時間相比於application.yml更早。
- bootstrap.yml和application.yml都是預設配置檔案,但定位不同
- bootstrap.yml相當於專案啟動的引導檔案
- application.yml檔案是微服務的常規配置引數,變化比較頻繁
- 搭配spring-cloud-config使application.yml的配置可以動態替換。
目標:改造user-service工程,配置檔案不再由微服務專案提供,而是從配置中心獲取。
實現步驟:
-
在user_service服務中,新增Config的starter依賴
-
刪除application.yml配置檔案,新增bootstrap.yml配置檔案
-
配置bootstrap.yml配置檔案:
-
配置中心相關配置(配置檔案字首、字尾,倉庫分支,是否開啟配置中心)
-
註冊中心地址
-
-
啟動服務,測試效果
實現過程:
1. 新增依賴
<!--spring cloud 配置中心--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
2.修改配置
# 註冊中心地址
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
# 配置中心相關配置
# 使用配置中心
spring:
cloud:
config:
discovery:
enabled: true
service-id: config-server # 配置中心服務id
name: user # 與遠端倉庫中的配置檔案的application和profile保持一致,{application}-{profile}.yml
profile: dev
label: master # 遠端倉庫中的分支保持一致
復現問題步驟:
1. 修改遠端Git配置
- 修改在碼雲上的user-dev.yml檔案,新增一個屬性test.name
2.修改UserController
@RestController @RequestMapping("/user") public class UserController { @Value("${server.port}") private String port; @Value("${test.name}") private String name; @Autowired UserService userService; //根據id查詢 @RequestMapping("/findById") public User findById(Integer id) { System.out.println("服務【"+port+"】被呼叫"); User user = userService.findById(id); user.setNote("服務【"+port+"】被呼叫"); user.setName(name); return user; } }
-
依次啟動Eureka,配置中心,使用者微服務;
-
結論:通過瀏覽器輸出結果發現,我們對於Git倉庫中的配置檔案的修改,並沒有及時更新到user-service微服務,只有重啟使用者微服務才能生效。
==SpringCloud Bus,解決上述問題,實現配置自動更新。==