spring cloud 学习笔记-Eureka

原创 2017年04月16日 22:28:43

最近在慢慢学习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/

was unable to refresh its cache! status = Cannot execute request on any known server

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: con...
  • haoxiaoyong1014
  • haoxiaoyong1014
  • 2018-02-27 17:55:51
  • 580

8761 - was unable to refresh its cache! status = Cannot execute request on any known server

今天搭建Spring-Cloud-Eureka-Server 和client的demo,由于之前没有做过相关项目,碰到一个问题时,解决起来浪费了不少时间,问题如下:client启动时,报了如下错误:2...
  • huangyaa729
  • huangyaa729
  • 2017-09-18 11:34:06
  • 1424

Spring Cloud之踩坑01 -- Eureka高可用配置

    问题描述: 在进行Eureka高可用配置时,控制台一直出现“”的错误,但是在浏览器中输入地址:peer1:8761是,却可正常运行。对此,我不懂为何控制台出现异常报错,但是浏览器中却可正确运行...
  • dear_Alice_moon
  • dear_Alice_moon
  • 2018-02-26 10:37:09
  • 2321

Connection refused: connect Cannot execute request on any known server

Connection refused: connect Cannot execute request on any known server :无法在任何已知服务器上执行请求 出现这个问题你...
  • haoxiaoyong1014
  • haoxiaoyong1014
  • 2018-02-27 17:22:55
  • 177

spring cloud 的启动Eureka client报错--Cannot execute request on any known server

错误如图: 原因:Eureka的Server没有启动,而在使用@EnableDiscoveryClient或者@EnableEurekaClient之后,该客户端会自动去寻找Eureka Ser...
  • November22
  • November22
  • 2017-01-18 13:55:01
  • 25621

基于spring-cloud实现eureka注册服务小案例

本案例来自于spring官网:http://spring.io/guides/gs/service-registration-and-discovery/ JDK要求1.8或以上版本。首先创建两个项...
  • beyannanfei
  • beyannanfei
  • 2016-07-30 00:53:59
  • 35576

7.hystrix开启request cache

我们上一讲讲解的那个图片,顺着那个图片的流程,来一个一个的讲解hystrix的核心技术1、创建command,2种command类型2、执行command,4种执行方式3、查找是否开启了request...
  • kang123488
  • kang123488
  • 2018-03-10 21:43:58
  • 15

the selection cannot be run on any server 原因

今天调试程序的时候,刚好出现 the selection cannot be run on any server 的问题
  • beiminxun
  • beiminxun
  • 2017-10-12 22:43:07
  • 3262

史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上...
  • forezp
  • forezp
  • 2017-04-08 18:16:57
  • 430802

spring cloud eureka 笔记

1、在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为。 禁止方式如下:eureka.client.register-with-eureka...
  • u011820505
  • u011820505
  • 2018-02-24 14:28:36
  • 214
收藏助手
不良信息举报
您举报文章:spring cloud 学习笔记-Eureka
举报原因:
原因补充:

(最多只允许输入30个字)