Spring Cloud Config
首先使用配置中心的作用:
(1)集中管理各环境的配置文件
(2)可以进行版本管理
(3)支持各种语言(技术异构性)
(4)支持大的并发查询
(5)配置文件修改之后,在不重启服务的前提下可以快速的生效
Spring Cloud Config可以解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储(有本地仓库与远程git仓库两种形式,本文主要讲的是后者)、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。
首先在github上面创建了一个文件夹configDir用来存放配置文件,以本人创建的仓库为例(用户名:nuclearsnail 仓库名:RemoRepository 文件夹名:configDir)为了模拟生产环境,我们在该文件夹下创建以下三个配置文件:
configclient-testproperties、configclient-dev.properties、configclient-pro.properties
server.port=8701
eureka.client.serviceUrl.defaultZone=http://ipa:8761/eureka
name=bob
为了区分内容的不同,三个文件中端口号分别为8701、8702、8703 ,name属性分别为:bob、tom、jack
(初次使用git远程仓库搭建配置仓库具体步骤参见)
configserver 端
1、添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
只需要加入spring-cloud-config-server包引用既可。
2、configserver的application.properties配置文件
#端口号
server.port=8700
#服务名
spring.application.name=configserver
#仓库类型,native时表示本地仓库,不填或cloud为使用远程仓库
spring.profiles.active=cloud
#该服务注册地址
eureka.client.serviceUrl.defaultZone=http://ipa:8761/eureka
#配置git仓库地址
spring.cloud.config.server.git.uri=https://github.com/nuclearsnail/RemoRepository
#配置git仓库文件夹名称
spring.cloud.config.server.git.searchPaths=configDir
#git仓库的登录用户名
spring.cloud.config.server.git.username=nuclearsnail
#git仓库的登录密码
spring.cloud.config.server.git.password=*****
3、configserver启动类
在ConfigServerApplication启动类中添加注解@EnableConfigServer
,激活对配置中心的支持
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
4、在浏览器中进行远程仓库访问测试
首先我们先要测试server端是否可以读取到github上面的配置信息,直接访问:http://localhost:8700/configclient/dev
返回:
{"name":"configclient",
"profiles":["dev"],
"label":null,"version":"980fec0f3f5eda6bc83626b37b2383d6e4ea0927",
"state":null,
"propertySources":[{"name":"https://github.com/nuclearsnail/RemoRepository/configDir/configclient-dev.properties",
#==========================
"source":{"server.port":"8702","eureka.client.serviceUrl.defaultZone":"http://ipa:8761/eureka",
"name":"tom"}}]}
上述的返回的信息中分割线之前的包含了版本(version)、配置文件名称(name)、描述(profiles)等信息,分割线后面的为配置文件中的具体内容
如果直接查看配置文件中的配置信息可访问:http://localhost:8700/configclient-dev.properties
返回(注意与上面的返回信息对比,是不是一致的):
eureka.client.serviceUrl.defaultZone: http://ipa:8761/eureka
name: tom
server.port: 8702
仓库中的配置文件会被转换成web接口,访问可以参照以下的规则:
- /{applicationName}/{profile}[/{label}]
- /{applicationName}-{profile}.yml
- /{label}/{applicationName}-{profile}.yml
- /{applicationName}-{profile}.properties
- /{label}/{applicationName}-{profile}.properties
以configclient-dev.properties为例子,它的applicationName是configclient,profile是dev,label默认为master(可不填),client会根据填写的参数来选择读取对应的配置。
Configclient 端
1、添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、配置文件
注意:在这里我们只需要配置bootstrap.properties,因为config的相关配置会先于application.properties,因为bootstrap文件先于application文件加载。bootstrap.properties如下:
spring.application.name=configclient
#配置中心的具体地址,向该URL读取配置文件
spring.cloud.config.uri=http://localhost:8700
#当访问不到,则执行快速失败
spring.cloud.config.failFast=true
#以下name和profile属性两个值对应到远程仓库中的配置文件名如:configclient-test.properties
spring.cloud.config.name=configclient
spring.cloud.config.profile=test
#对应git的分支。如果配置中心使用的是本地存储,则该参数无用
spring.cloud.config.label=master
#指定配置中心的service-id,便于扩展为高可用配置集群。
#spring.cloud.config.discovery.service-id=????
3、启动类
Configclient中启动类添加如下注解,为了测试方便添加@RestController作为对外接口访问配置参数
@RestController
@EnableEurekaClient
@SpringBootApplication
public class ConfigClientApplication
{
@Value("${name}")
String name;
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
@RequestMapping("/getName")
public String getName() {
return name;
}
}
4.测试
启动项目后访问服务注册中心:http://localhost:8761可以看到有两个Eurekaclient,分别名为configclient和configserver,并且configclient的端口参数是配置在远程仓库上的配置文件中的
启动项目后访问:http://localhost:8701/getName,返回:tom
说明已经正确的从server端获取到了参数。到此一个完整的服务端提供配置服务,客户端获取配置参数的例子就完成了。