开启springcloud全家桶7:使用spring cloud config来统一管理配置文件

Posted 黄小斜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开启springcloud全家桶7:使用spring cloud config来统一管理配置文件相关的知识,希望对你有一定的参考价值。

这篇文章主要介绍了详解使用spring cloud config来统一管理配置文件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可以实现当配置文件发生变化的时候,系统会自动更新获取新的配置。

其架构原理图大致如下:

我们将配置文件放入git或者svn等服务中,通过一个Config Server服务来获取git中的配置数据,而我们需要使用的到配置文件的Config Client系统可以通过Config Server来获取对应的配置。

下面我们通过一个示例来演示一下config是如何被各个微服务系统获取到的。

1.向git中上传示例配置文件

1

2

3

4

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://127.0.0.1:3306/taotao?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true

jdbc.username=root

jdbc.password=root

文件名分别为:

1

2

3

microservice-dev.properties

microservice-production.properties

microservice-test.properties

对应不同的三个环境。

该文件的命名规则是:{application}-{profile}.properties

2.搭建Config Server

2.1 添加依赖

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

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

<parent>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-parent</artifactId>

  <version>1.5.4.RELEASE</version>

</parent>

 

<!-- 导入Spring Cloud的依赖管理 -->

<dependencyManagement>

  <dependencies>

    <dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-dependencies</artifactId>

      <version>Dalston.SR3</version>

      <type>pom</type>

      <scope>import</scope>

    </dependency>

    <dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-starter-eureka-server</artifactId>

      <exclusions>

        <exclusion>          

          <groupId>com.fasterxml.jackson.dataformat</groupId>

          <artifactId>jackson-dataformat-xml</artifactId>

        </exclusion>

      </exclusions>

    </dependency>

  </dependencies>

</dependencyManagement>

 

<dependencies>

  <dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-config-server</artifactId>

  </dependency>

  <!-- 使用bus总线的方式通知所有的微服务配置文件需要刷新 -->

  <dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-bus-amqp</artifactId>

  </dependency>

</dependencies>

 

<build>

  <finalName>${project.artifactId}</finalName>

  <plugins>

    <!-- 资源文件拷贝插件 -->

    <plugin>

      <groupId>org.apache.maven.plugins</groupId>

      <artifactId>maven-resources-plugin</artifactId>

      <configuration>

        <encoding>UTF-8</encoding>

      </configuration>

    </plugin>

    <!-- java编译插件 -->

    <plugin>

      <groupId>org.apache.maven.plugins</groupId>

      <artifactId>maven-compiler-plugin</artifactId>

      <configuration>

        <source>1.8</source>

        <target>1.8</target>

        <encoding>UTF-8</encoding>

      </configuration>

    </plugin>

  </plugins>

</build>

2.2 编写ConfigApplication

1

2

3

4

5

6

7

8

9

10

@EnableDiscoveryClient

@EnableConfigServer //开启配置服务

@SpringBootApplication

public class ConfigApplication {

 

  public static void main(String[] args) {

    SpringApplication.run(ConfigApplication.class, args);

  }

 

}

2.3 编写yml配置文件

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

31

server:

 port: 6688 #服务端口

 

spring:

 application:

  name: microservice-config-server #指定服务名

 cloud:

  config:

   server:

    git: #配置git仓库地址

     uri: 具体的配置文件的git地址

     #username:

     #password:

 rabbitmq: #RabbitMQ相关的配置

  host: 127.0.0.1

  port: 5672

  username: guest

  password: guest

 

eureka:

 client:

  registerWithEureka: true #是否将自己注册到Eureka服务中,默认为true

  fetchRegistry: true #是否从Eureka中获取注册信息,默认为true

  serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址

   defaultZone: http://cloud:cloud@127.0.0.1:6868/eureka/

 instance:

  prefer-ip-address: true #将自己的ip地址注册到Eureka服务中

  ipAddress: 127.0.0.1

management:

 security:

  enabled: false #是否开启actuator安全认证

这是我们启动该服务,访问该配置文件,访问路径示例如下(以该配置为例): 127.0.0.1:6688/microservice-dev.properties

访问路径的写法也有多种方式:

 

1

2

3

4

5

6

/{application}/{profile}/[label]

/{application}-{profile}.yml

/{label}/{application}-{profile}.yml

/{application}-{profile}.properties

/{label}/{application}-{profile}.properties

其中{label}是指分支,默认是master。

3. Config Client的搭建

3.1 添加依赖

1

2

3

4

5

6

7

8

9

10

11

12

<dependency>

  <groupId>org.springframework.cloud</groupId>

  <artifactId>spring-cloud-starter-config</artifactId>

</dependency>

<dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

<dependency>

  <groupId>org.springframework.cloud</groupId>

  <artifactId>spring-cloud-starter-bus-amqp</artifactId>

</dependency>

3.2 添加yml配置文件

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

eureka:

 client:

  serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址

   defaultZone: http://cloud:cloud@127.0.0.1:6868/eureka/

spring:

 cloud:

  config:

   name: microservice #对应的配置服务中的应用名称

   profile: dev #对应配置服务中的{profile}

   label: master #对应的分支

   discovery:

    enabled: true #启用发现服务功能

    service-id: microservice-config-server #指定服务名称

 spring:

 application:

  name: itcasst-microservice-config-server #指定服务名

 cloud:

  config:

   server:

    git: #配置git仓库地址

     uri: http://172.16.55.138:10080/zhangzhijun/itcast-config-server.git

     #username: zhangzhijun

     #password: 123456

 rabbitmq: #RabbitMQ相关的配置

  host: 127.0.0.1

  port: 5672

  username: guest

  password: guest

注意,这里的yml配置文件是:bootstrap.yml,它和application.yml文件一样,会被spring boot加载,但是bootstrap.yml会优先加载。

3.3 在application.yml文件中添加配置

1

2

3

management:

 security:

  enabled: false #是否开启actuator安全认证

3.4 利用git的webhook实现实时更新通知

这个时候,我么通过@Value的方式,就可以获取到对应的配置了。

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

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

@RefreshScope

@Component//加入到Spring容器

public class JdbcConfigBean {

 

  @Value("${jdbc.url}")

  private String url;

 

  @Value("${jdbc.username}")

  private String username;

 

  @Value("${jdbc.password}")

  private String password;

 

  @Value("${jdbc.driverClassName}")

  private String driverClassName;

 

  public String getUrl() {

    return url;

  }

 

  public void setUrl(String url) {

    this.url = url;

  }

 

  public String getUsername() {

    return username;

  }

 

  public void setUsername(String username) {

    this.username = username;

  }

 

  public String getPassword() {

    return password;

  }

 

  public void setPassword(String password) {

    this.password = password;

  }

 

  public String getDriverClassName() {

    return driverClassName;

  }

 

  public void setDriverClassName(String driverClassName) {

    this.driverClassName = driverClassName;

  }

 

  @Override

  public String toString() {

    return "JdbcConfigBean [url=" + url + ", username=" + username

        + ", password=" + password + ", driverClassName="

        + driverClassName + "]";

  }

 

}

再次测试,我们发现当我们修改了git中的配置文件的内容之后,client系统中读取到的属性也是修改之后的了。

到此为止,其架构变成如下:

以上是关于开启springcloud全家桶7:使用spring cloud config来统一管理配置文件的主要内容,如果未能解决你的问题,请参考以下文章

开启springcloud全家桶1:springcloud套餐简介

开启springcloud全家桶10:用SpringCloud Admin快速搭建你的监控中心

开启springcloud全家桶3:服务注册中心erueka原理与实践

开启springcloud全家桶4:极简API调用方式 Spring Cloud Feign 总结

开启springcloud全家桶9:springcloud的分布式链路追踪利器 Sleuth

开启springcloud全家桶2:初探Hystrix原理与实践