增加服务实例自身健康检查

pull/34/head
bruceppeng 3 years ago
parent 406364feb6
commit 882b23ef29

@ -1,6 +1,6 @@
server: server:
session-timeout: 1800 session-timeout: 1800
port: 48081 port: 48084
spring: spring:
application: application:
name: DiscoveryCalleeService name: DiscoveryCalleeService

@ -59,4 +59,14 @@ public class DiscoveryCallerController {
return restTemplate.getForObject("http://DiscoveryCalleeService/discovery/service/callee/info", String.class); return restTemplate.getForObject("http://DiscoveryCalleeService/discovery/service/callee/info", String.class);
} }
/**
* health check
*
* @return
*/
@GetMapping("/healthCheck")
public String healthCheck() {
return "pk ok";
}
} }

@ -7,6 +7,10 @@ spring:
cloud: cloud:
polaris: polaris:
address: grpc://127.0.0.1:8091 address: grpc://127.0.0.1:8091
discovery:
heartbeat:
enabled: true
health-check-url: http://localhost:48080/discovery/service/caller/healthCheck
consul: consul:
port: 8500 port: 8500
host: 127.0.0.1 host: 127.0.0.1

@ -98,6 +98,12 @@ public class PolarisProperties {
@Value("${spring.cloud.polaris.discovery.heartbeat.enabled:#{false}}") @Value("${spring.cloud.polaris.discovery.heartbeat.enabled:#{false}}")
private Boolean heartbeatEnabled = true; private Boolean heartbeatEnabled = true;
/**
* Custom health check url to override default
*/
@Value("${spring.cloud.polaris.discovery.health-check-url:}")
private String healthCheckUrl;
@Autowired @Autowired
private Environment environment; private Environment environment;
@ -212,6 +218,14 @@ public class PolarisProperties {
this.port = port; this.port = port;
} }
public String getHealthCheckUrl() {
return healthCheckUrl;
}
public void setHealthCheckUrl(String healthCheckUrl) {
this.healthCheckUrl = healthCheckUrl;
}
@Override @Override
@SuppressWarnings("checkstyle:all") @SuppressWarnings("checkstyle:all")
public String toString() { public String toString() {
@ -227,6 +241,7 @@ public class PolarisProperties {
", policy='" + policy + '\'' + ", policy='" + policy + '\'' +
", registerEnabled=" + registerEnabled + ", registerEnabled=" + registerEnabled +
", heartbeatEnabled=" + heartbeatEnabled + ", heartbeatEnabled=" + heartbeatEnabled +
", healthCheckUrl=" + healthCheckUrl +
", environment=" + environment + ", environment=" + environment +
'}'; '}';
} }

@ -21,6 +21,7 @@ import static org.springframework.util.ReflectionUtils.rethrowRuntimeException;
import com.tencent.cloud.metadata.config.MetadataLocalProperties; import com.tencent.cloud.metadata.config.MetadataLocalProperties;
import com.tencent.cloud.polaris.PolarisProperties; import com.tencent.cloud.polaris.PolarisProperties;
import com.tencent.cloud.polaris.util.OkHttpUtil;
import com.tencent.polaris.api.core.ProviderAPI; import com.tencent.polaris.api.core.ProviderAPI;
import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.exception.PolarisException;
import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.Instance;
@ -33,6 +34,7 @@ import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.logging.log4j.util.Strings;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@ -179,6 +181,12 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
@Override @Override
public void run() { public void run() {
try { try {
String healthCheckUrl = polarisProperties.getHealthCheckUrl();
//先判断是否配置了health-check-url如果配置了需要先进行服务实例健康检查如果健康检查通过则进行心跳上报如果不通过则不上报心跳
if (Strings.isNotEmpty(healthCheckUrl) && !OkHttpUtil.get(healthCheckUrl, null)){
log.error("polaris health check failed");
return;
}
polarisDiscoveryHandler.getProviderAPI().heartbeat(heartbeatRequest); polarisDiscoveryHandler.getProviderAPI().heartbeat(heartbeatRequest);
} catch (PolarisException e) { } catch (PolarisException e) {
log.error("polaris heartbeat[{}]", e.getCode(), e); log.error("polaris heartbeat[{}]", e.getCode(), e);

@ -0,0 +1,83 @@
/*
* Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package com.tencent.cloud.polaris.util;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import com.squareup.okhttp.OkHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.Objects;
/**
* okhttp util.
*
* @author kan peng
*/
public class OkHttpUtil {
public final static Logger logger = LoggerFactory.getLogger(OkHttpUtil.class);
/**
* JSON format
*/
public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
/**
* client
*/
private final static OkHttpClient HTTP_CLIENT = new OkHttpClient();
/**
* get request.
*
* @param url url
* @param headers headers
* @return response
*/
public static boolean get(String url, Map<String, String> headers) {
try {
Request.Builder builder = new Request.Builder();
buildHeader(builder, headers);
Request request = builder.url(url).build();
Response response = HTTP_CLIENT.newCall(request).execute();
if (response.isSuccessful() && Objects.nonNull(response.body())) {
String result = response.body().string();
logger.info("exec get request, url: {} successresponse data: {}", url, result);
return true;
}
} catch (Exception e) {
logger.error("exec get requesturl: {} failed!", url, e);
}
return false;
}
/**
* build header.
*
* @param builder builder
* @param headers headers
*/
private static void buildHeader(Request.Builder builder, Map<String, String> headers) {
if (Objects.nonNull(headers) && headers.size() > 0) {
headers.forEach((k, v) -> {
if (Objects.nonNull(k) && Objects.nonNull(v)) {
builder.addHeader(k, v);
}
});
}
}
}

@ -18,6 +18,12 @@
"defaultValue": true, "defaultValue": true,
"description": "enable polaris discovery or not." "description": "enable polaris discovery or not."
}, },
{
"name": "spring.cloud.polaris.discovery.health-check-url",
"type": "java.lang.String",
"defaultValue": "",
"description": "heal check url."
},
{ {
"name": "spring.cloud.polaris.discovery.instance-enabled", "name": "spring.cloud.polaris.discovery.instance-enabled",
"type": "java.lang.Boolean", "type": "java.lang.Boolean",

Loading…
Cancel
Save