spring cloud eureka 笔记

1、在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为。 
禁止方式如下:

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
  • 1
  • 2

如果不禁止的话,会得到如下错误:

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
2017-04-16 22:16:12.943  WARN 6864 --- [           main] c.n.d.s.t.d.RetryableEurekaHttpClient    : Request execution failure
2017-04-16 22:16:12.951 ERROR 6864 --- [           main] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_UNKNOWN/DESKTOP-MQ8D0C9:8761 - was unable to refresh its cache! status = Cannot execute request on any known server
  • 1
  • 2
  • 3

应该是因为当注册中心将自己作为客户端注册的时候,发现在server上的端口被自己占据了,然后就挂了。

如果要开启自动注册的话,可以启动两个server,互相注册 
A:eureka.client.serviceUrl.defaultZone=http://localhost:1112/eureka/ 
B:eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

2、启动服务注册中心的时候,如果没在application.properties中显示指定端口的话,我的机子上默认是8761端口,然后虽然启动没问题,但是访问local host:8761/的时候就访问不了,但是如果指定端口server.port = 8761,就一切正常了。不知道为什么,如果有人知道的话请指点一下。

3、启动两个client,过了一会,停了其中一个,访问注册中心时,界面上显示了红色粗体警告信息:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
  • 1

查阅了很多资料,终于了解了中间的问题。现将理解整理如下:

Eureka server和client之间每隔30秒会进行一次心跳通信,告诉server,client还活着。由此引出两个名词: 
Renews threshold:server期望在每分钟中收到的心跳次数 
Renews (last min):上一分钟内收到的心跳次数。

前文说到禁止注册server自己为client,不管server是否禁止,阈值(threshold)是1。client个数为n,阈值为1+2*n(此为一个server且禁止自注册的情况) 
如果是多个server,且开启了自注册,那么就和client一样,是对于其他的server来说就是client,是要*2的

我开了两个server,自注册,相关数据如下 
这里写图片描述 
阈值:1+2*1 
renews: 
1)自注册 2 + 2*1 
2)非自注册:2*1

Eurake有一个配置参数eureka.server.renewalPercentThreshold,定义了renews 和renews threshold的比值,默认值为0.85。当server在15分钟内,比值低于percent,即少了15%的微服务心跳,server会进入自我保护状态,Self-Preservation。在此状态下,server不会删除注册信息,这就有可能导致在调用微服务时,实际上服务并不存在。 
这种保护状态实际上是考虑了client和server之间的心跳是因为网络问题,而非服务本身问题,不能简单的删除注册信息

stackoverflow上,有人给出的建议是: 
1、在生产上可以开自注册,部署两个server 
2、在本机器上测试的时候,可以把比值调低,比如0.49 

3、或者简单粗暴把自我保护模式关闭

eureka.server.enableSelfPreservation=false                        

1.自我保护的目的是什么?文件指出,在“客户可以获得不再存在的实例”的情况下进行自我保护那么建议何时开启/关闭它?

此外,当自我保护功能开启时,您可能会在Eureka服务器控制台警告中收到一条杰出的消息:

紧急!EUREKA可能会不正当地声称,如果没有。延期时间少于阈值,而且这些物品没有过期只是为了安全。

现在,继续使用Spring Eureka控制台。

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

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

2.我有一台Eureka服务器,并配置registerWithEureka: false为阻止它在另一台服务器上注册。那么,它为什么会出现在门槛值?

3.对于每个客户,我开始将阈值计数增加+2。我想这是因为他们每分钟发送2条更新消息,对吗?

4.尤里卡服务器从不发送更新,因此最后一次更新总是低于阈值。这是正常的吗?

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



更新阈值:Eureka服务器预计每分钟从Eureka实例收到的更新。

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

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

因此在上面的例子中,SELF保存模式被激活,因为阈值是5,但是尤里卡服务器只能接收4次更新/分钟。

  1. 问题1:

自我保护模式的设计是为了避免网络连接失败。Eureka实例A和B之间的连接性很好,但由于连接问题,B未能在短时间内将其租借给Eureka服务器,此时Eureka服务器不能简单地将实例B踢出去。如果确实如此,实例尽管B可用,但A不会从Eureka服务器获得可用的注册服务。所以这是SELF PRESERVATION MODE的目的,最好打开它。

  1. 问题2:

最小阈值1写入代码中。registerWithEureka设置为false,因此不会有Eureka实例寄存器,阈值将为1。

在生产环境中,通常我们会部署两台Eureka服务器registerWithEureka并将其设置为true。因此,阈值将是2,并且Eureka服务器将每分钟更新两次,所以RENEWALS ARE LESSER THAN THRESHOLD不会成为问题。

  1. 问题3:

你是对的。eureka.instance.leaseRenewalIntervalInSeconds定义每分钟发送到服务器的更新次数,但会增加上述因素eureka.server.renewalPercentThreshold,默认值为0.85。

  1. 问题4:

是的,这很正常,因为阈值初始值设置为1.所以如果registerWithEureka设置为false,则更新总是低于阈值。

我有两个建议:

  1. 部署两台Eureka服务器并启用registerWithEureka
  2. 如果您只想在demo / dev环境中进行部署,则可以将其设置eureka.server.renewalPercentThreshold为0.49,因此当您单独启动Eureka服务器时,阈值将为0。





你可能感兴趣的:(spring,cloud)