当前位置: 首页 > 科技观察

Eureka挂了,微服务还能调优吗?

时间:2023-03-21 12:25:14 科技观察

这是公众号的一位读者遇到的一道面试题。说实话,这道题并不难。如果你做过微服务开发,这个面试题应该马上就能答对了。如果你没有做过微服务开发,但是学习过一些SpringCloud组件的用法,这个问题你可能要稍微思考一下,但你应该可以回答。今天我就和大家聊聊这个问题。1.练习这种题,听别人说N遍,还不如自己动手练习,记住清楚。你可以快速构建一个Eureka服务注册中心,然后构建一个服务消费者和服务提供者,将这两个服务注册到Eureka,最后在服务消费者上简单调用服务提供者。这个过程非常简单。相信稍微研究过SpringCloud的人都能搞定。不清楚的可以参考松哥的视频(SpringBoot+Vue+SpringCloud系列视频教程))。服务调好后,接下来关闭Eureka。注意不要关闭服务提供者和服务消费者。关闭后,继续使用服务消费者调用服务提供者。“这时候,你会惊讶的发现服务还能调!”Demo太简单了,就不写了。如果懒得自己写,也可以下载直接运行:https://github.com/lenve/springcloud-video-samples2。原因分析为什么Eureka关闭后服务还能调用?我们先看一个简单的服务调用图:先说一下流程:Eureka作为服务注册中心启动。Provider和Consumer分别作为服务启动并注册到Eureka。以提供商为例。provider注册的时候会告诉eureka我的名字是provider,我的地址是xx.xx.xx.xx,我的端口是xx,我的xx是xx,也就是说provider会告诉eureka它的一些元数据信息;消费者也是如此。接下来,消费者想要调用提供者的接口,但不知道提供者的地址是什么。他只知道要调用的服务叫provider,于是consumer找到eureka,从eureka中查询provider的具体地址和端口。可能有一个或多个地址和端口(集群部署)。消费者获取到提供者的地址和端口后,直接调用提供者。从上面的流程图可以看出,一旦consumer获取了provider的具体地址,接下来的调用其实和eureka无关。因此,我们说一旦Eureka宕机,微服务是可以调整的,“但要有前提”。前提是什么?提供者的地址没有改变!如果提供者改变了一个IP地址或端口,此时,消费者将无法及时感知到这种变化,从而无法进行通信。当Eureka没有宕机时,提供者的IP变化可以通过Eureka被消费者感知到,进而调整调用地址。现在Eureka宕机了,消费者是感知不到的。文章写到这里了,下面说说SpringCloud涉及的一些原理。3.相关原理Eureka本身可以分为两部分,EurekaServer和EurekaClient。先来看EurekaServer:3.1EurekaServerEurekaServer主要对外提供三个功能:服务注册,所有的服务都注册到EurekaServer上,这是Eureka的基本功能。提供一个注册表,它是所有已注册服务的列表。Eureka内部通过两层缓存机制来维护这个注册中心。EurekaClient在调用服务时,需要获取这个注册中心。一般来说,这个注册表会被缓存起来。如果缓存失败,则直接获取最新的registry。同步状态,EurekaClient通过注册、心跳等机制将当前客户端状态与EurekaServer同步,以便EurekaClient及时感知变化。3.2EurekaClient服务需要在Eureka上注册。这种注册本身就是HTTP请求,但是自己写注册流程太麻烦了。EurekaClient可以帮助我们简化注册流程。一般来说,EurekaClient有以下功能:服务注册服务提供者将自己注册到服务注册中心(EurekaServer)。需要注意的是,所谓的服务提供者只是一个业务部门,本质上是一个Eureka服务器。客户。EurekaClient在向EurekaServer注册时,需要提供自身的一些元数据信息,比如IP地址、端口、名称、运行状态等,这些信息以后也会被服务消费者获取到。获取注册信息EurekaClient从EurekaServer获取服务注册信息,“并缓存到本地”,这句话是关键。当EurekaClient需要调用远程服务时,会从这些信息中查找远程服务对应的IP地址、端口等信息。EurekaClient上缓存的服务注册信息会定期(30秒)更新。如果EurekaServer返回的注册信息与本地缓存的注册信息不一致,EurekaClient会自动处理。这里还涉及到两个属性:一个是是否允许获取注册信息:eureka.client.fetch-registry=true。另一个是缓存在EurekaClient上的服务注册信息。定时更新的间隔默认是30秒,可以通过以下属性修改:eureka.client.registry-fetch-interval-seconds=30。服务更新EurekaClient在EurekaServer上注册后,默认情况下,EurekaClient会每隔30秒向EurekaServer发送一次心跳消息,告诉EurekaServer我还在运行。如果EurekaServer连续90秒没有收到EurekaClient的更新消息(连续3次都没有发送),就会认为EurekaClient下线,会将下线的EurekaClient从当前服务中移除登记表。这里有两个相关属性(一般不建议修改):eureka.instance.lease-renewal-interval-in-seconds表示服务的续约时间,默认为30秒。eureka.instance.lease-expiration-duration-in-seconds表示服务过期时间,默认90秒。服务下线服务下线EurekaClient下线时,会主动发消息告诉EurekaServer我下线了。从上面的介绍可以看出,EurekaClient会自动拉取、更新和缓存EurekaServer中的信息,这样即使EurekaServer的所有节点都宕机了,EurekaClient仍然可以获取到调用服务的地址(前提是服务地址没有改变)。好了,这就是本文的全部内容。其实,事情并不难。有兴趣的朋友不妨一试~