当前位置: 首页 > 知识库问答 >
问题:

了解Spring Cloud Eureka服务器的自我保存和更新阈值

公孙宏远
2023-03-14

我已经在GitHub上启动了一个简单的项目。它基本上是一个Eureka服务器(阿基米德)和三个Eureka客户端微服务(一个公共API和两个私有API)。查看GitHub的自述文件获得详细描述。

关键是,当一切都在运行时,我希望如果一个私有微服务被杀死,那么Eureka服务器会发现并从注册表中删除它。

我在Stackoverflow上发现了这个问题,通过在Eureka服务器配置中使用enableSelfPreservation:false解决了这个问题。这样做一段时间后,被杀死的服务就会像预期的那样消失。

不过我可以看到以下消息:

已关闭自我保护模式。如果出现网络/其他问题,这可能无法保护实例过期。

1.自我保存的目的是什么?文档中说,在自我保存的情况下,“客户端可以获得不再存在的实例”。那么什么时候开/关它是可取的呢?

Lease expiration enabled    true/false
Renews threshold    5
Renews (last min)   4

我遇到了一个奇怪的阈值计数行为:当我单独启动Eureka服务器时,阈值是1。

2.我有一台Eureka服务器,并且配置了registerwitheureka:false以防止它在另一台服务器上注册。那么,它为什么会出现在阈值计数中呢?

3.对于我启动的每一个客户端,阈值计数增加+2。我猜是因为他们每分钟发送2条续订信息,对吗?

renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4

服务器CFG:

server:
  port: ${PORT:8761}

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false
#   waitTimeInMsWhenSyncEmpty: 0

客户端1 CFG:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true

共有1个答案

赵修诚
2023-03-14

我得到了与@codependent相同的问题,我在谷歌上搜索了很多,并做了一些实验,在这里我贡献一些关于Eureka服务器和实例如何工作的知识。

每个实例都需要更新其对Eureka服务器的租约,频率为每30秒一次,可以在Eureka.instance.LeaseRenewalIntervalinSeconds中定义。

Renews(last min):表示在最后一分钟内从Eureka实例接收到的更新次数

Renews Threshold:Eureka服务器期望每分钟从Eureka实例接收的更新。

例如,如果registerwitheureka设置为false,Eureka.instance.LeaseRenewalIntervalinSeconds设置为30并运行2个Eureka实例。两个Eureka实例每分钟将向Eureka服务器发送4次更新,Eureka服务器最小阈值为1(用代码编写),因此阈值为5(这个数字将乘以Eureka.server.RenewalPercentThreshold,稍后将讨论)。

自我保存模式:如果更新(最后一分钟)小于更新阈值,自我保存模式将被激活。

所以在上面的例子中,由于阈值是5,所以启动了自我保护模式,但是Eureka服务器每分钟只能接收4次更新。

  1. 问题1:

设计了自保模式,以避免网络连接不良故障。Eureka实例A和B之间的连通性很好,但是B由于连通性出现故障而无法在短时间内续签给Eureka服务器,此时Eureka服务器不能简单地踢出实例B,如果踢出实例B,则实例A将无法从Eureka服务器获得可用的注册服务,尽管B可用。所以这就是自我保存模式的目的,最好打开它。

代码中写入了最小阈值1。registerwitheureka设置为false,因此没有Eureka实例寄存器,阈值为1。

在生产环境中,通常我们部署两台Eureka服务器,registerwitheureka将设置为true。因此阈值将为2,并且Eureka服务器将每分钟向自己续订两次租约,因此续订少于threshold不会有问题。

是的,你是对的。Eureka.Instance.LeaseRenewalIntervalinSeconds定义了每分钟发送到服务器的更新次数,但它会乘以前面提到的一个系数Eureka.server.RenewalPercentThreshold,默认值为0.85。

是的,这是正常的,因为阈值初始值设置为1。因此,如果registerwitheureka设置为false,则renews总是低于阈值。

对此我有两点建议:

  1. 部署两台Eureka服务器并启用RegisterWithEureKA
  2. 如果只想在demo/dev环境中部署,可以将Eureka.server.RenewalPercentThreshold设置为0.49,这样当您单独启动Eureka服务器时,threshold将为0。
 类似资料:
  • 问题内容: 我已经开始开发微服务,尽管我已经研究了一段时间,同时阅读了Spring的文档和Netflix的文档。 我已经开始在Github上进行一个简单的项目。它基本上是一个Eureka服务器(Archimedes)和三个Eureka客户端微服务(一个公共API和两个私有)。查看github的自述文件以获取详细描述。 关键是,当一切都运行时,我希望如果某个私有微服务被杀死,Eureka服务器会意识

  • 在客户端,使用“new WebSocket('ws:/blahlah')”创建新的套接字处理程序 然后使用onOpen()方法就知道我们已连接到WS服务器 使用onMessage()方法,已知已从WS服务器接收到消息 onClose()方法指示套接字连接已关闭 所以从客户的角度来看是很清楚的。但是从服务器的角度来看,流程是如何进行的(就像上面的客户端一样),websocket服务器进程的确切含义是

  • 我有一个简单的eureka服务器,配置简单(这个服务器用于开发和本地测试,spring-boot-starter 1.5.4版本,eureka 1.3.4)。 它有以下配置(没有其他特殊配置):

  • 我的Kubernetes集群运行在谷歌云下。我有部署运行端口443和LoadBalancer公开它到互联网。 我是这样创建的: 运行此命令后,loadbalancer将指向部署。现在,我创建了,并希望更改loadbalancer以指向新的部署()。 注意:删除和重新创建部署是释放外部IP地址,我想避免它。 如何在不丢失外部IP的情况下修补现有服务以指向另一个部署?

  • 我是Docker的新人,我正在尝试创建/使用现有映像来启动我的应用程序。在阅读了几篇stackoverflow帖子和Docker文档后,我能够使用Docker容器启动我的应用程序。现在我正在寻找保存修改后的Docker容器的正确方法,以便我可以重用容器通过运行docker命令来启动我的应用程序。 我看到人们使用$docker提交来保存docker容器。如果我运行此命令,容器将保存在哪里?其他人可以