@ -49,7 +49,8 @@ import static org.springframework.util.ReflectionUtils.rethrowRuntimeException;
* /
public class PolarisServiceRegistry implements ServiceRegistry < Registration > {
private static final Logger log = LoggerFactory . getLogger ( PolarisServiceRegistry . class ) ;
private static final Logger log = LoggerFactory
. getLogger ( PolarisServiceRegistry . class ) ;
private static final int ttl = 5 ;
@ -61,14 +62,15 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
private final ScheduledExecutorService heartbeatExecutor ;
public PolarisServiceRegistry ( PolarisProperties polarisProperties , PolarisDiscoveryHandler polarisDiscoveryHandler ,
public PolarisServiceRegistry ( PolarisProperties polarisProperties ,
PolarisDiscoveryHandler polarisDiscoveryHandler ,
MetadataLocalProperties metadataLocalProperties ) {
this . polarisProperties = polarisProperties ;
this . polarisDiscoveryHandler = polarisDiscoveryHandler ;
this . metadataLocalProperties = metadataLocalProperties ;
if ( polarisProperties . isHeartbeatEnabled ( ) ) {
ScheduledThreadPoolExecutor heartbeatExecutor = new ScheduledThreadPoolExecutor ( 0 ,
new NamedThreadFactory ( "spring-cloud-heartbeat" ) ) ;
ScheduledThreadPoolExecutor heartbeatExecutor = new ScheduledThreadPoolExecutor (
0 , new NamedThreadFactory ( "spring-cloud-heartbeat" ) ) ;
heartbeatExecutor . setMaximumPoolSize ( 1 ) ;
this . heartbeatExecutor = heartbeatExecutor ;
}
@ -101,19 +103,20 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
ProviderAPI providerClient = polarisDiscoveryHandler . getProviderAPI ( ) ;
providerClient . register ( instanceRegisterRequest ) ;
log . info ( "polaris registry, {} {} {}:{} {} register finished" ,
polarisProperties . getNamespace ( ) ,
registration . get ServiceId( ) , registration . getHos t( ) ,
registration. getPort ( ) , metadataLocalProperties. getContent ( ) ) ;
polarisProperties . getNamespace ( ) , registration . getServiceId ( ) ,
registration . get Host( ) , registration . getPor t( ) ,
metadataLocalProperties. getContent ( ) ) ;
if ( null ! = heartbeatExecutor ) {
InstanceHeartbeatRequest heartbeatRequest = new InstanceHeartbeatRequest ( ) ;
BeanUtils . copyProperties ( instanceRegisterRequest , heartbeatRequest ) ;
// 注册成功后开始启动心跳线程
// 注册成功后开始启动心跳线程
heartbeat ( heartbeatRequest ) ;
}
}
catch ( Exception e ) {
log . error ( "polaris registry, {} register failed...{}," , registration . getServiceId ( ) , registration , e ) ;
log . error ( "polaris registry, {} register failed...{}," ,
registration . getServiceId ( ) , registration , e ) ;
rethrowRuntimeException ( e ) ;
}
}
@ -140,7 +143,8 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
providerClient . deRegister ( deRegisterRequest ) ;
}
catch ( Exception e ) {
log . error ( "ERR_POLARIS_DEREGISTER, de-register failed...{}," , registration , e ) ;
log . error ( "ERR_POLARIS_DEREGISTER, de-register failed...{}," , registration ,
e ) ;
}
finally {
if ( null ! = heartbeatExecutor ) {
@ -163,7 +167,8 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
@Override
public Object getStatus ( Registration registration ) {
String serviceName = registration . getServiceId ( ) ;
InstancesResponse instancesResponse = polarisDiscoveryHandler . getInstances ( serviceName ) ;
InstancesResponse instancesResponse = polarisDiscoveryHandler
. getInstances ( serviceName ) ;
Instance [ ] instances = instancesResponse . getInstances ( ) ;
if ( null = = instances | | instances . length = = 0 ) {
return null ;
@ -179,23 +184,26 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
/ * *
* Start the heartbeat thread .
*
* @param heartbeatRequest heartbeat request
* /
public void heartbeat ( InstanceHeartbeatRequest heartbeatRequest ) {
heartbeatExecutor . scheduleWithFixedDelay ( ( ) - > {
try {
String healthCheckEndpoint = polarisProperties . getHealthCheckUrl ( ) ;
// 先判断是否配置了health-check-url, 如果配置了, 需要先进行服务实例健康检查, 如果健康检查通过, 则进行心跳上报, 如果不通过, 则不上报心跳
// 先判断是否配置了health-check-url, 如果配置了, 需要先进行服务实例健康检查, 如果健康检查通过, 则进行心跳上报, 如果不通过, 则不上报心跳
if ( Strings . isNotEmpty ( healthCheckEndpoint ) ) {
if ( ! healthCheckEndpoint . startsWith ( "/" ) ) {
healthCheckEndpoint = "/" + healthCheckEndpoint ;
}
String healthCheckUrl = String . format ( "http://%s:%s%s" , heartbeatRequest . getHost ( ) , heartbeatRequest . getPort ( ) , healthCheckEndpoint ) ;
String healthCheckUrl = String . format ( "http://%s:%s%s" ,
heartbeatRequest . getHost ( ) , heartbeatRequest . getPort ( ) ,
healthCheckEndpoint ) ;
if ( ! OkHttpUtil . get ( healthCheckUrl , null ) ) {
log . error ( "backend service health check failed. health check endpoint = {}" , healthCheckEndpoint ) ;
log . error (
"backend service health check failed. health check endpoint = {}" ,
healthCheckEndpoint ) ;
return ;
}
}