mirror of
https://gitee.com/mirrors/Spring-Cloud-Alibaba.git
synced 2021-06-26 13:25:11 +08:00
Polish alibaba/spring-cloud-alibaba#1739 : Sync the Sidecar from master
This commit is contained in:
parent
4003d3e15b
commit
f8cab52865
@ -18,7 +18,6 @@ package com.alibaba.cloud.sidecar;
|
|||||||
|
|
||||||
import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator;
|
import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.core.env.ConfigurableEnvironment;
|
import org.springframework.core.env.ConfigurableEnvironment;
|
||||||
@ -28,7 +27,6 @@ import org.springframework.web.client.RestTemplate;
|
|||||||
* @author www.itmuch.com
|
* @author www.itmuch.com
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableConfigurationProperties(SidecarProperties.class)
|
|
||||||
public class SidecarAutoConfiguration {
|
public class SidecarAutoConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
@ -16,6 +16,9 @@
|
|||||||
|
|
||||||
package com.alibaba.cloud.sidecar;
|
package com.alibaba.cloud.sidecar;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -28,11 +31,14 @@ import org.springframework.core.env.ConfigurableEnvironment;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @author www.itmuch.com
|
* @author www.itmuch.com
|
||||||
|
* @author yuhuangbin
|
||||||
*/
|
*/
|
||||||
public class SidecarHealthChecker {
|
public class SidecarHealthChecker {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(SidecarHealthChecker.class);
|
private static final Logger log = LoggerFactory.getLogger(SidecarHealthChecker.class);
|
||||||
|
|
||||||
|
private final Map<String, SidecarInstanceCache> sidecarInstanceCacheMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private final SidecarDiscoveryClient sidecarDiscoveryClient;
|
private final SidecarDiscoveryClient sidecarDiscoveryClient;
|
||||||
|
|
||||||
private final HealthIndicator healthIndicator;
|
private final HealthIndicator healthIndicator;
|
||||||
@ -52,26 +58,58 @@ public class SidecarHealthChecker {
|
|||||||
|
|
||||||
public void check() {
|
public void check() {
|
||||||
Schedulers.single().schedulePeriodically(() -> {
|
Schedulers.single().schedulePeriodically(() -> {
|
||||||
|
String applicationName = environment.getProperty("spring.application.name");
|
||||||
String ip = sidecarProperties.getIp();
|
String ip = sidecarProperties.getIp();
|
||||||
Integer port = sidecarProperties.getPort();
|
Integer port = sidecarProperties.getPort();
|
||||||
|
|
||||||
Status status = healthIndicator.health().getStatus();
|
Status status = healthIndicator.health().getStatus();
|
||||||
String applicationName = environment.getProperty("spring.application.name");
|
|
||||||
|
|
||||||
|
instanceCache(applicationName, ip, port, status);
|
||||||
if (status.equals(Status.UP)) {
|
if (status.equals(Status.UP)) {
|
||||||
this.sidecarDiscoveryClient.registerInstance(applicationName, ip, port);
|
if (needRegister(applicationName, ip, port, status)) {
|
||||||
log.debug(
|
this.sidecarDiscoveryClient.registerInstance(applicationName, ip, port);
|
||||||
"Health check success. register this instance. applicationName = {}, ip = {}, port = {}, status = {}",
|
log.info(
|
||||||
applicationName, ip, port, status);
|
"Polyglot service changed and Health check success. register the new instance. applicationName = {}, ip = {}, port = {}, status = {}",
|
||||||
|
applicationName, ip, port, status);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
log.warn(
|
log.warn(
|
||||||
"Health check failed. unregister this instance. applicationName = {}, ip = {}, port = {}, status = {}",
|
"Health check failed. unregister this instance. applicationName = {}, ip = {}, port = {}, status = {}",
|
||||||
applicationName, ip, port, status);
|
applicationName, ip, port, status);
|
||||||
this.sidecarDiscoveryClient.deregisterInstance(applicationName, ip, port);
|
this.sidecarDiscoveryClient.deregisterInstance(applicationName, ip, port);
|
||||||
|
sidecarInstanceCacheMap.put(applicationName,
|
||||||
|
buildCache(ip, port, status));
|
||||||
}
|
}
|
||||||
|
|
||||||
}, 0, sidecarProperties.getHealthCheckInterval(), TimeUnit.MILLISECONDS);
|
}, 0, sidecarProperties.getHealthCheckInterval(), TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void instanceCache(String applicationName, String ip, Integer port,
|
||||||
|
Status status) {
|
||||||
|
sidecarInstanceCacheMap.putIfAbsent(applicationName,
|
||||||
|
buildCache(ip, port, status));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean needRegister(String applicationName, String ip, Integer port,
|
||||||
|
Status status) {
|
||||||
|
SidecarInstanceCache cacheRecord = sidecarInstanceCacheMap.get(applicationName);
|
||||||
|
SidecarInstanceCache cache = buildCache(ip, port, status);
|
||||||
|
|
||||||
|
if (!Objects.equals(cache, cacheRecord)) {
|
||||||
|
// modify the cache info
|
||||||
|
sidecarInstanceCacheMap.put(applicationName, cache);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SidecarInstanceCache buildCache(String ip, Integer port, Status status) {
|
||||||
|
SidecarInstanceCache cache = new SidecarInstanceCache();
|
||||||
|
cache.setIp(ip);
|
||||||
|
cache.setPort(port);
|
||||||
|
cache.setStatus(status);
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2013-2018 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* 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.alibaba.cloud.sidecar;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.springframework.boot.actuate.health.Status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yuhuangbin
|
||||||
|
*/
|
||||||
|
public class SidecarInstanceCache {
|
||||||
|
|
||||||
|
private String ip;
|
||||||
|
|
||||||
|
private Integer port;
|
||||||
|
|
||||||
|
private Status status;
|
||||||
|
|
||||||
|
public String getIp() {
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIp(String ip) {
|
||||||
|
this.ip = ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPort(Integer port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Status getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(Status status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
SidecarInstanceCache that = (SidecarInstanceCache) o;
|
||||||
|
return Objects.equals(ip, that.ip) && Objects.equals(port, that.port)
|
||||||
|
&& Objects.equals(status, that.status);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(ip, port, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -17,6 +17,7 @@
|
|||||||
package com.alibaba.cloud.sidecar.nacos;
|
package com.alibaba.cloud.sidecar.nacos;
|
||||||
|
|
||||||
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
|
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
|
||||||
|
import com.alibaba.cloud.nacos.NacosServiceManager;
|
||||||
import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration;
|
import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration;
|
||||||
import com.alibaba.cloud.sidecar.SidecarAutoConfiguration;
|
import com.alibaba.cloud.sidecar.SidecarAutoConfiguration;
|
||||||
import com.alibaba.cloud.sidecar.SidecarDiscoveryClient;
|
import com.alibaba.cloud.sidecar.SidecarDiscoveryClient;
|
||||||
@ -25,6 +26,7 @@ import com.alibaba.cloud.sidecar.SidecarProperties;
|
|||||||
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
@ -35,6 +37,7 @@ import org.springframework.context.annotation.Configuration;
|
|||||||
@AutoConfigureBefore({ NacosDiscoveryAutoConfiguration.class,
|
@AutoConfigureBefore({ NacosDiscoveryAutoConfiguration.class,
|
||||||
SidecarAutoConfiguration.class })
|
SidecarAutoConfiguration.class })
|
||||||
@ConditionalOnClass(NacosDiscoveryProperties.class)
|
@ConditionalOnClass(NacosDiscoveryProperties.class)
|
||||||
|
@EnableConfigurationProperties(SidecarProperties.class)
|
||||||
public class SidecarNacosAutoConfiguration {
|
public class SidecarNacosAutoConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
@ -47,8 +50,9 @@ public class SidecarNacosAutoConfiguration {
|
|||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnMissingBean
|
@ConditionalOnMissingBean
|
||||||
public SidecarDiscoveryClient sidecarDiscoveryClient(
|
public SidecarDiscoveryClient sidecarDiscoveryClient(
|
||||||
|
NacosServiceManager nacosServiceManager,
|
||||||
SidecarNacosDiscoveryProperties sidecarNacosDiscoveryProperties) {
|
SidecarNacosDiscoveryProperties sidecarNacosDiscoveryProperties) {
|
||||||
return new SidecarNacosDiscoveryClient(sidecarNacosDiscoveryProperties);
|
return new SidecarNacosDiscoveryClient(nacosServiceManager,
|
||||||
|
sidecarNacosDiscoveryProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,10 @@
|
|||||||
|
|
||||||
package com.alibaba.cloud.sidecar.nacos;
|
package com.alibaba.cloud.sidecar.nacos;
|
||||||
|
|
||||||
|
import com.alibaba.cloud.nacos.NacosServiceManager;
|
||||||
import com.alibaba.cloud.sidecar.SidecarDiscoveryClient;
|
import com.alibaba.cloud.sidecar.SidecarDiscoveryClient;
|
||||||
import com.alibaba.nacos.api.exception.NacosException;
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
|
import com.alibaba.nacos.api.naming.NamingService;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -29,9 +31,11 @@ public class SidecarNacosDiscoveryClient implements SidecarDiscoveryClient {
|
|||||||
private static final Logger log = LoggerFactory
|
private static final Logger log = LoggerFactory
|
||||||
.getLogger(SidecarNacosDiscoveryClient.class);
|
.getLogger(SidecarNacosDiscoveryClient.class);
|
||||||
|
|
||||||
|
private NacosServiceManager nacosServiceManager;
|
||||||
|
|
||||||
private final SidecarNacosDiscoveryProperties sidecarNacosDiscoveryProperties;
|
private final SidecarNacosDiscoveryProperties sidecarNacosDiscoveryProperties;
|
||||||
|
|
||||||
public SidecarNacosDiscoveryClient(
|
public SidecarNacosDiscoveryClient(NacosServiceManager nacosServiceManager,
|
||||||
SidecarNacosDiscoveryProperties sidecarNacosDiscoveryProperties) {
|
SidecarNacosDiscoveryProperties sidecarNacosDiscoveryProperties) {
|
||||||
this.sidecarNacosDiscoveryProperties = sidecarNacosDiscoveryProperties;
|
this.sidecarNacosDiscoveryProperties = sidecarNacosDiscoveryProperties;
|
||||||
}
|
}
|
||||||
@ -39,8 +43,8 @@ public class SidecarNacosDiscoveryClient implements SidecarDiscoveryClient {
|
|||||||
@Override
|
@Override
|
||||||
public void registerInstance(String applicationName, String ip, Integer port) {
|
public void registerInstance(String applicationName, String ip, Integer port) {
|
||||||
try {
|
try {
|
||||||
this.sidecarNacosDiscoveryProperties.namingServiceInstance()
|
this.namingService().registerInstance(applicationName,
|
||||||
.registerInstance(applicationName, ip, port);
|
sidecarNacosDiscoveryProperties.getGroup(), ip, port);
|
||||||
}
|
}
|
||||||
catch (NacosException e) {
|
catch (NacosException e) {
|
||||||
log.warn("nacos exception happens", e);
|
log.warn("nacos exception happens", e);
|
||||||
@ -50,12 +54,16 @@ public class SidecarNacosDiscoveryClient implements SidecarDiscoveryClient {
|
|||||||
@Override
|
@Override
|
||||||
public void deregisterInstance(String applicationName, String ip, Integer port) {
|
public void deregisterInstance(String applicationName, String ip, Integer port) {
|
||||||
try {
|
try {
|
||||||
this.sidecarNacosDiscoveryProperties.namingServiceInstance()
|
this.namingService().deregisterInstance(applicationName,
|
||||||
.deregisterInstance(applicationName, ip, port);
|
sidecarNacosDiscoveryProperties.getGroup(), ip, port);
|
||||||
}
|
}
|
||||||
catch (NacosException e) {
|
catch (NacosException e) {
|
||||||
log.warn("nacos exception happens", e);
|
log.warn("nacos exception happens", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private NamingService namingService() {
|
||||||
|
return nacosServiceManager
|
||||||
|
.getNamingService(sidecarNacosDiscoveryProperties.getNacosProperties());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,14 +18,15 @@ package com.alibaba.cloud.sidecar.nacos;
|
|||||||
|
|
||||||
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
|
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
|
||||||
import com.alibaba.cloud.sidecar.SidecarProperties;
|
import com.alibaba.cloud.sidecar.SidecarProperties;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author itmuch.com
|
* @author itmuch.com
|
||||||
|
* @author yuhuangbin
|
||||||
*/
|
*/
|
||||||
public class SidecarNacosDiscoveryProperties extends NacosDiscoveryProperties {
|
public class SidecarNacosDiscoveryProperties extends NacosDiscoveryProperties {
|
||||||
|
|
||||||
private final SidecarProperties sidecarProperties;
|
SidecarProperties sidecarProperties;
|
||||||
|
|
||||||
public SidecarNacosDiscoveryProperties(SidecarProperties sidecarProperties) {
|
public SidecarNacosDiscoveryProperties(SidecarProperties sidecarProperties) {
|
||||||
this.sidecarProperties = sidecarProperties;
|
this.sidecarProperties = sidecarProperties;
|
||||||
@ -36,7 +37,7 @@ public class SidecarNacosDiscoveryProperties extends NacosDiscoveryProperties {
|
|||||||
super.init();
|
super.init();
|
||||||
|
|
||||||
String ip = sidecarProperties.getIp();
|
String ip = sidecarProperties.getIp();
|
||||||
if (StringUtils.isNotBlank(ip)) {
|
if (!StringUtils.isEmpty(ip)) {
|
||||||
this.setIp(ip);
|
this.setIp(ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user