微服务架构实战学习(八):Eureka 总结及注意事项

在第六篇中,我们已经有过将 Eureka Client 注册到本地 Eureka Server 服务上的介绍,但当时的本地 Eureka Server 服务是个单节点服务,在第七篇中我们实现了 Eureka Server 高可用方案后 Client 又该如何注册呢?

其实很简单,只需要将 Client 注册到集群中的每一个节点即可。

一、Eureka Client 高可用

1.1 Eureka Client 配置

以第六篇中我们创建的 Eureka Client 为例。当时,我们注册到单节点的 Eureka Server 的配置文件如下所示:

spring:
  application:
    name: client-test

server:
  port: 8080

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/

而我们只需要将 eureka.client.service-url.defaultZone 的值由一个节点改为多个节点即可,如下配置:

spring:
  application:
    name: client-test

server:
  port: 8080

eureka:
  client:
    service-url:
      defaultZone: http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/

注:http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/ 是我们在第七讲中实现的一个 Eureka 高可集群方案。

1.2 实现 client 高可用

前面我们实现了 Eureka Server 的高可用,即建立一个集群来实现 Server 服务的交叉注册,并且我们将客户端服务分别注册到集群上的每一个节点,这样即使某一个 Server 服务挂掉了,仍然能够保证我们能够获取到我们的 Client 服务信息。

这似乎看起来已经是一个完美的解决方案了呀,还要做什么 client 的高可用呢?

难道你没发现一个问题,如果我们的 client 服务它自己挂了呢?就算我们的 Server 服务是正常的,那么我们不是也访问不了我们的 Client 端的服务了吗,那这个问题如何解决呢?

其实非常简单,我们只需要把我们的 client 服务的程序多运行几个便解决了这个问题,启动方法大致有两种:
(1) 我们可以在同一台服务器上启动多个 Client 程序监听不同的端口,只需要该服务器与 Server 集群的服务器网络连通。
(2) 也可以在不同服务器上启动多个 Client 程序监听 "不同/相同" 的端口,同样需要该服务器与 Server 集群的服务器网络连通。

如:
我在 localhost 上运行一个 localhost:8080 的 Client 并注册到 http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/
在 localhost 上运行一个 localhost:8081 的 Client 并注册到 http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/
在 192.168.174.135 (不同于 Eureka Server 集群另一台虚拟机) 运行一个 192.168.174.135:8080 的 Client 并注册到 http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/

程序打包及运行此处省略,可参考第六篇中介绍的方法操作。
运行正常后,我们可以从 Eureka Server 集群的各节点中查看到已经注册的 Eureka Client 服务,如下图所示:


192.168.174.200 Eureka Server UI

192.168.174.201 Eureka Server UI

其他节点信息基本相同,不再列出。

至此,我们的 Eureka 的 Server 和 Client 的高可用便完整的实现了。

二、Eureka 总结及注意事项

2.1 Eureka 注意事项

1 伪高可用

在我们将 Client 服务注册到我们的 Server 集群上时,也许有人会发现,如果我们的注册地址只填写 Server 集群上的一个节点,我们也能在三个节点的 UI 界面上都看到这个 Client 服务。如下示例:

Client -> application.yml

eureka:
  client:
    service-url:
      defaultZone: http://hadoop1:8000/eureka/

这是不是说我们前面讲的在 Client 的配置文件中配置 Eureka Server 集群的每一个节点是多余的操作呢?其实不然,我们只配置了注册到 hadoop1 节点的 Eureka Server 服务,那么 Client 服务就只是在 hadoop1 节点上进行了注册,而在 hadoop2/hadoop3 节点上也能看见 Client 服务的信息则是因为 Server 之间有互相同步数据的功能。因此,我们只是在 hadoop2/hadoop3 节点看到了 hadoop1 上的数据而已,实则并没有真正注册在 hadoop2/hadoop3 节点。

如果 hadoop1 节点的 Eureka Server 不幸挂掉了的话,那么 hadoop2/hadoop3 节点上的 Client 服务也就看不到了。

这就是一个伪高可用的坑。

1 Eureka Server 自己本身也是一个 Client,它也需要向 其他的 Eureka Server 注册

从构建集群时,我们可以了解到,Eureka Server
这有点类似于,苏宁是一个电商平台,用户可以直接从苏宁的官网上买到其所售的商品;淘宝也是一个电商平台,用户也可以直接从淘宝上买到其所售的商品。然后,苏宁在淘宝上注册了一个店铺。这样你既能从苏宁官网买到他所售的商品,也能从淘宝的苏宁店铺买到他的商品...
当然,苏宁在淘宝注册店铺的原因应该不会是害怕自家的官网宕掉了...哈哈,此处思路应该是相通的,只是各自所需要达到的目的可能不同。
Eureka Server 使用相互交叉注册的方式,能够使得即使一个服务挂掉了,整个注册中心仍然处于可正常运转的状态。

2 Eureka Server 自我保护机制

Eureka Server 的自我保护机制可以通过 eureka.server.enable-self-preservation: false 来关闭。

自我保护机制的响应率阀值默认 85%,如果 15 min 之内心跳失败的比例低于该阀值,会有告警,但 Eureka Server 还是会保留 Client 在注册中心里,这是为了防止由于网络原因导致了心中检测出现问题,给出了一定的容错空间。

此阀值也可以通过设置 eureka.server.renewal-percent-threshold:0.50 来进行设置

2.2 Eureka 总结

1 创建 Eureka Server/Client

要创建一个 Eureka Server/Client 程序,我们只需要以下几步
(1) 创建一个 spring boot 项目
(2) 添加 spring cloud netflix 依赖及 spring boot 依赖
(3) 配置项目信息
(4) 在 spring boot 的启动类上添加 @EnableEurekaServer (Server) 注册或者 @EnableDiscoveryClient/@EnableEurekaClient (Client)注解即可。

2 高可用

要实现 Eureka Server 的高可用,我们只需要为 Eureka Server 服务搭建一个集群,让其多个(至少俩)服务之间交叉注册即可。

要实现 Eureka Client 的高可用,我们只需要为 Eureka Client 程序多启动几个服务并且注册到 Eureka Server 即可。

3 Eureka 服务间通讯机制

Eureka 默认使用 Jersey/Xstream/ 进行数据的序列化,使用 HTTP 协议进行 Client 与 Server 端的通信,但你也可以使用自己的序列化方式来进行服务间通信。官方文档地址如下:
https://github.com/Netflix/eureka/wiki/Understanding-eureka-client-server-communication

4 Eureka 自我保护机制

自我保护机制是跟 Eureka 的心跳机制有关的 (心跳机制就是 Client 与 Server 端每隔一段时间进行一次网络通信,交换服务的相关元数据)。而用过网络通信自然就有可能存在网络上的问题,比如,Client A 本来运行是正常的,但在 Client A 与 Server A 之前的网络出现了异常,导致这两者之间的通信中断。这种情况下就属于误判了,因为 Client 本身是正常运行的,于是为了防止这类情况,Eureka 做了个自我保护机制。

官方文档地址如下:
https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication

5 官方的 Eureka 高可用架构图

前面虽然我也画过 Eureka 的高可用架构图,但我只画了 Server 部分的,完整及权威的请参数如下架构图:


Eureka architecture

官方文档地址

https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance

6 更多 Eureka Server/Client 的配置

更多 Eureka Server/Client 的配置请参考官方源码

EurekaServerConfigBean 类

https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfigBean.java

EurekaClientConfigBean 类
https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java

EurekaInstanceConfigBean 类
https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java

7 Eureka 相关项目代码

Eureka Server

https://github.com/jiangzhuolin/eureka-server-simple

Eureka Client
https://github.com/jiangzhuolin/eureka-client-simple

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 本文参考了:http://blog.didispace.com/springcloud7/http://blog....
    WeiminSun阅读 7,167评论 0 23
  • 1 为什么需要服务发现 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基...
    谦小易阅读 25,045评论 4 93
  • 软件是有生命的,你做出来的架构决定了这个软件它这一生是坎坷还是幸福。 本文不是讲解如何使用Spring Cloud...
    Bobby0322阅读 22,572评论 3 165
  • 连绵的雪峰刺向黑夜 天空抖落遍野的白霜 巨风的车轮碾着大地 荒原的月是行者的灯 骑马人手中的长鞭挥舞着孤独 岩石一...
    念今尘阅读 661评论 0 49