當服務部署的愈來愈多,規模愈來愈大,對應的機器數量也愈來愈龐大,靠人工來管理和維護服務的配置信息,變得困難,容易出錯。
所以,須要一個可以動態註冊和獲取服務信息的地方,來統一管理服務名稱和其對應的服務器列表信息,稱之爲服務配置中心。服務提供者在啓動時,將其提供的服務名稱、服務器地址註冊到服務配置中心。服務消費者經過服務配置中心來得到須要調用的服務,經過相應的負載均衡算法,選擇其中一臺服務器開始調用。html
spring cloud config 是 spring cloud 中的一個組件,分佈式配置中心組件,它支持配置服務放在配置服務的內存中(即本地),也支持放在遠程Git倉庫中。在spring cloud config 組件中,分兩個角色,一是config server,二是config client。java
Spring Boot 2.0.x
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
@EnableConfigServer
,開啓Config配置中心服務端config-dev.yml
,並提交到git倉庫,實例是mysql的數據本來配置信息,提交的github中,配置文件以下:spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.10.100:3306/spring?useSSL=false username: test password: 123456
spring: application: name: config-server cloud: config: server: git: uri: https://github.com/jarvisqi/spring-cloud-microservice search-paths: config-server username: password: default-label: master server: port: 9400
http://localhost:9400/config/dev
地址,看到以下信息,說明服務端正常運行:{ "name": "config", "profiles": [ "dev" ], "label": null, "version": "e64289cb775e2ac7db7494c07d7e8c4933163daf", "state": null, "propertySources": [ { "name": "https://github.com/jarvisqi/spring-cloud-microservice/config-server/config-dev.yml", "source": { "spring.datasource.driver-class-name": "com.mysql.jdbc.Driver", "spring.datasource.url": "jdbc:mysql://192.168.10.100:3306/spring?useSSL=false", "spring.datasource.username": "test", "spring.datasource.password": 123456 } } ] }
source 下面的key就是配置的信息,http請求地址和資源文件映射以下:mysql
/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties
Spring Boot 2.0.x
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
spring: application: name: config-client cloud: config: uri: http://localhost:9400 name: config profile: dev label: master server: port: 9410
注意
若是name
值不寫,會默認取 spring.application.name
的值,資源文件名就變成了 config-client-dev
,根據http請求地址和資源文件映射,確定找不到,會報錯,沒法啓動spring: cloud: config: uri: http://localhost:9400
注意
,此處有坑,若是你不添加 boostrap.yml
文件並從新指定指定 spring.cloud.config.uri
,啓動客戶端會報錯,會默認指定 端口:8888,不是自定義的端口,沒法啓動會報錯,固然你能夠直接用 boostrap.yml
,我看那此處不少人遇到問題,遇到問題就說下降版本到1.5.X就正確,這也能算解決方案?git
@RestController public class ConfigController { @Value("${spring.datasource.driver-class-name}") private String driverClassName; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @RequestMapping("/dataconfig") public DataConfig getDataConfig() { DataConfig config = new DataConfig(driverClassName, url, username, password); return config; } }
http://localhost:9410/dataconfig
,獲得以下結果,說明配置中心完成:{ "driverClassName": "com.mysql.jdbc.Driver", "url": "jdbc:mysql://192.168.10.100:3306/spring?useSSL=false", "username": "test", "password": "123456" }
以上,就能夠單獨部署配置中心,配置信息值須要git提交到指定的目錄,微服務各個獨立的服務應用都能獲取。github
附上源碼:https://github.com/jarvisqi/spring-cloud-microservice.gitweb
參考:算法