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.他都做了什么呢 ?
-
-
-
配置中心會發送消息至所有用戶服務,告知需要拉取最新配置
-
所有用戶服務接收到消息,從配置中心獲取最新配置
-
完成更新
-