目录
一、服务端配置
二、客户端配置
三、客户端使用
四、使用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")
@RefreshScopepublic 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/jsonX-Gitlab-Event: Push Hook |
Response headers
Content-Type: application/json;charset=UTF-8Transfer-Encoding: chunkedDate: Wed, 02 Sep 2020 07:44:16 GMTConnection: 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 中无法解析内容.