使用SpringCloud Bus动态刷新配置需要访问 config服务端的接口/actuator/bus-refresh(以post方法),例如我config服务端启动在本机的8080端口:http://localhost:8080/actuator/bus-refresh
但是每次修改文件都要自己手动去访问链接有点麻烦,所以可以使用GitHub上的webhooks,其作用就是每次重新提交配置时会以POST方法去访问一个链接,(码云上也有这个东西),但是GitHub上配置了之后总是访问失败,报如下错误:
2019-03-21 19:28:06.681 TRACE 5624 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : POST "/actuator/bus-refresh", parameters={}, headers={masked} in DispatcherServlet 'dispatcherServlet'
2019-03-21 19:28:06.682 TRACE 5624 --- [nio-8080-exec-2] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped to Actuator web endpoint 'bus-refresh'
2019-03-21 19:28:06.871 DEBUG 5624 --- [nio-8080-exec-2] .w.s.m.m.a.ServletInvocableHandlerMethod : Could not resolve parameter [1] in public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>): JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token
at [Source: (PushbackInputStream); line: 1, column: 295] (through reference chain: java.util.LinkedHashMap["commits"])
然后觉得应该是在发送请求时是不是添加了额外的参数导致无法识别什么的。(大佬求教)
之后自己就写了方法来进行请求转发,过滤一次webhooks的请求:
例如:config服务端的刷新接口为:http://localhost:8080/actuator/bus-refresh,我使用natapp,将 http://3tzx5e.natappfree.cc 映射到127.0.0.1:8080。
然后在config服务端里新建请求转发的类:
@Controller
public class RefreshController {
@RequestMapping("/refresh")
public void refresh(){
RestTemplate restTemplate = new RestTemplate();
HttpHeaders httpHeaders = new HttpHeaders();
# 设置content_type为json要不然会报415的错误
httpHeaders.add(HttpHeaders.CONTENT_TYPE,"application/json");
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(null,httpHeaders);
# 以post方法访问真正的刷新链接
ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity("http://localhost:8080/actuator/bus-refresh",
request, String.class);
}
}
之后再到webhooks配置每次提交文件时访问该链接(http://3tzx5e.natappfree.cc/refresh):
配置好之后,我们重新修改配置文件,然后提交。
我们可以在rabbitmq的管理页面看到有消息响应:
也可以看见config服务端、客户端控制台重新抓取配置文件的日志。