springcloud-config配置中心的使用

最近这两天在学习springcloud config的一些东西,学习这个最原始的动力是想要了解为什么要使用配置中心,而springcloud config就是现成的配置中心的实现的方案。至于搭建的过程,config的搭建的过程可以参考程序猿DD的博客,这里主要是把重要的点总结一下,顺便记录一下程序猿DD博客中没有的东西。配置中心提供了一个中心化的外部配置,默认使用git存储配置信息,这样就可以对配置信息进行版本管理,下边配置中心的搭建就是以git为基础进行的。配置中心是单独作为一个服务运行的,搭建这个服务需要引入以下jar包。
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</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>Brixton.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
并在这个的主类上添加@EnableConfigServer注解,开启配置中心的服务,下一步就是在application.properties配置文件中添加配置中心的服务信息和git的信息,如下
spring.application.name=config-server
server.port=8089
# git管理配置
spring.cloud.config.server.git.uri=https://gitee.com/txxs/springcloud/
spring.cloud.config.server.git.searchPaths=config/config-repo
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password
这是配置文件,应该是没有任何问题的,但是只限于GitHub和码云上,自己或公司搭建的gitlab则需要加上.git尾缀,否则会连接不上。需要重点说明的是spring.cloud.config.server.git.searchPaths这个属性,她定义了配置文件搜索的位置,可以配置多个,多个之间用逗号分隔,这样多个微服务就可以在配置中心有自己的配置文件,比如:spring.cloud.config.server.git.searchPaths=config/config-repo,config/config-repo/asset,至此配置中心的服务端便搭建完成,下一步就是在https://gitee.com/txxs/springcloud/的搜索路径中添加配置文件
common.properties 添加内容为common_service_config = common_test
common-dev.properties  添加内容为common_service_config = common_test_dev
common-test.properties  添加内容为common_service_config = common_test_test
common-prod .properties  添加内容为common_service_config = common_test_prod
访问这些配置信息有很多方式,个人认为最好的是/{application}/{profile}[/{label}],这种方式将分支label和应用名称application以及使用环境profile(dev、test以及prod)都表示了,更符合我的习惯,当然这个问题就看各自的选择了
通过http://localhost:8089/common/prod/master请求即可获得prod中的数据以及基本文件中的数据,如下图所示:

可以看到name为common,profile是prod,分支是master,数据为两个文件的数据,一个基本文件一个生产环境的文件的配置,在这种情况下就可以对配置中心的文件进行访问了。但是配置中心的客户端访问时需要引入jar包等操作
    <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>
然后在客户端创建bootstrap.properties文件,并在文件中添加以下内容,至于为什么使用bootstrap.properties文件,给出的解释是这样的:config的相关配置会先于application.properties,而bootstrap.properties的加载也是先于application.properties
#对应前配置文件中的{application}部分
spring.application.name=common
#对应前配置文件中的{profile}部分
spring.cloud.config.profile=prod
#对应前配置文件的git分支
spring.cloud.config.label=master
#配置中心的地址
spring.cloud.config.uri=http://localhost:8089/
新建Java的controller类之后就可以看到使用的情况了,重点的是@Refresh注解
@RefreshScope
@RestController
public class TestController {

    @Value("${common_service_config}")
    private String common_service_config;

    @RequestMapping("/service")
    public String from() {
        return this.common_service_config ;
    }
}
访问结果如下图所示:

至此客户端的就可以访问配置中心的配置信息了,但是还有一个问题是,如何实现动态刷新的问题,一个场景是在配置中心修改了配置文件的内容,相应的客户端也应该在无感知的情况下获取到相关的最新内容,有两种方案,一种是客户端手动刷新,另一种是配置中心服务端调用刷新,客户端无感知,首先说第一种
首先在客户端添加spring-boot-starter-actuator模块,其中包含了/refresh 端点的实现,该端点将用于实现客户端应用配置信息的重新获取与刷新。
		<dependency>
			<groupid>org.springframework.boot</groupid>
			<artifactid>spring-boot-starter-actuator</artifactid>
		</dependency>
jar包添加完成之后,重启客户端就可以实现手动刷新的功能了,流程是:
第一、调用http://localhost:8090/service,返回common_test_prod
第二、修改配置中心的common-prod配置文件中的common_service_config属性为common_test_prod add refresh
第三、调用http://localhost:8090/service,依旧返回common_test_prod
第四、调用http://localhost:8090/refresh,注意这里是POST方法
第五、调用http://localhost:8090/service,返回common_test_prod add refresh
至此手动刷新的流程就可以实现了,但是这明显不是我们想要的内容,配置中心修改内容,客户端需要手动刷新这样不对,那就是第二种方案,再在客户端添加以下jar包
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-bus-amqp</artifactId>
		</dependency>
		#在配置文件中添加以下内容
		spring.rabbitmq.host=消息队列地址
		spring.rabbitmq.port=5672
		spring.rabbitmq.username=test
		spring.rabbitmq.password=test
然后在码云上使用webhooks 发送 http://你的公网IP:8090/bus/refresh,返回的内容如下内容common_test_prod add refresh send to one client,客户端就可以在无感知的情况将值更新了,至于为什么这样,应该是refresh请求将更新的内容发送到总线队列上去,然后客户端获取到相关的值后将@RefreshScope有关的值更新了,但是这只是更新了一个客户端,那怎么才能发一个请求更新所有客户端呢,答案是将总线队列放在配置中心的服务端,同样要在服务端添加以下内容
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-bus-amqp</artifactId>
		</dependency>
		#在配置文件中添加以下内容
		spring.rabbitmq.host=消息队列地址
		spring.rabbitmq.port=5672
		spring.rabbitmq.username=test
		spring.rabbitmq.password=test
然后在码云上使用webhooks 发送 http://你的公网IP:8089/bus/refresh,那么你的公网的服务和本地的服务都可以获取到最新的值为common_test_prod add refresh send to all client,这样就可以实现一下将所有值都刷新的目的,这样可以有一个非常好的用途,那就是在memcached等服务地址变化频繁的情况下不用重启服务而刷新memcached的地址配置地址,并刷新相应的bean,当然这个bean上应该有@RefreshScope注解,感觉这是一个非常强大的功能。
为了提高配置中心的可用性,还可以将配置中心注册在服务中心。服务中心使用的是Eureka,将配置中心注册在服务中心的需要修改配置中心的客户端和服务端两个部分,服务端修改内容为,添加服务中心jar包
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
并在配置文件中添加以下配置文件
eureka.client.serviceOrl.defaultZone=http://localhost:8080/eureka/
在启动类上添加以下注解
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
这样配置中心的服务端就算配置完成了,配置中心的客户端配置内容需要,添加jar包
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
配置文件,由原来的
spring.application.name=common
spring.cloud.config.profile=prod
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:8089/
server.port=8090
修改为
spring.application.name=common
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceid=config-server
spring.cloud.config.profile=prod
然后就可以像服务直接调用配置中心数据那些调用服务中心配置的信息了,这样就提高了配置中心的可用性,将配置中心服务化,个人认为这是非常好的用法,微服务中配置文件的内容也会进一步简化。在服务注册和发现过程中出现问题的时候,可以先去服务的注册地址http://localhost:8080/看看服务有没有注册,如果注册了再看调用端问题。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章