21、集群配置中心准备

98 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 文件,如图所示。

image.png

测试文件 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 指定要读取的配置文件。

image.png