微服务的Eureka,服务端,客户端的一些关系和互相作用

时间:2024-04-11 12:27:54

我们需要面临一个问题:
在微服务里面,由服务端,客户端,注册中心三要素组成,以滴滴平台为例,这三要素的运行,最重要的就是注册中心,为什么呢,因为服务端,客户端,你可以少一个两个,并不会影响到整体滴滴平台和广大人民群众的出行,但是如果你的注册中心垮掉了,这就导致了你的服务端和客户端都只是一个摆设,没有一个中心可以转接他们的服务,所以导致滴滴平台的瘫痪,所以为了解决这一个问题,我们不可能只有一个注册中心,万一这一个注册中心出了问题,满盘皆输。

但是我们不可能直接编写很多个注册中心,这么多客户端和服务端,一个个去编写注册中心,量十分巨大不说,而且非常耗钱耗力,所以我们只需要增加注册中心的部署数量就可以了,怎么增加呢?

微服务的Eureka,服务端,客户端的一些关系和互相作用
在这里点击copy,复制它的部署

但是这么多部署注册中心,他们不会共享一个端口号的,那怎么办

我们可以修改他们的端口号,再让他们进行互相注册:

微服务的Eureka,服务端,客户端的一些关系和互相作用
微服务的Eureka,服务端,客户端的一些关系和互相作用
没改完一次,就运行一下程序,让他们进行互相注册,这样就可以有多个部署,有多个注册中心了。

运行成功后,你可以输入网址查看注册中心,你会发现Eureka有两个端口:
微服务的Eureka,服务端,客户端的一些关系和互相作用
这就是成功了。

有一个问题需要解决,就是注册中心为什么要相互注册呢,我两个注册中心独立开来运行不行吗?

原因就是,我们需要多个注册中心防止崩盘,如果分开运行,那只相当于开了一个注册中心,和原来一样没什么作用。

那如果我如果有很多个注册中心,总不能一个个让它们互相进行注册吧

不会的,如果你有很多个注册中心,你可以用圆圈注册法,打个比方,四个注册中心分别是10086,10087,10088,10089,注册的顺序就是10086–10087–10088–10089–10086

就是这样把它们绕回来,这也是相当于达到了互相注册的效果

注册完这么多注册中心之后,服务端发送服务,如果当前注册中心挂了,它会自动跳转到下一个注册中心。

服务提供者需要在Eureka注册服务,它的yml配置里面需要有一项这个
微服务的Eureka,服务端,客户端的一些关系和互相作用
这个参数,如果这个参数为true,就是默认了可以进行注册服务,这个时候服务提供者就可以把自己在yml进行配置的信息传到注册中心进行注册,然后Eureka就会进行保存,保存到哪里呢,是保存到Map双层数据里面。

什么是Map双层数据

先来看看Map是怎么写的

Map<serviceId,Map<服务实例名,服务实例对象>>

我们来解析一下,serviceId是什么,记得我之前的博客有写过,服务名,也就是程序的名字,在yml文件里面配置的那个application:name,这个就是serviceId,也是程序名

然后第二层是放什么数据呢,也是放Map,但是这个Map里面又有两层数据,一个是服务实例名,一个是服务实例对象,这两个是什么意思呢,下面来慢慢解析

服务实例名,就是我们在启动了程序后,上了注册中心可以看到当前程序的服务实例名:
微服务的Eureka,服务端,客户端的一些关系和互相作用

这些就是服务实例名,对应着写进去就行,然后服务实例对象是什么呢,我之前也有个博客写到instance,这个方法有什么作用呢,就是用来获取服务端的host本机号,还有port接口号,并且把方法实例,这就是实例对象,把这两个参数传进去,然后整体上就是一个Map的双层数据了

总结一下上面的:就是服务端需要向注册中心提供自己的信息,需要在yml中配置上
微服务的Eureka,服务端,客户端的一些关系和互相作用
值为true,就可以把自己的信息提供给Eureka注册中心,Eureka注册中心就会用Map双层数据去接收服务端的信息。

服务端还有一个心跳时间,心跳时间是什么意思呢,就是告诉注册中心,“我还有心跳,别关掉我”,大概是这个意思,服务端需要间隔一段时间然后向注册中心发射自己还在存活着的信息,所以需要在yml中配置心跳时间

微服务的Eureka,服务端,客户端的一些关系和互相作用
这里的意思就是,心跳的间隔时间是30s,如果最长达到90s还没有心跳,注册中心就会认为这个服务端已经死亡了,就会断开服务

当然,消费者如果监测到服务者的这个值等于true的话:
微服务的Eureka,服务端,客户端的一些关系和互相作用

那么消费者就会自动开启把服务者的服务信息进行缓存到本地的一个操作,并且每隔30秒将会自动更新服务者的信息,如果我们觉得30秒的更新时间太长,我们可以选择修改更新时间:
微服务的Eureka,服务端,客户端的一些关系和互相作用
通过这个操作,把数值改得更小一点

如果服务端或者客户端遇到一些意外情况,比如网络故障,设备故障,离线了没有连接到注册中心,该怎么办?

如果遇到这种情况,注册中心就会启动自我检测功能,设定每隔90秒就进行一次检测,如果客户端或者服务端连接断开的时间超过了90秒,那么Eureka注册中心就会把对应的客户端或者服务端断开,这个检测时间是可以我们自己设定的,在Eureka模块这边
微服务的Eureka,服务端,客户端的一些关系和互相作用

可以设置时间长一点或者短一点。

如果遇到服务端或者客户端意外停止,我的注册信息会丢失吗?

现在的Eureka功能还算挺好,如果服务端或客户端达到了连接时间的最大值仍然没有心跳,则Eureka不会放弃保存客户端或者服务端的信息,而是把它们的信息保存起来在注册中心当中方便它们下次连接,这就是Eureka的自我保护机制,但是这个也是一个问题,就是会给开发人员带来烦恼,如果在开发的过程中,Eureka仍保存着这些信息没有删掉的话,可能会影响到开发,所以就有个配置可以配置Eureka是否开启自我保护机制
微服务的Eureka,服务端,客户端的一些关系和互相作用
这里选择false就是让Eureka关闭自我保护机制,如果是true的话就是开启

好了 今天学到这里,需要总结一下上面总过学了什么知识:

一个是客户端和服务端的心跳怎么设置,客户端可以通过配置来获取服务端的服务信息,并且可以设定每间隔多少秒更新一次数据,还有部署多个注册中心的方法,就是配置不同端口的Eureka,然后让其中两个互相注册,如果Eureka的数量非常多,那就用圆圈注册方法。

还有的就是服务端如果配置可以进行服务,它就需要把自己的服务数据上传到Eureka处,这就需要把数据传到Map双层数据里面,Map双层数据传入的是什么呢?
1.微服务的名字
2.服务实例名
3.服务实例对象

好了,就写到这里