目錄
一、服務端配置
二、客戶端配置
三、客戶端使用
四、使用Gitlab Webhook自動刷新
五、Webhook測試異常
六、Webhook異常處理
一、服務端配置
增加SpringCloud bus等依賴:
pom.xml
|
1
2
3
4
5
6
7
8
9
|
<!-- springcloud-bus依賴實現配置自動更新,rabbitmq -->
<
dependency
>
<
groupId
>org.springframework.cloud</
groupId
>
<
artifactId
>spring-cloud-starter-bus-amqp</
artifactId
>
</
dependency
>
<
dependency
>
<
groupId
>org.springframework.boot</
groupId
>
<
artifactId
>spring-boot-starter-actuator</
artifactId
>
</
dependency
>
|
配置文件增加RabbitMQ地址、暴露節點等配置
bootstrap.yml
|
1
2
3
4
5
6
7
8
9
10
11
12
|
spring:
# rabbitmq 地址配置
rabbitmq:
host:
172.18.0.118
port:
32139
username:
guest
password:
guest
management:
endpoints:
web:
exposure:
include:
"*"
|
二、客戶端配置
添加SpringCloud bus等依賴
pom.xml
|
1
2
3
4
5
6
7
8
9
|
<!-- springcloud-bus依賴實現配置自動更新,rabbitmq -->
<
dependency
>
<
groupId
>org.springframework.cloud</
groupId
>
<
artifactId
>spring-cloud-starter-bus-amqp</
artifactId
>
</
dependency
>
<
dependency
>
<
groupId
>org.springframework.boot</
groupId
>
<
artifactId
>spring-boot-starter-actuator</
artifactId
>
</
dependency
>
|
配置文件增加RabbitMQ地址配置
bootstrap.yml
|
1
2
3
4
5
6
7
|
spring:
# rabbitmq 地址配置
rabbitmq:
host:
172.18.0.118
port:
32139
username:
guest
password:
guest
|
三、客戶端使用
增加@RefreshScope注解
Demo
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@RestController
@RequestMapping
(
"/ctrl"
)
@RefreshScope
public
class
TestController {
@Value
(
"${chipcloud-service.endpoints.demo-test2.path:xxxxxxxxxxxxxx}"
)
private
String test;
@RequestMapping
(
"/test"
)
public
String getName(){
System.out.println(
"===================>"
+test);
return
"Success!"
;
}
}
|
此時,當Config配置文件變化后,客戶端讀到的配置信息仍然是舊數據,需要手動請求 POST http://配置中心IP:PORT/actuator/bus-refresh 觸發刷新。下面第四節通過Gitlab webhook代替該手動觸發POST請求(僅需在配置中心倉庫配置一次即可)。
四、使用Gitlab Webhook自動刷新
Gitlab→zkxy-config→Settings→Integrations

點擊Test→Push events進行測試:

五、Webhook測試異常
Push events進行測試,出現 400 的Http Status Code:

Request headers
Content-Type: application/json
X-Gitlab-Event: Push Hook
|
Response headers
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 02 Sep 2020 07:44:16 GMT
Connection: close
|
Response body
{"timestamp":"2020-09-02T07:44:16.576+0000","status":400,"error":"Bad Request","message":"JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token\n at [Source: (PushbackInputStream); line: 1, column: 459] (through reference chain: java.util.LinkedHashMap[\"project\"])","path":"/actuator/bus-refresh"}
|
六、Webhook異常處理
出現上述異常信息是因為POST請求會攜帶Request Body發送至配置中心服務器,Request Body使用JSON解析時出錯,無法反序列化,拋出異常,返回400錯誤。WebHook POST的請求附加的內容對於動態修改配置文件不重要,可以把附加的內容信息清空掉,這時JSON解析就不會出錯了。
通過Filter過濾器來攔截Http請求,清空servletRequest 中無法解析內容.
