1、在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为。
禁止方式如下:
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
如果不禁止的话,会得到如下错误:
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
应该是因为当注册中心将自己作为客户端注册的时候,发现在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.
查阅了很多资料,终于了解了中间的问题。现将理解整理如下:
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
设置为false,eureka.instance.leaseRenewalIntervalInSeconds
则设置为30并运行2个Eureka实例。两个Eureka实例将每分钟向Eureka服务器发送4次更新,Eureka服务器最小阈值为1(用代码编写),因此阈值为5(此数字将乘以eureka.server.renewalPercentThreshold
稍后讨论的因素)。
SELF保存模式:如果更新(最后一分钟)小于更新阈值,自我保存模式将被激活。
因此在上面的例子中,SELF保存模式被激活,因为阈值是5,但是尤里卡服务器只能接收4次更新/分钟。
自我保护模式的设计是为了避免网络连接失败。Eureka实例A和B之间的连接性很好,但由于连接问题,B未能在短时间内将其租借给Eureka服务器,此时Eureka服务器不能简单地将实例B踢出去。如果确实如此,实例尽管B可用,但A不会从Eureka服务器获得可用的注册服务。所以这是SELF PRESERVATION MODE的目的,最好打开它。
最小阈值1写入代码中。registerWithEureka
设置为false,因此不会有Eureka实例寄存器,阈值将为1。
在生产环境中,通常我们会部署两台Eureka服务器registerWithEureka
并将其设置为true。因此,阈值将是2,并且Eureka服务器将每分钟更新两次,所以RENEWALS ARE LESSER THAN THRESHOLD
不会成为问题。
你是对的。eureka.instance.leaseRenewalIntervalInSeconds
定义每分钟发送到服务器的更新次数,但会增加上述因素eureka.server.renewalPercentThreshold
,默认值为0.85。
是的,这很正常,因为阈值初始值设置为1.所以如果registerWithEureka
设置为false,则更新总是低于阈值。
我有两个建议:
registerWithEureka
。eureka.server.renewalPercentThreshold
为0.49,因此当您单独启动Eureka服务器时,阈值将为0。