spring cloud 学习笔记-Eureka

最近在慢慢学习cloud的相关知识,会把碰见的一些问题记录下来。
对照学习的参考链接:【程序猿DD】Spring Cloud构建微服务架构系列,持续更新~](http://bbs.springcloud.com.cn/d/1-dd-spring-cloud)

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、understanding spring cloud eureka server self-preservation and renew threshold(http://stackoverflow.com/questions/33921557/understanding-spring-cloud-eureka-server-self-preservation-and-renew-threshold)
2、Understanding eureka client server communicationUnderstanding eureka client server communication(https://github.com/Netflix/eureka/wiki/Understanding-eureka-client-server-communication)
3、Eureka never unregisters a service
(http://stackoverflow.com/questions/32616329/eureka-never-unregisters-a-service)

4、前面说到多个eureka互相注册,那么是否相应的服务需要添加多个注册中心的地址呢?

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/,http://localhost:1112/eureka/

这样写多次当然是可以的。
但是eureka之间的同步机制,可以简化一下这一配置。多个eureka实例需要两两互相注册,就可以实现集群中节点完全对等的效果,此时只要服务注册到其中一个注册中心,就会同步到其他注册中心。

如果不是两两注册,例如A->B->C->D->A,就不行。
以下是测试截图
注册中心1
注册中心2
注册中心3
注册中心4

其次我们还需要开启自注册功能。
否则话,eurake-service不会互相注册下去,computer-service只在ab上存在。
测试截图如下:
AB一致:
这里写图片描述

CD一致:
这里写图片描述

学习链接:http://blog.didispace.com/springcloud6/

阅读更多
文章标签: spring spring-cloud
个人分类: spring spring-cloud
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭