Tips:
springcloud版本:Finchley.RELEASE
springboot版本:2.0.8.RELEASE
jdk:1.8
rabbitmq : 用默認用戶guest
當你看到這篇時卧惜,你可能看了好多篇關(guān)于配置刷新的文章打月,但是都不能解決你的問題,要么版本不一致发框,配置出問題,mq有問題等等钞瀑,放輕松又沾,慢慢往下看,然后就很舒服跳芳。折騰了一天的坑,踩過了大大小小的坑竹勉,終于把config利用bus-amqp基于webhook的自動刷新給解決了飞盆。
首先,快速搭建一套eureka server、eureka client 吓歇、config-server 孽水,@EnableDiscoveryClient在F版本可以省略了,三步走依賴城看、注解女气、配置。
一测柠、 搭建項目
- 我最簡化了配置文件炼鞠,能不寫的就不寫,以防我們在剛學(xué)的時候擔(dān)心這個配置一定要寫嗎轰胁?不寫有什么影響呢谒主?各種疑慮影響游戲體驗。有興趣的可以自己研究cloud里面的配置赃阀。在父工程里添加版本號霎肯,公共模塊
spring-boot-starter-web
,spring-boot-starter-actuator
,依賴太長就不貼了。代碼鏈接在下面榛斯,就為了讓你先看一眼配置观游。 - eureka server
依賴:
- eureka server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
注解:@SpringBootApplication @EnableEurekaServer
配置:
### 注意 文件名為application.yml
spring:
application:
name: eureka-server
server:
port: 8761
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
fetch-registry: false
register-with-eureka: false
- eureka client
依賴:
- eureka client
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
注解:@SpringBootApplication
配置:
### 注意 文件名為 bootstrap.yml
server:
port: 8082
spring:
application:
name: comsumer
cloud:
config:
profile: dev # profile對應(yīng)config server所獲取的配置文件中的{profile}
label: master # 指定Git倉庫的分支,對應(yīng)config server所獲取的配置文件的{label}
discovery:
enabled: true
service-id: config-server ##配置中心服務(wù)名
name: eureka-client ##倉庫中對應(yīng)配置的名子
rabbitmq:
host: 192.168.246.134 ##我虛擬機地址
- config server
依賴:
- config server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
注解:@SpringBootApplication
,@EnableConfigServer
配置:
### 注意 文件名為application.yml
spring:
application:
name: config-server
cloud:
config:
server:
git:
# Git倉庫地址 請寫自己的
uri: https://github.com/Guiee/spring-cloud-config-repo.git
rabbitmq:
host: 192.168.246.134
eureka:
instance:
prefer-ip-address: true
management:
endpoints:
web:
exposure:
include: "*"
不想自己寫可以直接clone下來驮俗,看看結(jié)果懂缕,項目代碼:https://github.com/Guiee/springcloud-config
二、 安裝rabbitmq
這個網(wǎng)上搜一搜就ok了意述,注意的是如果mq安裝在虛擬機里,本地主機是無法用guest用戶登錄的吮蛹。
- 到這 荤崇,git倉庫你總得有吧,不想建就fork一下我的潮针,省事兒懶人鏈接
三术荤、依次啟動 eureka server(8761)、config server(8080)每篷、eureka client(8082)
- 然后啟動項目看一看有沒有啥問題
- 訪問http://localhost:8082/env
- 修改github中的env的值瓣戚,發(fā)送 post 請求
http://localhost:8080/actuator/bus-refresh
,可以使用psotman 或者在終端curl -X POST http://localhost:8080/actuator/bus-refresh
postman - 在訪問http://localhost:8082/env 看下值是否刷新了
-
這時候可以看下idea里控制臺的輸出焦读,也可以看下rabbit的消息是否被消費了子库,如下折線。
rabbitmq頁面截圖.jpg
四矗晃、 webhook自動刷新
在config-server中把bus-refresh端點暴露出來,默認actuator只暴露 info
health
我就全暴了仑嗅。這里省略建倉庫那些的。
management:
endpoints:
web:
exposure:
include: "*"
可能很多人用 Finchley.RELEASE
這個版本向config server 發(fā)送 post http://localhost:8080/actuator/bus-refresh
都能成功,但是一用webhook就不能成功仓技,要么404,405要么就報亂七八槽的錯鸵贬,還有config-server刷新了,客戶端沒有刷新脖捻±疲坑只有自己踩過,才知道是真的坑地沮,哈哈嗜浮。
- 利用natapp小工具,實現(xiàn)內(nèi)網(wǎng)穿透诉濒,把下面這個網(wǎng)址拷到webhook的Payload URL里周伦,例 如
http://werv67.natappfree.cc/refresh
,劃重點 至于這里為什么寫的是/refresh
,而不是/actuator/bus-refresh
或者/monitor
,因為這里就是坑未荒,具體往下看专挪。
natapp運行.png
這里先把項目啟動起來,然后再添加webhook片排,如果你能看到下面那個綠色小箭頭就基本成功了寨腔。
image.png
把env的值修改一下,然后去eureka client中訪問一下率寡,我的地址是http://localhost:8082/env
,如果值刷新了迫卢,就ok了。
image.png
四冶共、 坑點
上面說的那個url的事情乾蛤, 主要是github那個Payload URL回調(diào)需要返回值,用 http://xxx/monitor , 還是 http://xxx/bus/refresh都不管用捅僵。所以我在config-server里加了一個controller家卖,用來轉(zhuǎn)發(fā),只用把yml里config-server服務(wù)名設(shè)置一下spring.application.name=xxx
,其他的都不用修改,或者你想換個url來轉(zhuǎn)發(fā)都可以庙楚,看你心情上荡。
@RestController
public class ConfigController {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String serviceId;
@PostMapping("/refresh")
public Object sync() {
Map<String, Integer> map = new HashMap<String, Integer>();
ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
System.out.println(serviceId);
String url = String.format("http://%s:%s/actuator/bus-refresh", serviceInstance.getHost(), serviceInstance.getPort());
System.out.println(url);
restTemplate.postForObject(url, map, Object.class);
map.put("code", 0);
return map;
}
}
寫的可能很粗糙,很多地方?jīng)]寫清楚馒闷,但這是真真實實動態(tài)刷新了酪捡,沒明白的可以簡信我。