@Slf4j
public class NginxRegistryListener implements ApplicationListener<ApplicationStartedEvent> {
private NginxRegistryProp nginxRegistryProp;
private int serverPort;
public NginxRegistryListener(NginxRegistryProp nginxRegistryProp, int serverPort) {
this.nginxRegistryProp = nginxRegistryProp;
this.serverPort = serverPort;
}
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
log.info("NginxRegistryListener run");
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
log.info("NginxRegistryListener.doUnregistry started");
doUnregistry();
} catch (Exception e) {
log.error("NginxRegistryListener.doUnregistry error. ", e);
}
}));
try {
log.info("NginxRegistryListener.doRegistry started");
doRegistry();
} catch (Exception e) {
log.error("NginxRegistryListener.doRegistry error. ", e);
}
}
private List<String> getUpstreamList() throws IOException, URISyntaxException {
// 创建Httpclient对象
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
// 创建uri
URIBuilder builder = new URIBuilder(this.nginxRegistryProp.getRegistryUrl());
URI uri = builder.build();
// 创建http GET请求
HttpGet httpGet = new HttpGet(uri);
// 执行请求
try (CloseableHttpResponse response = httpclient.execute(httpGet)) {
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_FOUND) {
return new ArrayList<>();
}
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
throw new IOException("http request error, url= " + this.nginxRegistryProp.getRegistryUrl());
}
return IOUtils.readLines(response.getEntity().getContent(), StandardCharsets.UTF_8);
}
}
}
private void doRegistry() throws IOException, URISyntaxException {
if (nginxRegistryProp == null
|| StringUtils.isBlank(nginxRegistryProp.getRegistryUrl())
|| StringUtils.isBlank(nginxRegistryProp.getServiceIp())) {
log.info("doRegistry, nothing todo, nginxRegistryProp={}", nginxRegistryProp);
return;
}
List<String> upstreamList = getUpstreamList();
String destUpstream = this.buildUpstream();
if (upstreamList.contains(destUpstream)) {
log.info("doRegistry, upstream registered already, nginxRegistryProp={}", nginxRegistryProp);
return;
}
upstreamList.add(destUpstream);
updateUpstream(upstreamList);
}
private void doUnregistry() throws IOException, URISyntaxException {
if (nginxRegistryProp == null
|| StringUtils.isBlank(nginxRegistryProp.getRegistryUrl())
|| StringUtils.isBlank(nginxRegistryProp.getServiceIp())) {
log.info("doUnregistry, nothing todo, nginxRegistryProp={}", nginxRegistryProp);
return;
}
List<String> upstreamList = getUpstreamList();
String destUpstream = this.buildUpstream();
if (!upstreamList.remove(destUpstream)) {
log.info("doUnregistry, upstream unregistered already, nginxRegistryProp={}", nginxRegistryProp);
return;
}
if (CollectionUtils.isEmpty(upstreamList)) {
deleteUpstream();
return;
}
updateUpstream(upstreamList);
}
private String buildUpstream() {
return String.format("server %s:%d", nginxRegistryProp.getServiceIp(), serverPort);
}
private void updateUpstream(List<String> upstreamList) throws IOException, URISyntaxException {
StringBuilder sb = new StringBuilder();
for (String upstream : upstreamList) {
sb.append(upstream)
.append(";");
}
String postStr = sb.toString();
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
// 创建uri
URIBuilder builder = new URIBuilder(this.nginxRegistryProp.getRegistryUrl());
URI uri = builder.build();
// 创建http POST请求
HttpPost httpPost = new HttpPost(uri);
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
httpPost.setEntity(new StringEntity(postStr, StandardCharsets.UTF_8));
// 执行请求
try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
throw new IOException("http request error, url= " + this.nginxRegistryProp.getRegistryUrl());
}
String content = IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8);
if (!StringUtils.equalsIgnoreCase("success", content)) {
throw new IOException("http request error, url= " + this.nginxRegistryProp.getRegistryUrl());
}
}
}
}
private void deleteUpstream() throws IOException, URISyntaxException {
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
// 创建uri
URIBuilder builder = new URIBuilder(this.nginxRegistryProp.getRegistryUrl());
URI uri = builder.build();
// 创建http DELETE请求
HttpDelete httpDelete = new HttpDelete(uri);
// 执行请求
try (CloseableHttpResponse response = httpclient.execute(httpDelete)) {
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
throw new IOException("http request error, url= " + this.nginxRegistryProp.getRegistryUrl());
}
String content = IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8);
if (!StringUtils.equalsIgnoreCase("success", content)) {
throw new IOException("http request error, url= " + this.nginxRegistryProp.getRegistryUrl());
}
}
}
}
}