持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
21、集群配置中心准备
二、集群配置中心准备
1、创建服务器
新建一个 srl-configure-server 的Maven 项目:
依赖如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
<version>1.9.0</version>
</dependency>
由于配置服务器需要连接到 SVN ,因此要加入 SVN 的依赖 。新建启动类,使用 @EnableConfigServer 注解开启配置服务器的功能,请见代码清单:
@SpringBootApplication
@EnableConfigServer
public class SrlConfigureServerApplication {
public static void main(String[] args) {
SpringApplication.run(SrlConfigureServerApplication.class, args);
}
}
简单两步,我们的项目就成为 个配置服务器了。接下来 让配置服务器连接到 SVN 仓库读取配置文件
2、配置SVN仓库
为配置服务器 srl-configure-server 的 application.properties添加以下配置:
#配置端口
server.port=8888
#默认情况下,很多端点需要认证才能访问,关闭认证,默认开启 true
management.security.enabled=false
#让配置服务器连接SVN 默认git:git仓库。
spring.profiles.active=subversion
#SVN服务器的uri,仓库地址是test_project, SVN服务器默认会在前面加一个/svn/
spring.cloud.config.server.svn.uri=https://localhost/svn/test_project
#SVN服务器的用户名 密码
spring.cloud.config.server.svn.username=root
spring.cloud.config.server.svn.password=root
#配置获取配置文件的目录,默认test_project/trunk,test_project是上面配置的仓库路径
spring.cloud.config.server.default-label=default-config
配置服务的端口为 8888, 默认情况下,很多端点需要认证才能访问,配置 management.security.enabled=false 关闭认证。为了能让配置服务器连上 SVN, 需要先使用名称为subversion 的配置。 spring-cloud-config-server 项目提供了 4 种配置,可以通过设置不同的名字来激活。
- git :默认值,表示去 Git 仓库读取配置文件。
- subversion :表示去 SYN 仓库读取配置文件。
- native :将去本地的文件系统中读取配置文件。
- vault :去Vault 中读取配置文件, Vault 是一款资源控制工具,可对资源实现安全访问。
为spring.profiles.active 配置以上4个值,可让配置服务器访问不同的仓库。在以上的配置中,指定了 SYN 仓库为 test-project,默认情况下,将会到 test-project/trunk 获取配置文件 可以添加 spring.cloud.config.server.default-label 配置来指定获取的目录,以上配置指 定了 default-config 为默认的配置目录。 为了能进行测试,在 SVN 中新建 default-config 目录,以及一份 first.properties 文件,如图所示。
测试文件 first-test.properties 配置了一个简单的属性 test.user.name=Angus。运行 spring config-server 的启动类,用浏览器访问地址 :http://localhost:8888/first-test.properties ,可以看到输出如下:
test.user.name: Angus
3、创建客户端
新建名称为 srl-book-server 的Maven 的项目,加入依赖如下:
springBoot 版本需要 是 1.5.12 2.1.1 不兼容以下依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>
建立启动类,并读取配置文件中的属性:
@SpringBootApplication
@RestController
public class SrlBookServerApplication {
// import org.springframework.core.env.Environment;
@Autowired
private Environment env;
@RequestMapping("/")
public String home() {
System.out.println("读取的值:" + env.getProperty("test.user.name"));
return "Hello";
}
public static void main(String[] args) {
SpringApplication.run(SrlBookServerApplication.class, args);
}
}
本例的启动类还承担了 Controller 的工作。当访问应用主页时, 会在控制台输出 test. user.name 的属性值, 而该值将会存在于 SVN 仓库的一份配置文件中。
此时启动 config-server 加 book-server ,并不能获取 test. user.name 的属性值,返回 :null
4、从客户端读取 SVN 配置
为什么要在 引导程序中:bootstrap.properties 读取配置文件的配置,不在application.properties 中读取: 因为 application.properties 中默认会加载许多初始化的Bean,而这些Bean有的需要配置。如果在 application.properties 会出现 加载不到这些Bean的配置。
由于客户端要在引导程序中读取配置服务器的配置,因此要新建名为 bootstrap.properties的配置文件。配置文件内 容请见代码清单
#指定应用名称
spring.application.name=book-server
#指定配置服务器的位置
spring.cloud.config.uri=http://localhost:8888
#指定读取的配置 -- dev pro test 文件名后半部分 多个逗号分隔
spring.cloud.config.profile=dev
#默认情况下,很多端点需要认证才能访问,关闭认证,默认开启 true
management.security.enabled=false
在代码清单的配置中,设定了应用名称为 book-server,使用 spring.cloud.config.uri 来设定配置服务器的位置, 而且使用 spring.cloud.config.profile 来指定读取的配置。 最终,配置客户端会到 SVN 服务器 test-project/default-config 目录下读取 book-server-dev. yml ( . properties )。 以下的配置同样会读取book-server-dev. yml ( . properties ):
#指定读取的配置文件名称 -- 多个逗号分隔
spring.cloud.config.name=book-server
以上配置使用了 spring.cloud.config.name 来代替spring.application.name。 如果两个属性都不提供,那么默认情况下会去读取 application-dev.yml文件。 新建一份 book-server.properties 文件, 上传到 SVN的 test-project/default-config,该文件的内容如下:
test.user.name: Angus
以上配置的值将会被客户端远程读取。依次启动服务器( 8888 端口) 和客户端( 8080 端口) ,在浏览器中访问 http ://localhost: 8080/, 可以看到客户端的控制台输出如下:
读取的值: Angus
根据结果可知,属性值己经被读取。我们建立的这个客户端 ,默认会到 SVN的test-project/default-config 下读取配置。 如果客户端想指定读取某个分支版本 ,或者其他目录下 的配置, 可以设置 spring.cloud.config.label 来覆盖服务器的 default-label 属性,例如以下配置:
#指定应用名称
spring.application.name=book-server
#指定配置服务器的位置
spring.cloud.config.uri=http://localhost:8888
#指定读取的配置 -- dev pro test 文件名后半部分 多个逗号分隔
spring.cloud.config.profile=dev
#配置获取配置文件的目录,默认使用config服务器里的配置
spring.cloud.config.server.default-label=book-module
#指定读取的配置文件名称 -- 多个逗号分隔
spring.cloud.config.name=book-server
在以上的配置中 该客户端会到 test-project/book-module 下读 book-server-dev.yml
spring.application.name 和 spring.cloud.config.name 区别:
spring.application.name 只是指定应用程序名称,如果不配置 spring.cloud.config.name , 就读取 spring.application.name + spring.cloud.config.profile 配置文件。如果配置了 spring.cloud.config.name , 只有spring.cloud.config.name 会生效,读取 spring.cloud.config.name + spring.cloud.config.profile 配置文件。哪怕spring.cloud.config.name 这个配置是错误的, spring.application.name 的配置也不会生效,不会被读取。
如果两个属性都不提供,那么默认情况下会去读取 application-dev.yml文件。
规范用法 spring.application.name 指定应用程序名称,spring.cloud.config.name 指定要读取的配置文件。