springBoot+springCloud配置同步及自动更新

一、配置类如何读取配置

比如:CommonConfiguration.java就是一个读取配置文件java类。通过@Value注解读取application.properties配置文件中的配置。

如下图所示:@Value(“${sourceid}”)读取的就是application.properties配置文件中sourceid对应的值。

如果在配置sourceid时需要为其添加默认值,可以使用“:”后面跟上默认值即可@Value(“${sourceid:默认值}”)。

 

如下图所示:这是一个读取手机号码前缀配置项的示例。Msisdn.prefix.cmcc在application.properties配置文件中存放的值是“139,131,137.......”这种格式的字符串。在取值的时候需要的是以逗号分隔后的字符串数组。所以在读取配置文件java类中创建了一个String类型的数组,在对msisdnPrefixCmcc进行set值的同时会对该字符串进行逗号分隔并存放到创建的字符串数组中。

二、使用类读取方式

1、注入读取:

在需要读取配置项的java类中通过@AutoWired注解将对应的读取配置文件java类注入。调用get方法读取配置项。

2、通过bean名获取对象读取:

在静态方法中无法使用正常@AutoWired注解注入的读取配置文件对象来读取配置项,但是@AutoWired注解注入不支持静态注入。所以使用通过bean名的方式来获取spring管理的bean。

工具类名:ApplicationContextxHelper

使用ApplicationContext.getBean()获取spring管理的bean实例。该类需要加上@Component注解,让psring在一开始就扫描到该类并创建出实例。

使用方法:

通过指定bean名及bean的类型来实例化出静态的读取配置文件对象。同样使用get方法进行读取配置项。

三、配置中心搭建及读取配置中心配置

Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client(客户)和Server(服务)两个部分。

1、Server端配置:

Spring Cloud Config Server本质上也是一个Spring Boot的web项目,只需要添加对应的parent,然后加入相关的依赖就可以启动这个工程了。

Maven的pom.xml中需要添加以下内容:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-server</artifactId>
</dependency>

 

config server的resource目录下的application.properties:

 在linux目录/home/migu_ms/normandy-service下创建配置文件

在配置中心的application.properties文件中也可以指定“spring.cloud.config.uri”。标明配置中心的地址及端口号,在Client(客户)端需要指明配置中心的地址及端口号。

spring.cloud.config.server.git.uri=file://Users/whthomas/config-repo指的项目配置仓库的位置,这个位置可以是:git文件夹、svn文件夹或者github项目位置,任何能访问到文件的地方。

环境仓库(例子中的文件夹中)中提供环境配置对象配资源给Config Server发布给各个consumer使用。

环境资源的命名规则由以下的三个参数确定:

{application}映射到Config客户端的spring.application.name属性

{profile}映射到Config客户端的spring.profiles.active属性,可以用来区分环境,比如dev,test,produce等等

{label}映射到Git服务器的commit id,分支名称或者tag,默认值为master

主类中使用注解@EnableConfigServer,开启Config Server功能。

 2、Client端配置:

Maven的pom.xml中需要添加以下内容:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

 

resource目录下的bootstarp.properties添加这样几个配置:

  • 配置中心服务的地址 spring.cloud.config.uri
  • 要读取的配置文件application属性 spring.cloud.config.name
  • 要读取的配置文件profile属性,默认是dev spring.cloud.config.profile

在这里“配置中心地址”和“配置中心暴露的服务名”只需要配置其中一个即可。 

以上配置完成之后,在远端配置中心的对应的配置就会加载到项目中,和本地使用application.properties配置中添加配置是几乎一样的效果,使用@Value注解的配置也可以顺利读取到对应的配置。

 四、配置中心同步(方法一)

配置中心添加pom依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

各微服务添加pom依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

各微服务添加bootstrap配置文件配置:

## 刷新时,关闭安全验证 
management.security.enabled=false 
## 开启消息跟踪 
spring.cloud.bus.trace.enabled=true 

spring.rabbitmq.host=172.30.140.168 
spring.rabbitmq.port=5672 

 配置完成后当配置中心修改配置后需要调用接口:http://172.20.10.4:9007/bus/refresh

目前测试使用了normandy和flow两个项目,当同时修改配置中心中normandy、flow的配置。不调用http://172.20.10.4:9007/bus/refresh接口获取的还是未修改时的配置;调用http://172.20.10.4:9007/bus/refresh接口后能过加载修改后的配置。

调用http://172.20.10.4:9007/bus/refresh接口刷新配置,配置中心、各微服务(normandy、flow)都不需要重启。

 

四、配置中心同步(方法二)

该方法未亲身实践,对于springBoot+springCloud来说这么常见的问题应该会有内置的解决方案。于是在网上便找到了内置解决方案的文章。

文章链接:https://blog.csdn.net/cml_blog/article/details/78411312

解决办法就是在需要动态刷新的配置类上(这里的配置类就是我这篇文章标题一里讲到的读取配置文件的类)加上@RefreshScope注解。

加上@RefreshScope注解后和方法一相同,在修改了配置中心的配置后还是需要调用一个post接口来告诉各节点配置已经修改。

配置完成后当配置中心修改配置后需要调用接口:http://172.20.10.4:9007/refresh

@RefreshScope注解的原理在那篇文章里有详细的说明,感兴趣的小伙伴可以去看看。

五、配置中心自动同步

在上述两个方法中都需要手动调用一个接口来完成配置的刷新。如果需要做到完全的自动刷新可以使用git的webhooks来完成。配置相当简单,可以参考文章:https://www.cnblogs.com/andyfengzp/p/6835969.html 中的最后内容。

猜你喜欢

转载自blog.csdn.net/HPLJAVA/article/details/82218255