3.配置刷新机制设计和实现方式(两种)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
yml配置文件,如果是私有库需要设置用户密码
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/xxxx/xxx.git
#如果设置了私有仓库那么需要配置用户名和密码
username: xxx
password: xxx
server:
port: 9999
#配置eureka客户端
eureka:
client:
service-url:
defaultZone: http://eureka1:8761/eureka,http://eureka2:8762/eureka
创建一个git仓库
抽取服务提供者的共有配置内容,比如mysql配置
最后一个字段alicName用来区别环境。
配置UserService用户服务提供者
导包,让提供者也拥有config配置中心支持
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
application/bootstrap,这两个都是boot启动是默认加载的配置文件。
application: 一般用于配置用户的配置
bootstrap:一般用于配置程序启动的引导配置,优先级别最高
先修改配置文件名
application.yml-->bootstrap.yml
修改后的
spring:
application:
name: user-server
#被提取到gitee中了
cloud:
config:
discovery:
#开启使用config配置中心
enabled: true
#配置中心服务应用名称
service-id: config-server
#git分支名称
label: master
#git文件名称
name: user
#git文件环境
profile: test
#mybatis别名
#被提取到gitee中了
#配置eureka客户端
eureka:
client:
service-url:
defaultZone: http://eureka1:8761/eureka,http://eureka2:8762/eureka
instance:
prefer-ip-address: true
server:
port: 8001
标红的 service-id 属性必须与eruake中的注册的config服务名相同才能拉取到配置
启动
顺序:注册中心 ----> 配置中心 ----> 用户服务
配置更新问题
加入此时git中的配置文件有修改我们此时需要重启Config配置的项目进行拉去最新配置,然后重启提供者项目从eruake中拉取更配置。
如果是线下测试项目还好说,如果是线上项目可能会造成损失。
解决方案:
1.重启用户服务(不建议)
2.加入依赖 actuator,提供一个刷新配置的接口进行动态更新
3.使用rabbitmq进行集群更新
第一个介绍过了,我们直接介绍后面两种的具体使用方法。
actuator使用方法
还是在服务提供者项目中加入依赖
<!--健康检测 监测--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在配置文件中添加配置,暴露一个刷新的接口
management:
endpoints:
web:
exposure:
#此处刷新地址必须叫refresh
include: refresh
在接口controller添加注解 @RefreshScope,不能加载启动类上,会无效!无效!无效!无效!无效!
@RestController @RefreshScope public class UserController { @Autowired UserService userService;
........
现在我们重启项目然后测试一下,因为配置中心使用的是test环境,所以修改test的配置文件
在controller暴露一个属性实时查看效果,对应到实体类中的massage属性
刷新前测试没有变化
使用暴露的接口进行刷新
提示刷新成功。
再进行测试
已经刷新到最新的修改了。动态修改配置成功。
注意事项:
1.actuator包局限性大,每次只能刷新一个服务的配置,例如我们的提供者服务是集群搭建那么就不能只刷新8001端口了,需要刷新所有的服务。
2.请求的刷新地址是固定的 http://{你的主机名}:{服务暴露的端口}/actuator/refresh,并且Content-Type必须为application/json,必须是POST请求。
3.推荐使用rabbitmq的全局刷新
RabbitMq刷新配置和使用,
需要注意的是上一种方式只需要修改服务提供者,使用rabbitmq需要同时对提供者和配置中心进行修改。
Config配置中心
导包
<!--健康检测 监测--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
<!--mq支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
修改配置文件
-
-
rabbitmq port端口
-
暴露刷新地址 --> bus-refresh
在spring:下添加
rabbitmq:
#你的rabbitmq地址 host: xx.xxx.xx.xxx
#若没修改以下属性则会自动配置为默认
# port: 5672
# username:
# password:
与spring:平级直接添加
management:
endpoints:
web:
exposure:
#此处暴露地址必须叫 bus-refresh
include: bus-refresh
导包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
spring: 下添加配置
#此处注意rabbitmq前面有缩进,一定添加到spring下
rabbitmq:
host: xx.xxx.xxx.xxx
发送请求
可能会状态码204,但是不影响结果,按照步骤修改git配置文件,然后发送请求就可以看到结果了。
总结
1.请求必须是post,http://{你的主机地址}:{端口号}/actuator/bus-refresh,刷新全部
2.也持支刷新单个 http://{你的主机地址}:{端口号}/actuator/bus-refresh/{eruake中的服务名:端口号}
3.他都做了什么呢 ?
-
-
-
配置中心会发送消息至所有用户服务,告知需要拉取最新配置
-
所有用户服务接收到消息,从配置中心获取最新配置
-
完成更新
-