Spring cloud 尤里卡从不注销服务
我目前面临一个问题,Eureka不会注销已注册的服务。我直接从git hub中提取了Eureka服务器示例,只做了一个更改,Spring cloud 尤里卡从不注销服务,spring-cloud,netflix-eureka,Spring Cloud,Netflix Eureka,我目前面临一个问题,Eureka不会注销已注册的服务。我直接从git hub中提取了Eureka服务器示例,只做了一个更改,Eureka.enableSelfPreservation=false。My application.yml如下所示: server: port: 8761 eureka: enableSelfPreservation: false client: registerWithEureka: false fetchRegistry: false serv
Eureka.enableSelfPreservation=false
。My application.yml如下所示:
server:
port: 8761
eureka:
enableSelfPreservation: false
client:
registerWithEureka: false
fetchRegistry: false
server:
waitTimeInMsWhenSyncEmpty: 0
eureka:
instance:
leaseRenewalIntervalInSeconds: 3
client:
healthcheck:
enabled: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
appInfo:
replicate:
interval: 3
initial:
replicate:
time: 3
spring:
rabbitmq:
addresses: ${vcap.services.${PREFIX:}rabbitmq.credentials.uri:amqp://${RABBITMQ_HOST:localhost}:${RABBITMQ_PORT:5672}}
我已经读到,如果85%的注册服务在15分钟内停止提供心跳,Eureka会假设问题与网络相关,不会取消注册没有响应的服务。在我的例子中,我只有一个服务在运行,所以我禁用了自我保护模式。我突然终止了这个过程,而Eureka离开服务的注册时间似乎是无限期的
我客户的application.yml如下所示:
server:
port: 8761
eureka:
enableSelfPreservation: false
client:
registerWithEureka: false
fetchRegistry: false
server:
waitTimeInMsWhenSyncEmpty: 0
eureka:
instance:
leaseRenewalIntervalInSeconds: 3
client:
healthcheck:
enabled: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
appInfo:
replicate:
interval: 3
initial:
replicate:
time: 3
spring:
rabbitmq:
addresses: ${vcap.services.${PREFIX:}rabbitmq.credentials.uri:amqp://${RABBITMQ_HOST:localhost}:${RABBITMQ_PORT:5672}}
我的目标是创建一个演示,其中Eureka可以快速检测到服务不再运行,而另一个启动的服务可以快速注册
现在,一旦启动eureka客户端,它将在3秒钟内注册。当服务突然终止时,它永远不会取消注册。在我终止服务后,Eureka仪表板显示:
紧急情况!EUREKA可能错误地声称实例在未启动时已启动。续订小于阈值,因此实例不会为了安全而过期
如何防止这种行为?我意识到自我保护模式实际上从未被禁用。事实证明,实际属性是
eureka.server.enableSelfPreservation=false
(参见代码),我在任何地方都没有找到文档。这解决了我的问题。我通过设置以下值使服务取消注册生效 Eureka server application.yml
eureka:
server:
enableSelfPreservation: false
eureka:
instance:
leaseRenewalIntervalInSeconds: 1
leaseExpirationDurationInSeconds: 2
服务应用程序.yml
eureka:
server:
enableSelfPreservation: false
eureka:
instance:
leaseRenewalIntervalInSeconds: 1
leaseExpirationDurationInSeconds: 2
这里是完整的示例经过一番努力,如果有任何服务由于某些问题而从Eureka服务器注销,我最终得到了解决方案。它将通过扩展Eureka服务器API的HealthCallback通知管理员。 比如说服务——在尤里卡登记。因此,Eureka客户端与服务A集成,并在服务A中实现以下回调 服务-A【尤里卡客户】 在属性文件中添加以下属性
#Eureka Configuration
eureka.client.eureka-server-port=8761
eureka.client.register-with-eureka=true
eureka.client.healthcheck.enabled=false
eureka.client.prefer-same-zone-eureka=true
eureka.client.fetchRegistry=true
eureka.client.serviceUrl.defaultZone=${eurekaServerURL1}, ${eurekaServerURL2}
eureka.client.eureka.service-url.defaultZone=${eurekaServerURL1}, ${eurekaServerURL2}
eureka.instance.hostname=${hostname}
eureka.client.lease.duration=30
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=30
添加以下java文件
@Component
public class EurekaHealthCheckHandler implements HealthCheckHandler, ApplicationContextAware, InitializingBean {
static Logger logger = LoggerFactory.getLogger(EurekaHealthCheckHandler.class);
private static final Map<Status, InstanceInfo.InstanceStatus> healthStatuses = new HashMap<Status, InstanceInfo.InstanceStatus>() {{
put(Status.UNKNOWN, InstanceInfo.InstanceStatus.UNKNOWN);
put(Status.OUT_OF_SERVICE, InstanceInfo.InstanceStatus.OUT_OF_SERVICE);
put(Status.DOWN, InstanceInfo.InstanceStatus.DOWN);
put(Status.UP, InstanceInfo.InstanceStatus.UP);
}};
@Autowired
ComunocationService comunocationService ;
private final CompositeHealthIndicator healthIndicator;
private ApplicationContext applicationContext;
public EurekaHealthCheckHandler(HealthAggregator healthAggregator) {
Assert.notNull(healthAggregator, "HealthAggregator must not be null");
this.healthIndicator = new CompositeHealthIndicator(healthAggregator);
Health health = healthIndicator.health();
logger.info(" =========== Testing =========== {}", health.toString() );
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void afterPropertiesSet() throws Exception {
final Map<String, HealthIndicator> healthIndicators = applicationContext.getBeansOfType(HealthIndicator.class);
for (Map.Entry<String, HealthIndicator> entry : healthIndicators.entrySet()) {
logger.info("======"+ entry.getKey() +"============= "+entry.getValue());
healthIndicator.addHealthIndicator(entry.getKey(), entry.getValue());
}
}
@Override
public InstanceInfo.InstanceStatus getStatus(InstanceInfo.InstanceStatus instanceStatus) {
logger.info("============== Custome Eureka Implementation ==================="+ getHealthStatus());
return getHealthStatus();
}
protected InstanceInfo.InstanceStatus getHealthStatus() {
final Status status = healthIndicator.health().getStatus();
return mapToInstanceStatus(status);
}
protected InstanceInfo.InstanceStatus mapToInstanceStatus(Status status) {
logger.info("============== Test Custome Eureka Implementation ==================={}", status);
if(status.equals(InstanceInfo.InstanceStatus.UP)) {
// Send mail after configured times
comunocationService.sendEmail("ServiceName");
}
if(!healthStatuses.containsKey(status)) {
return InstanceInfo.InstanceStatus.UNKNOWN;
}
return healthStatuses.get(status);
}
public void getstatusChangeListner() {
ApplicationInfoManager.StatusChangeListener statusChangeListener = new ApplicationInfoManager.StatusChangeListener() {
@Override
public String getId() {
return "statusChangeListener";
}
@Override
public void notify(StatusChangeEvent statusChangeEvent) {
if (InstanceStatus.DOWN == statusChangeEvent.getStatus() ||
InstanceStatus.DOWN == statusChangeEvent.getPreviousStatus()) {
// log at warn level if DOWN was involved
logger.warn("Saw local status change event {}", statusChangeEvent);
} else {
logger.info("Saw local status change event {}", statusChangeEvent);
}
}
};
}
}
这是绝对有效且经过良好测试的代码您使用的是哪个版本的spring cloud?我有两个项目正在进行中,在我直接从GitHub获得的示例中,我使用的是1.1.0。在我的实际项目中,我使用SpringCloudStarter配置1.0.3。也没有注销客户端。您实际等待了多长时间?我可以花一些时间取消默认设置的注册。我听说应该需要90秒到4分钟,但我已经等了一个多小时。我停止了服务,去吃午饭,刷新了Eureka仪表板,服务仍在显示。针对此问题向文档回购请求可能对许多其他人非常有帮助。。。如果有人还没有这样做。这些值不是太短了吗?这些值只是示例,根据您的用例,您必须找到正确的值。上述设置将在eureka服务器上增加更多负载,但会降低将流量转发到非工作服务的风险