通过SpringCloudConfig构建一个分布式配置中心,分成三步:
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-serverartifactId>
<version>1.4.5.RELEASEversion>
dependency>
dependencies>
@EnableConfigServer
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
spring.application.name=config-server
server.port=7001
spring.cloud.config.server.git.uri=http://git.oschina.net/dongarea/SpringCloud-Learning/
spring.cloud.config.server.git.search-paths=/spring_cloud_in_action
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password
spring.cloud.config.server.git.uri:配置Git仓库位置
spring.cloud.config.server.git.searchPaths:配置仓库路径下的相对搜索位置,可以配置多个
spring.cloud.config.server.git.username:访问Git仓库的用户名
spring.cloud.config.server.git.password:访问Git仓库的密码
在码云上建立自己的git仓库http://git.oschina.net/dongarea/SpringCloud-Learning/
,新建四个配置文件
dongarea.properties
dongarea-dev.properties
dongarea-test.properties
dongarea-prod.properties
并为每个配置文件设置不同的值,如下:
from=git-default-1.0
from=git-dev-1.0
from=git-test-1.0
from=git-prod-1.0
同时创建一个config-label-test分支,并将各配置文件中的值用2.0作为后缀
启动应用,访问配置信息的URL与配置文件的映射关系如下所示:
http://localhost:7001/dongarea/prod/config-label-test
{
"name":"dongarea",
"profiles":[
"prod"
],
"label":"config-label-test",
"version":"4b2a044ee54afe2e849aa3b1d747a3d60aa959eb",
"state":null,
"propertySources":[
{
"name":"http://git.oschina.net/dongarea/SpringCloud-Learning/spring_cloud_in_action/dongarea-prod.properties",
"source":{
"from":"git-prod-2.0"
}
},
{
"name":"http://git.oschina.net/dongarea/SpringCloud-Learning/spring_cloud_in_action/dongarea.properties",
"source":{
"from":"git-default-2.0"
}
}
]
}
localhost:7001/config-label-test/dongarea-prod.yml
<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>
<version>1.4.5.RELEASE</version>
</dependency>
</dependencies>
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
spring.application.name=dongarea
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:7001/
server.port=7002
spring.application.name
:对应配置文件规则中的{application}部分
spring.cloud.config.profile
:对应配置文件规则中的{profile}部分
spring.cloud.config.label
:对应配置文件规则中的{label}部分
spring.cloud.config.uri
:配置中心config-server的地址
这些属性必须配置在bootstrap.properties中,因为jar包之外的配置会优先
@RefreshScope
@RestController
public class TestController {
@Value("${from}")
private String from;
@RequestMapping("/from")
public String from(){
return this.from;
}
}
启动config-server应用,再启动config-client应用,访问http://localhost:7002/from
,可以获取配置内容并输出对应环境的from内容
连接Git在线开发:
spring.cloud.config.server.git.uri=http://git.oschina.net/dongarea/SpringCloud-Learning/
spring.cloud.config.server.git.search-paths=/spring_cloud_in_action
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password
本地离线开发(仅供测试使用):
spring.cloud.config.server.git.uri=file://${user.name}/config-repo
<dependency>
<groupId>org.tmatesoft.svnkitgroupId>
<artifactId>svnkitartifactId>
<version>1.8.10version>
dependency>
spring.cloud.config.server.svn.uri=svn://localhost:443/dongarea/SpringCloud-Learning/
spring.cloud.config.server.svn.search-paths=/spring_cloud_in_action
spring.cloud.config.server.svn.username=username
spring.cloud.config.server.svn.password=password
使用本地文件系统的存储方式来保存配置信息,通过spring.profiles.active=native
来实现
指定具体的配置文件位置:spring.cloud.config.server.native.searchLocations
为了更好的内容管理和版本控制,建议还是使用Git仓库的方式
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-securityartifactId>
dependency>
并修改配置文件:
security.user.name=user
security.user.password=123456
如果在客户端不配置相应的安全信息,则会报下面的错误:
在客户端也配置上安全信息,则通过校验
spring.cloud.config.username=user
spring.cloud.config.password=123456
这种安全信息就像是暗号一样,需要双方都有才可以
默认Spring Cloud Config会尝试连接http://localhost:8888
在bootstrap.properties
中配置服务端配置中心地址,才会覆盖默认配置
服务端配置
spring-cloud-starter-eureka
依赖,以实现将分布式配置中心加入Eureka的服务治理体系<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-serverartifactId>
<version>1.4.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-securityartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
<version>1.4.6.RELEASEversion>
dependency>
dependencies>
eureka.client.serviceUrl.defaultZone
以指定服务注册中心的位置spring.application.name=config-server
server.port=7001
#Git配置管理
spring.cloud.config.server.git.uri=http://git.oschina.net/dongarea/SpringCloud-Learning/
spring.cloud.config.server.git.search-paths=/spring_cloud_in_action
spring.cloud.config.server.git.username=dongarea
spring.cloud.config.server.git.password=j7k8l9;0
security.user.name=user
security.user.password=123456
#配置服务注册中心
eureka.client.service-url.defaultZone=http://localhost:1111/eureka
@EnableEurekaClient
注解将config-server注册到服务注册中心上@EnableEurekaClient
@EnableConfigServer
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
http://localhost:1111/
,可以看到服务已经注册上去了spring-cloud-starter-eureka
依赖,以实现客户端发现config-server服务<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
<version>1.4.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
<version>1.4.6.RELEASEversion>
dependency>
dependencies>
spring.application.name=dongarea
spring.cloud.config.profile=dev
#指定服务注册中心,用于服务注册与发现
eureka.client.service-url.defaultZone=http://localhost:1111/eureka;
server.port=7002
#开启通过服务来访问Config Server的功能
spring.cloud.config.discovery.enabled=true
#指定Config Server注册的服务名
spring.cloud.config.discovery.service-id=config-server
spring.cloud.config.username=user
spring.cloud.config.password=123456
@EnableEurekaClient
,用来发现config-server服务@EnableEurekaClient
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
在不启动config-server的情况下,启动客户端config-client时,会报错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.testController': Injection of autowired dependencies failed;
主要是在报错之前,已经加载了很多东西
在bootstrap.properties中加上spring.cloud.config.failFast=true
,直接验证config-server配置是否有误,加载信息少很多,达到了快速返回失败的效果
java.lang.IllegalStateException: No instances found of configserver (config-server)
在网络波动等其他间隙性原因导致的问题时,可以开启重试功能
spring-retry
和spring-boot-starter-aop
依赖:<dependency>
<groupId>org.springframework.retrygroupId>
<artifactId>spring-retryartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-aopartifactId>
dependency>
通过URL和客户端配置的访问对应可以总结如下:
spring.application.name
:对应配置文件中的{application}内容spring.cloud.config.profile
:对应配置文件中的{profile}内容spring.cloud.config.label
:对应分支内容,如不配置,默认为master