目录
注意:本文参考
20000 字的 Spring Cloud 总结,从此任何问题也难不住你
docs/system-design/framework/springcloud/springcloud-intro.md · SnailClimb/JavaGuide - Gitee.com
深入浅出 Spring Cloud 之 Eureka - 掘金
Eureka是什么
Eureka是Netflix的一个子模块,也是核心模块之一。
Eureka
是基于REST
(代表性状态转移)的服务,主要在 AWS
云中用于定位服务,以实现负载均衡和中间层服务器的故障转移。我们称此服务为Eureka
服务器。
Eureka 还带有一个基于 Java
的客户端组件 Eureka Client
,它使与服务的交互变得更加容易。客户端还具有一个内置的负载平衡器,可以执行基本的循环负载平衡。
在 Netflix
,更复杂的负载均衡器将 Eureka
包装起来,以基于流量,资源使用,错误条件等多种因素提供加权负载均衡,以提供出色的弹性。
服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper。
总的来说,Eureka
就是一个服务发现框架。何为服务,何又为发现呢?
Eureka的使用 《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka 的使用 - 知乎
Eureka的参数配置 微服务架构:Eureka参数配置项详解 - 风中程序猿 - 博客园
Eureka例子
举一个生活中的例子,就比如我们平时租房子找中介的事情。
在没有中介的时候我们需要一个一个去寻找是否有房屋要出租的房东,这显然会非常的费力,一你找凭一个人的能力是找不到很多房源供你选择,再者你也懒得这么找下去(找了这么久,没有合适的只能将就)。这里的我们就相当于微服务中的 Consumer
,而那些房东就相当于微服务中的 Provider
。消费者 Consumer
需要调用提供者 Provider
提供的一些服务,就像我们现在需要租他们的房子一样。
但是如果只是租客和房东之间进行寻找的话,他们的效率是很低的,房东找不到租客赚不到钱,租客找不到房东住不了房。所以,后来房东肯定就想到了广播自己的房源信息(比如在街边贴贴小广告),这样对于房东来说已经完成他的任务(将房源公布出去),但是有两个问题就出现了。第一、其他不是租客的都能收到这种租房消息,这在现实世界没什么,但是在计算机的世界中就会出现 资源消耗 的问题了。第二、租客这样还是很难找到你,试想一下我需要租房,我还需要东一个西一个地去找街边小广告,麻不麻烦?
那怎么办呢?我们当然不会那么傻乎乎的,第一时间就是去找 中介 呀,它为我们提供了统一房源的地方,我们消费者只需要跑到它那里去找就行了。而对于房东来说,他们也只需要把房源在中介那里发布就行了。
但是,这个时候还会出现一些问题。
房东注册之后如果不想卖房子了怎么办?我们是不是需要让房东 定期续约 ?如果房东不进行续约是不是要将他们从中介那里的注册列表中 移除 。
租客是不是也要进行 注册 呢?不然合同乙方怎么来呢?
中介可不可以做 连锁店 呢?如果这一个店因为某些不可抗力因素而无法使用,那么我们是否可以换一个连锁店呢?
针对上面的问题我们来重新构建一下上面的模式图
为什么要有Eureka
子系统与子系统之间不是在同一个环境下,那就需要远程调用。远程调用可能就会想到httpClient,WebService等等这些技术来实现。
既然是远程调用,就必须知道ip地址,我们可能有以下的场景。
功能实现一:A服务需要调用B服务
在A服务的代码里面调用B服务,显式通过IP地址调用:`http://123.123.123.123:8888/java3y/3`
功能实现二:A服务调用B服务,B服务调用C服务,C服务调用D服务
在A服务的代码里面调用B服务,显式通过IP地址调用:`http://123.123.123.123:8888/java3y/3`,(同样地)B->C,C->D
功能实现三:D服务调用B服务,B服务调用C服务
在D服务的代码里面调用B服务,显式通过IP地址调用:`http://123.123.123.123:8888/java3y/3`,(同样地)B->C
…..等等等等
万一,我们B服务的IP地址变了,想想会出现什么问题:A服务,D服务(等等)需要手动更新B服务的地址
在服务多的情况下,手动来维护这些静态配置就是噩梦!
由Eureka来维护这些服务的ip,并且提供给消费者!
eureka与zookeeper的区别
Zookeeper保证CP
当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。
Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
1. Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
2. Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
3. 当网络稳定时,当前实例新的注册信息会被同步到其它节点中
因此, Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。
Eureka作为单纯的服务注册中心来说要比zookeeper更加“专业”,因为注册服务更重要的是可用性,我们可以接受短期内达不到一致性的状况。
Eureka基础
Eureka的基础组件
服务发现:其实就是一个“中介”,整个过程中有三个角色:服务提供者(出租房子的)、服务消费者(租客)、服务中介(房屋中介)。
服务提供者:Service Provider, 服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
服务消费者:Service Consumer, 服务消费方从Eureka获取注册服务列表,从而能够消费服务
服务中介: