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管理界面的看,有这条信息则配置成功
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管理界面
即配置成功 。
下面就和首图一样去调用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: "*"
启动项目日志打印出以下内容算配置成功
如上所示,这是一个post 方法,我们可以模拟一个post请求手动刷新一下,这里我用的soapUi
发送请求后rabbitMQ的队列有消息反应即配置成功
然后我们也可以去看 Postman的控制台和ConfigServer的控制台
configServer
Postman
互相也找到了,但是现在改文件还是没有更新配置信息
然后下面的小坑就是要在使用到文件变量的地方加注解@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 就可以不用重启项目即更改变量
下面有个实际使用的小例子
在配置文件加入一段自定义变量(前缀为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 设定 更新自动刷新
这里再提到一个小工具,假如内网没法到外网可以借助