构建配置中心
首先我们来构建一个配置中心,方式很简单,创建一个普通的Spring Boot项目,叫做config-server,创建好之后,添加如下依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <spring-cloud.version>Dalston.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> <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>
|
然后在入口类上添加@EnableConfigServer注解,表示开启配置中心服务端功能,如下:
1 2 3 4 5 6 7 8
| @SpringBootApplication @EnableConfigServer public class ConfigServerApplication {
public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
|
然后在application.properties中配置一下git仓库的信息,为了简单,我这里就不自己搭建git服务端了,直接使用GitHub(当然也可以使用码云),这里需要我首先在我的Github上创建一个名为scConfig的项目,创建好之后,再做如下配置:
1 2 3 4 5 6
| spring.application.name=config-server server.port=2007 spring.cloud.config.server.git.uri=https://github.com/lenve/scConfig.git spring.cloud.config.server.git.search-paths=config-repo spring.cloud.config.server.git.username=username spring.cloud.config.server.git.password=password
|
前两行配置的含义就不用我多说了,我说下后面四行配置的含义,如下:
1.uri表示配置中心所在仓库的位置
2.search-paths表示仓库下的子目录
3.username表示你的GitHub用户名
4.password表示你的GitHub密码
做好这些之后我们的配置中心服务端就创建好了。
构建配置仓库
接下来我们需要在github上设置好配置中心,首先我在本地找一个空文件夹,在该文件夹中创建一个文件夹叫config-repo,然后在config-repo中创建四个配置文件,如下:
四个文件中的内容分别如下:
OK,然后回到test目录下,依次执行如下命令将本地文件同步到Github仓库中,如下:
如此之后,我们的配置文件就上传到GitHub上了。此时启动我们的配置中心,通过/{application}/{profile}/{label}就能访问到我们的配置文件了,其中application表示配置文件的名字,对应我们上面的配置文件就是app,profile表示环境,我们有dev、test、prod还有默认,label表示分支,默认我们都是放在master分支上,我们在浏览器上访问结果如下:
OK,从这里我们看到了我们放在仓库中的配置文件。JSON中的name表示配置文件名application的部分,profiles表示环境部分,label表示分支,多了一个version,实际上就是我们GitHub上提交信息时产生的版本号,当我们访问成功后,我们还可以看到控制台打印了如下日志:
实际上是配置中心通过git clone命令将配置文件在本地保存了一份,这样可以确保在git仓库挂掉的时候我们的应用还可以继续运行,此时我们断掉网络,再访问http://localhost:2007/app/prod/master,一样还可以拿到数据,此时的数据就是从本地获取的。
客户端配置
服务端搞好了,接下来我们来看看怎么样在客户端使用。
首先创建一个普通的Spring Boot工程config-client,创建成功之后添加如下依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <spring-cloud.version>Dalston.SR3</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> </dependencies> <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>
|
然后创建bootstrap.properties文件,来获取配置信息,注意这些信息一定要放在bootstrap.properties文件中才有效,文件内容如下:
1 2 3 4 5
| spring.application.name=app spring.cloud.config.profile=dev spring.cloud.config.label=master spring.cloud.config.uri=http://localhost:2007/ server.port=2008
|
这里的name对应了配置文件中的application部分,profile对应了profile部分,label对应了label部分,uri则表示配置中心的地址。配置完成之后创建一个测试Controller,我们来看看效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @RestController @RefreshScope public class HelloController { @Value("${sang}") String sang; @Autowired Environment env;
@RequestMapping("/sang") public String sang() { return this.sang; } @RequestMapping("/sang2") public String sang2() { return env.getProperty("sang", "未定义"); } }
|
我们可以直接注入值,也可以通过Environment来获取值,访问结果如下: