BUS也可以这么解释消息通路,总线

之前提到直接修改外部配置文件,不需要重启项目。

但是之前一节并没有实现,那是因为文件是修改了,但是没有人告诉项目我文件修改了。。。

下面开始操作

首先再配置中新ConfigServer的Pom文件引入依赖

<!-- bus想上就上 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-bus-amqp</artifactId>
		</dependency>

然后去ConfigServer配置中心的配置文件去添加rabbitmq的地址(假如不配置,他默认的会去找本地的5672端口)

rabbitmq:
    host: 192.168.226.140
    port: 5672
    username: guest
    password: guest

配置完成启动服务后可以去rabbitMQ管理界面的看,有这条信息则配置成功

springcloud config动态刷新 springcloud bus配置中心刷新_bus

BUS服务端配置完成,下面来配置服务端(例如postman)

同样也是添加依赖

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

并也去修改配置文件填写入RabbitMQ地址用户密码

spring:
  datasource:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    password: znjtpostman
    url: jdbc:oracle:thin:@192.168.66.226:1521:znjt
    username: znjtpostman
  application:
    name: EurekaClient-PostMan
  rabbitmq:
    host: 192.168.226.140
    port: 5672
    username: guest
    password: guest
mybatis:
  mapper-locations: classpath*:com/sola/mappers/**/*.xml
server:
  port: 30525
#eureka:
  #client:
    #service-url:
     #defaultZone: http://localhost:30520/eureka/,http://localhost:31520/eureka/
solaname: 是天才

运行 再去看RabbitMQ管理界面

springcloud config动态刷新 springcloud bus配置中心刷新_spring_02

即配置成功 

下面就和首图一样去调用Config-Server/bus-refresh(这是简写)(http://localhost:30530/actuator/bus-refresh)接口,但是这个接口默认没有暴露出来,还要去做相关的配置。

去configServer的配置文件添加暴露接口

server.port=30530

spring.application.name=Config-Server

eureka.client.service-url.defaultZone: http://localhost:30520/eureka/,http://localhost:31520/eureka/

spring.profiles.active=native

#spring.cloud.config.server.native.search-locations=classpath:/config
spring.cloud.config.server.native.search-locations=D:/nativeconfig

spring.rabbitmq.host=192.168.226.140
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

//主要,暴露出所有节点,包括/bus-refresh
management.endpoints.web.exposure.include="*"

这里又有个坑 不知道 properties的配置怎么配 测试几种都失败下面改用yml格式.。。。。

server:
  port: 30530
spring:
  application:
    name: Config-Server
  profiles:
    active:
    - native
  cloud:
    config:
      server:
        native:
          search-locations:
          - D:/nativeconfig
  rabbitmq:
    host: 192.168.226.140
    port: 5672
    username: guest
    password: guest
eureka:
  client:
    service-url:
      defaultZone: http://localhost:30520/eureka/,http://localhost:31520/eureka/
management:
  endpoints:
    web:
      exposure:
        include: "*"

启动项目日志打印出以下内容算配置成功

springcloud config动态刷新 springcloud bus配置中心刷新_spring_03

如上所示,这是一个post 方法,我们可以模拟一个post请求手动刷新一下,这里我用的soapUi

springcloud config动态刷新 springcloud bus配置中心刷新_springcloud_04

发送请求后rabbitMQ的队列有消息反应即配置成功

springcloud config动态刷新 springcloud bus配置中心刷新_spring_05

然后我们也可以去看 Postman的控制台和ConfigServer的控制台

configServer

springcloud config动态刷新 springcloud bus配置中心刷新_springcloud_06

Postman

springcloud config动态刷新 springcloud bus配置中心刷新_配置文件_07

互相也找到了,但是现在改文件还是没有更新配置信息

然后下面的小坑就是要在使用到文件变量的地方加注解@RefreshScope

@RestController
@RequestMapping("eurekaApi")
@RefreshScope
public class PostManController {
	
	@Value("${solaname}")
	private String name;
	
	@Autowired
	private ResourcesService resourcesservice;
	
	@GetMapping(value="test")
	@ApiOperation("小测试")
	public String oneTest(){
		
		return "一个小测试COPY2"+name;
	}
}

然后再去改配置文件中的 solaname 然后去调用post请求的/bus-refresh 就可以不用重启项目即更改变量

springcloud config动态刷新 springcloud bus配置中心刷新_springboot_08

springcloud config动态刷新 springcloud bus配置中心刷新_springboot_09

下面有个实际使用的小例子

在配置文件加入一段自定义变量(前缀为sola)

sola:
  name: 昊天天
  age: 100

然后就可以建立一个类前面加上@refresScope注解

这里@ConfigurationProperties("sola") 里填入sola 配置中同名的自动映射

package com.sola.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties("sola")
@RefreshScope
public class Sola {
	
	private String name;
	
	private String age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}
	
}

然后去别的接口自动注入此类调用get方法即可

假如用git 方案 可以用 git 自带的 wekhooks  设定 更新自动刷新

springcloud config动态刷新 springcloud bus配置中心刷新_配置文件_10

这里再提到一个小工具,假如内网没法到外网可以借助

springcloud config动态刷新 springcloud bus配置中心刷新_bus_11