Eureka 都挂了,微服务还能调通吗?
bigegpt 2025-06-12 10:54 9 浏览
如果你做过微服务开发,这个面试题应该能够立马答出来,如果你没做过微服务开发,但是学过一些 Spring Cloud 组件的用法,这个问题可能要稍微想一下,但是也应该能够答出来。
今天就来和大家说说这个问题。
1.实践一下
这种问题,听别人讲 N 遍,不如自己手动实践一遍记得清楚。
大家可以快速搭建一个 Eureka 服务注册中心,然后搭建一个服务消费者和服务提供者,将两个服务注册到 Eureka 上去,最后在服务消费者上面简单的调用一下服务提供者。这个过程很简单,相信大家稍微学过 Spring Cloud 的小伙伴都能搞定,如果搞不定,可以参考松哥的视频(Spring Boot + Vue + Spring Cloud 系列****))。
服务调通之后,接下来关闭 Eureka,注意不要关闭服务提供者和服务消费者,关闭之后,继续用服务消费者调用服务提供者,这个时候你会惊奇地发现,服务竟然还能调通!
Demo 过于简单,我就不写了,如果小伙伴们自己懒得写,也可以直接下载松哥写好的直接运行:
https://github.com/lenve/springcloud-video-samples
2.原因分析
为什么 Eureka 关闭后服务还能调用呢?我们先来看一张简单的服务调用图:
我来说一下这个流程:
- Eureka 作为一个服务注册中心启动。
- Provider 和 Consumer 分别作为服务启动,并且注册到 Eureka 上面去,以 provider 为例,provider 注册时会告诉 eureka,我叫 provider,我的地址是 xx.xx.xx.xx,我的端口是 xx,我的 xx 是 xx,就是说,provider 会将自己的一些元数据信息告诉 eureka;同理,consumer 也是如此。
- 接下来,consumer 要调用 provider 的接口,但是它不知道 provider 的地址是什么,他只知道要调用的服务叫 provider,于是 consumer 找到 eureka,从 eureka 上查询出来 provider 的具体地址和端口,这个具体的地址和端口,可能是一个,也可能是多个(集群化部署)。
- consumer 获取到 provider 的地址和端口之后,接下来就直接去调用 provider 了。
从上面一个流程图中,大家可以看出来,一旦 consumer 获取到 provider 的具体地址,接下来的调用其实就没有 eureka 什么事了。
所以,我们说一旦 Eureka 挂了,微服务是可以调通的,但是是有前提的。
什么前提?就是 provider 的地址没变!如果 provider 换了一个 IP 地址或者端口,这个时候,consumer 就无法及时感知到这种变化,就会调不通。当 Eureka 没有挂掉的时候,provider 的 IP 变化这种事情,可以通过 Eureka 让 consumer 感知到,进而对调用地址作出调整,现在 Eureka 挂了,consumer 就无法感知了。
文章既然都写到这儿了,我们就来顺便说下 Spring Cloud 在这里涉及到的一些原理。
3.相关原理
Eureka 本身可以分为两大部分,Eureka Server 和 Eureka Client。
我们先来看 Eureka Server:
3.1 Eureka Server
Eureka Server 主要对外提供了三个功能:
- 服务注册,所有的服务都注册到 Eureka Server 上面来,这是 Eureka 基本功能。
- 提供注册表,注册表就是所有注册商来服务的一个列表,Eureka 内部通过一个二层缓存机制来维护这个注册表。Eureka Client 在调用服务时,需要获取这个注册表,一般来说,这个注册表会缓存下来,如果缓存失效,则直接获取最新的注册表。
- 同步状态,Eureka Client 通过注册、心跳等机制,和 Eureka Server 同步当前客户端的状态,以便 Eureka Client 能够及时感知到变化。
3.2 Eureka Client
服务要注册到 Eureka 上面去,这种注册本身就是一个 HTTP 请求,但是自己手写注册过程的话太过于繁琐,Eureka Client 可以帮助我们简化注册过程。
一般来说,Eureka Client 有这样一些功能:
服务注册
服务提供者将自己注册到服务注册中心(Eureka Server),需要注意,所谓的服务提供者,只是一个业务上的划分,本质上他就是一个 Eureka Client。当 Eureka Client 向 Eureka Server 注册时,他需要提供自身的一些元数据信息,例如 IP 地址、端口、名称、运行状态等等,将来服务消费者获取到的也是这些信息。
获取注册信息
Eureka Client 从 Eureka Server 上获取服务的注册信息,并将其缓存在本地,这句是关键。
当 Eureka Client 在需要调用远程服务时,会从该信息中查找远程服务所对应的 IP 地址、端口等信息。Eureka Client 上缓存的服务注册信息会定期更新(30 秒),如果 Eureka Server 返回的注册表信息与本地缓存的注册表信息不同的话,Eureka Client 会自动处理。
这里,也涉及到两个属性:
- 一个是是否允许获取注册表信息:eureka.client.fetch-registry=true。
- 另一个是 Eureka Client 上缓存的服务注册信息,定期更新的时间间隔,默认 30 秒,可以通过如下属性自行修改:eureka.client.registry-fetch-interval-seconds=30。
服务续约
Eureka Client 注册到 Eureka Server 上之后,默认情况下,Eureka CLient 每隔 30 秒就要向 Eureka Server 发送一条心跳消息,来告诉 Eureka Server 我还在运行。
如果 Eureka Server 连续 90 秒都有没有收到 Eureka Client 的续约消息(连续三次没发送),他会认为 Eureka Client 已经掉线了,会将掉线的 Eureka Client 从当前的服务注册列表中剔除。
这里有两个相关的属性(一般不建议修改):
- eureka.instance.lease-renewal-interval-in-seconds 表示服务的续约时间,默认是 30 秒。
- eureka.instance.lease-expiration-duration-in-seconds 表示服务失效时间,默认是 90 秒。
服务下线
服务下线当 Eureka Client 下线时,它会主动发送一条消息,告诉 Eureka Server ,我下线啦。
从上面的介绍可以看出,Eureka Client 会自动拉取、更新以及缓存 Eureka Server 中的信息,这样,即使 Eureka Server 所有节点都宕机,Eureka Client 依然能够获取到想要调用服务的地址(前提是服务地址没有发生变化)。
好了,本文就先说这么多,其实东西不难,感兴趣的小伙伴赶紧去试试吧~
相关推荐
- 为3D手游打造, Visual Studio Unity扩展下载
-
IT之家(www.ithome.com):为3D手游打造,VisualStudioUnity扩展下载7月30日消息,微软正式发布升级版VisualStudioToolsforUnity扩...
- 由ArcMap属性字段自增引出字段计算器使用Python的技巧
-
1.前言前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQLServer中对于数值型字段可以设置自增。所以我打开ArcCatalog查看发现只提供默认值,没办法只能看...
- 微软首次回答 HoloLens 相关问题,终于爆料了
-
fengo2015/04/2115:11注:本文作者张静是NVIDIAGPU架构师,微信公众号“黑客与画家”(HackerAndPainter),知乎专栏地址。欢迎各位童鞋与他交流探讨。...
- C#指针的应用(c#指针类型)
-
C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同...
- C# 堆栈(Stack)(c# 堆栈中定位调用messagebox 的地方)
-
C#集合在C#中,堆栈(Stack)是一种后进先出(LIFO,LastInFirstOut)的数据结构。堆栈(Stack)适用于存储和按顺序处理数据,其中最新添加的元素会最先被移除。堆...
- 欢迎回来:Fortran意外重回流行编程语言20强榜单
-
TIOBE指数是用来确定一种编程语言受欢迎程度的指标之一。它并不表明哪种编程语言是最好的,也不表明哪种编程语言写的代码行数最多,而是利用在谷歌、维基百科、必应、亚马逊、YouTube等各种引擎和网站上...
- C#+NET MAUI实现跨平台/终端(linux,win,ios等)解决方案
-
简介.NETMulti-platformAppUI(.NETMAUI)是一个跨平台的框架,用于使用C#和XAML创建移动和桌面应用程序。使用.NETMAUI,您可以用一套代码库开发可以在A...
- C#代码安全红线:SQL注入防护终极方案,让你的系统固若金汤
-
在数字化时代,应用系统的安全性至关重要。而SQL注入攻击,长期盘踞在OWASP(OpenWebApplicationSecurityProject)漏洞榜单的前列,成为众多基于数据库的应用系统...
- C# (一)状态机模式(状态机代码实现)
-
最近空闲,炒炒隔夜饭,以前这些模式在自己项目种应用过不少,但一直没有像别人那样写一个系列,最近年纪大了,很多东西都忘记了,特别AI的兴起,更少写代码了,反正没什么事情,自己在重写一遍吧。创建型模式(5...
- C# 中 Predicate 详解(c#中的replace)
-
Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。Predicate<T>...
- C#中$的用法?(c#中&&什么意思)
-
文章来自AI问答。在C#中,$符号用于字符串插值(StringInterpolation)。字符串插值是C#6.0引入的一种特性,它允许你在字符串中直接嵌入表达式,而不需要使用string.For...
- C#并行编程:Parallel类(c# 并行处理)
-
在Parallel类中提供了三个静态方法作为结构化并行的基本形式:Parallel.Invoke方法:并行执行一组委托。Parallel.For方法:执行与C#for循环等价的并行方法。Parall...
- 颠覆认知!用Span重构foreach循环竟让数据处理快如闪电
-
在C#编程的世界里,数据处理效率始终是开发者们关注的焦点。随着项目规模的扩大和数据量的激增,哪怕是细微的性能提升,都可能对整个应用的响应速度和用户体验产生深远影响。近年来,C#引入的Span<T...
- Unity3D手游开发实践《腾讯桌球》客户端开发经验总结
-
本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:1.架构设计2.原生插件/平台交互3.版本与补丁4.用脚本,...
- .NET 7 AOT 的使用以及 .NET 与 Go 互相调用
-
目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)