Spring Cloud(Dalston.SR5)--Config 集群配置中心-刷新配置
远程 SVN 服务器上面的配置修改后,需要通知客户端来改变配置,需要增加 spring-boot-starter-actuator 依赖并将
management.security.enabled 设置为 false,然后访问客户端的 /refresh 端点进行刷新,访问改端点要使用 HTTP 的 POST 方法,客户端的 refresh 在接收到请求后,会重新到配置服务器获取最新的配置,然后用新的配置和旧配置进行对比,最终把有修改的配置 Key 返回给调用者。
在实际应用中,往往不仅是刷新一个配置的值那么简单,由于 Spring 容器中的很多 Bean 都是根据某个属性值来进行初始化的,配置一旦更新,需要重建这个 Bean 的实例,为了解决这个问题,可以使用 @RefreshScope 注解来标注 Bean,但 /refresh 端点被访问时,负责处理刷新的 ContextRefresher 类,会先去远程的配置服务刷新配置,然后再调用 RefreshBean 的 refreshAll 方法来处理实例,容器中使用了 @RefreshScope 注解进行修饰的 Bean,都会在缓存中销毁,当这些 Bean 被再次引用时,就会创建新的实例,从而达到刷新的效果。
刷新配置示例
- 增加依赖
为了支持配置文件的刷新操作,需要增加依赖 spring-boot-starter-actuator ,修改 POM.xml 文件内容如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.lixue.config</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-cloud-config-client</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath/><!--lookupparentfromrepository-->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR5</spring-cloud.version>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 增加配置
修改 src/main/resources 目录下的 bootstrap.yml 配置文件,内容如下:
#配置应用名称
spring:
application:
name:spring-cloud-config-client
#配置分布式配置中心地址和相关配置
cloud:
config:
uri:http://localhost:8080
#表示分支,客户端配置后,会替换到分布式配置中心的default-lable配置
label:test
#表示配置文件名称,如果不配置则使用spring.application.name配置项
name:spring-cloud-config-client
#表示配置文件的profile,实际获取文件为${spring.cloud.config.name}-${spring.cloud.config.profile}.yml
profile:dev
# 关闭管理安全控制
management:
security:
enabled:false
- 测试REST服务
Info 类的 Bean 是根据配置文件的 info.name 和 info.desc 属性来创建的,newInfo 方法被注解 @Bean 和 @RefreshScope 标注,表示刷新时,需要从缓存销毁。
package org.lixue.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyRESTController{
@Autowired
private Environment environment;
@Autowired
private Info info;
@RequestMapping(path="/",method=RequestMethod.GET)
public String getApplicationName(){
return environment.getProperty("spring.application.name");
}
@RequestMapping(path="/myInfo",method=RequestMethod.GET)
public String getInfo(){
return info.getName()+"-"+info.getDesc();
}
@Bean
@RefreshScope
public Info newInfo(){
Info info=new Info();
info.setName(environment.getProperty("info.name","null"));
info.setDesc(environment.getProperty("info.desc","null"));
return info;
}
static class Info{
private String name;
private String desc;
public String getName(){
returnname;
}
public void setName(Stringname){
this.name=name;
}
public String getDesc(){
returndesc;
}
public voids etDesc(Stringdesc){
this.desc=desc;
}
}
}
- 测试验证
首先启动 spring-cloud-config 项目和 SVN 服务,目前 SVN 服务的相关配置文件内容如下:
spring:
application:
name:spring-cloud-config-client-dev
server:
info:
name:refresh
desc:刷新Bean测试
访问 http://localhost:8013/myInfo 返回结果为:"refresh-刷新Bean测试",修改 SVN 服务的相关配置文件内容如下:
spring:
application:
name:spring-cloud-config-client-dev
server:
info:
name:refresh
desc:刷新Bean测试,修改后的
使用 HTTP 的 POST 方法访问 http://localhost:8013/refresh ,然后再次访问 http://localhost:8013/myInfo ,可以看到返回结果已经返回了新配置文件的内容:"refresh-刷新Bean测试,修改后的"
Spring Cloud(Dalston.SR5)--Config 集群配置中心-刷新配置的更多相关文章
- Spring Cloud(Dalston.SR5)--Config 集群配置中心
Spring Cloud Config 是一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,他分为服务端和客户端两个部分.服务端也称为分布式配置中心,是一个独立的微服务 ...
- Spring Cloud(Dalston.SR5)--Config 集群配置中心-加解密
实际应用中会涉及很多敏感的数据,这些数据会被加密保存到 SVN 仓库中,最常见的就是数据库密码.Spring Cloud Config 为这类敏感数据提供了加密和解密的功能,加密后的密文在传输给客户端 ...
- Spring Cloud(Dalston.SR5)--Zuul 网关-微服务集群
通过 url 映射的方式来实现 zuul 的转发有局限性,比如每增加一个服务就需要配置一条内容,另外后端的服务如果是动态来提供,就不能采用这种方案来配置了.实际上在实现微服务架构时,服务名与服务实例地 ...
- Spring Cloud(Dalston.SR5)--Zuul 网关-路由配置
Spring Cloud 在 Zuul 的 routing 阶段实现了几个过滤器,这些过滤器决定如何进行路由工作. 简单路由(SimpleHostRoutingFilter) 该过滤器运行后,会将 H ...
- Spring Cloud(Dalston.SR5)--Eureka 常用配置
配置参数 默认值 说明 服务注册中心配置 Bean类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean eu ...
- Spring Cloud之Zuul网关集群
Nginx+Zuul 一主一备 或者 轮训多个 在微服务中,所有服务请求都会统一到Zuul网关上. Nginx 配置: #user nobody; worker_processes 1; #error ...
- Spring Cloud(Dalston.SR5)--Zuul 网关-Hystrix 回退
当我们对网关进行配置让其调用集群的服务时,将会执行 Ribbon 路由过滤器,该过滤器在进行转发时会封装为一个 Hystrix 命令予以执行,Hystrix 命令具有容错的功能,如果"源服务 ...
- Spring Cloud(Dalston.SR5)--Zuul 网关
我们使用 Spring Cloud Netflix 中的 Eureka 实现了服务注册中心以及服务注册与发现:而服务间通过 Ribbon 或 Feign 实现服务的消费以及均衡负载:使用Hystrix ...
- Spring Cloud(Dalston.SR5)--Hystrix 监控
在服务调用者加入 Actuator ,可以对服务调用者的健康情况进行实时监控,例如,断路器是否打开.当前负载情况等. 服务调用者 需要增加 actuator依赖, 修改 POM.xml 中增加以下依赖 ...
随机推荐
- 怎么单独为ionic2应用的某一组件设置两个平台一致的样式
今天在继续项目的过程中,发现ionic2在显示样式上是根据不同的平台采用不同的样式,使在不同平台上的应用保持相应的风格,于是问题来了. ios的风格比较好看,android的风格略微不如ios的,所以 ...
- Vue语法学习第二课——指令
指令,是指在Vue中,带有-v前缀的特殊特性 指令特性的值预期是单个JavaScript表达式(v-for例外) <p v-if="seen">看得到</p> ...
- day16 面向对象二
类的成员之变量 1. 实例变量. 对象.xxx = xxx 2. 类变量. 直接写在类中的变量就是类变量. 类变量一般用类名来访问. 对象中共性的属性提取出来. 例: class A: a = 1 # ...
- 个人洛谷账号地址——https://www.luogu.org/space/show?uid=181909 附上NOIP查分系统
个人洛谷地址: https://www.luogu.org/space/show?uid=181909 NOPI查分地址: http://bytew.net/OIer/
- python3 进行字符串、日期、时间、时间戳相关转换
1.字符串转换成时间戳 2. 日期转换成时间戳
- linux文件系统与存储结构
- WPF自定义用户控件不显示
1,Themes\Generic.xaml最好不要更名 "Generic.xaml"这个名称并非偶然通过上面的叙述,你可能会有冲动将Generic.xaml中的Style代码剪切出 ...
- keil折叠代码
在代码页面右键 Outlining->Start All Outlining
- more语法
二.more 文件内容或输出查看工具 more 是我们最常用的工具之一,最常用的就是显示输出的内容,然后根据窗口的大小进行分页显示,然后还能提示文件的百分比: [root@localhost ~]# ...
- python—文件创建
# 1.文件操作# day1.txt# 1.文件路径:E:\day1.txt# 2.编码方式:utf-8.gbk# 3.操作方式:只读,只写,追加,读写,写读# 以什么编码方式储存的方式储存就以什么编 ...