基於Github搭建SrpingCloudConfig詳解
最近在看SpringCloud,為了幫助自己學習和記憶,所以寫下這篇文章。
從SpringCloud官方文檔上看SpringCloudConfig其實為我們提供配置外部化的一個服務,可以理解成就是個web服務,我們通過請求到web服務上獲取我們所需要的配置文件。
我們首先在github上創建一個項目,然後創建幾個配置文件
我創建了3個配置文件,分別對應開發,測試和生產三個環境,
我們配置文件建好之後,開始創建SpringCloudConfig服務
我先放一下我的項目結構,不然pom.xml有些小夥伴可能不理解
my-spring-cloud就是最外層項目的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>jipeng.com</groupId> <artifactId>my_spring_cloud</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>my_spring_cloud_config_service</module> <module>my_spring_cloud_config_client</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> </parent> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <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>Edgware.SR3</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <repositories> <repository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> <name>my_spring_cloud</name> </project>
這裏我們比正常的springboot項目多了一個 spring-cloud-dependencies
這是SpringCloud主包,後面我們SpringCloudConfig的包需要依賴這個,所以版本問題大家需要註意。
下面看下我們my_spring_cloud_config_service項目的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>my_spring_cloud</artifactId> <groupId>jipeng.com</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>my_spring_cloud_config_service</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> </project>
很簡單比我們正常的web項目多了一個 spring-cloud-config-server
下面再看下我們 spring-cloud-config-server 的application.properties 文件
#服務端口 server.port=8091 #服務名稱 spring.application.name=configService #服務對應的git地址,就是你git項目地址,你clone的那個地址 spring.cloud.config.server.git.uri=https://github.com/xxx/xxx.git #git倉庫地址下的相對地址,可以配置多個,用,分割。 spring.cloud.config.server.git.search-paths=/** #配置文件所在的分支 spring.cloud.config.label=master #git倉庫用戶名 spring.cloud.config.username=xxx #git倉庫密碼 spring.cloud.config.password=xxx
我們創建一個 ConfigServiceApplication 代碼如下
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; /** * @Author: jipeng * @Description: * @Date: Created in 2018/6/7 7:54 */ @EnableConfigServer @SpringBootApplication public class ConfigServiceApplication { public static void main(String[] args){ SpringApplication.run(ConfigServiceApplication.class,args); } }
比正常的web項目多了一個 EnableConfigServer 註解,這是一個SpringCloud註解,有了這個註解及時告訴項目這是一個配置服務。好了,到此我們的配置服務已經好了,我們可以啟動項目通過postman來檢驗下我們的成果
看下我們的請求地址 http://localhost:8091/configTestService/dev
再看下github中的配置文件
大家是不是發現了什麽
/configTestService/dev 就是根據我們github中的配置文件名來的 configTestService 為我們的應用名稱 dev 為 環境
現在config服務端搭好了,我們搭建客戶端
客戶端的pom
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>my_spring_cloud</artifactId> <groupId>jipeng.com</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>my_spring_cloud_config_client</artifactId> <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> </dependencies> <build> <finalName>my_spring_cloud_config_client</finalName> </build> </project>
比正常的web多了一個 spring-cloud-starter-config
客戶端的application.properties 就兩個配置
server.port:8081
spring.applicaton.name=configclient
客戶端多了一個bootstrap的配置文件,裏面配置的是SpringCloudConfig的相關配置
#配置應用名稱
spring.cloud.config.name=configTestService
#配置文件的版本
spring.cloud.config.profile=test
#配置服務的地址
spring.cloud.config.uri=http://localhost:8091/
#配置文件所在的分支
spring.cloud.config.label=master
創建一個 WebApplication ,代碼如下
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @Author: jipeng * @Description: * @Date: Created in 2018/6/8 7:03 */ @SpringBootApplication public class WebApplication { public static void main(String[] args){ SpringApplication.run(WebApplication.class,args); } }
我們創建一個 TestController
import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @Author: jipeng * @Description: * @Date: Created in 2018/6/8 7:52 */ @RestController public class TestController { @Value("${configtest.version}") private String version; @RequestMapping("/test") public String from() { return this.version; } }
都加好了我們啟動項目,留意下啟動日記,就是啟動日記剛開始打印的時候
2018-06-10 21:45:07.420 INFO 8376 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8091/ 2018-06-10 21:45:11.347 INFO 8376 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Located environment: name=configTestService, profiles=[dev], label=master, version=9d66adb8d2b7ace9e4933177051b167a7ef49c1a, state=null 2018-06-10 21:45:11.348 INFO 8376 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource [name=‘configService‘, propertySources=[MapPropertySource {name=‘configClient‘}, MapPropertySource {name=‘https://github.com/jploveslife/springcloudtest.git/configTestService-dev.properties‘}]] 2018-06-10 21:45:11.352 INFO 8376 --- [ main] com.ji.WebApplication : No active profile set, falling back to default profiles: default 2018-06-10 21:45:11.369 INFO 8376 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@3a5ecce3: startup date [Sun Jun 10 21:45:11 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@10db82ae 2018-06-10 21:45:11.855 INFO 8376 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=0537ae00-a03a-35d0-830a-1277fd4d74d0 2018-06-10 21:45:11.913 INFO 8376 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean ‘org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration‘ of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$4fec7b02] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
我會發現剛啟動的時候是使用我們的配置服務去獲取的配置文件,這裏面的原理下次講
我們來通過postman驗證下,看配置有沒有過來,我們請求test接口
返回1.0.0 和我們配置文件中一直,說明配置生效了。
到此就結束了,沒講多少,都是直接上的代碼,希望這個文章對大家了解SpringCloudConfig有所幫助。實際生產中比這個復雜,大家可以通過不同的場景搭建不同的配置服務。
基於Github搭建SrpingCloudConfig詳解