注册中心 eureka
Eureka是spring cloud 中的注册中心,类似于Dubbo中的Zookeeper,
什么是注册中心,为什么需要注册中心
eureka搭建
Eureka本身是使用java开发的,springcloud使用springboot技术对Eureka进行了封装,所以在springCloud中使用Eureka非常方便,只需引入spring-cloud-start-Netflix-eureka-server这个依赖即可,
然后就像启动一个普通的springboot项目一样启动eureka即可
1、创建一个普通的springboot项目,导入eureka依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
然后在项目启动类上添加@EnableEurekaServer注解 表示开启eureka功能
2、在properties文件中添加配置信息
#给当前服务起一个名字
spring.application.name=eureka
#设置端口号
server.port=1111
#默认情况下,Eureka server也是一个微服务,所以当他还是一个注册中心的时候,他会有两层身份:1、注册中心
#2、普通服务,即当前服务回把自己注册到自己上面来
#eureka.client.register-with-eureka设置为false表示当前服务不要注册到注册中心上
eureka.client.register-with-eureka=false
#表示是否从eureka server 上获取注册信息
eureka.client.fetch-registry=false
eureka集群搭建
使用了注册中心之后,所有的服务都需要通过服务注册中心来进行信息交换。服务注册中心的稳定性就非常重要了一旦服务注册中心掉线,会影响整个系统的稳定性。所有在实际开发当中,Eureka一般都是以集群的形式出现的。
Eureka集群,实际上就是启动多个Eureka实例,多个Eureka实例之间,相互注册,互相同步数据,共同组成一个Eureka集群
搭建Eureka集群,
1、首先需要一点准备工作,修改电脑的host文件:
文件路径:C:\Windows\System32\drivers\etc\hosts
添加以下内容
127.0.0.1 eurekaA eurekaB
2、在之前搭建好的Eureka server基础上 在添加两个配置文件分别为 application-a.properties和
application-b.properties
application-a.properties内容:
#给当前服务起一个名字
spring.application.name=eureka
#设置端口号
server.port=1111
#给服务起别名,注册到注册中心
eureka.instance.hostname=eurekaA
#默认情况下,Eureka server也是一个微服务,所以当他还是一个注册中心的时候,他会有两层身份:1、注册中心
#2、普通服务,即当前服务回把自己注册到自己上面来
#eureka.client.register-with-eureka设置为false表示当前服务不要注册到注册中心上
eureka.client.register-with-eureka=true
#表示是否从eureka server 上获取注册信息
eureka.client.fetch-registry=true
#A服务要注册到B服务上
eureka.client.service-url.defaultZone=http://eurekaB:1112/eureka
application-b.properties内容:
#给当前服务起一个名字
spring.application.name=eureka
#设置端口号
server.port=1112
#给服务起别名,注册到注册中心
eureka.instance.hostname=eurekaB
#默认情况下,Eureka server也是一个微服务,所以当他还是一个注册中心的时候,他会有两层身份:1、注册中心
#2、普通服务,即当前服务回把自己注册到自己上面来
#eureka.client.register-with-eureka设置为false表示当前服务不要注册到注册中心上
eureka.client.register-with-eureka=true
#表示是否从eureka server 上获取注册信息
eureka.client.fetch-registry=true
#B服务要注册到A服务上
eureka.client.service-url.defaultZone=http://eurekaA:1111/eureka
3、配置完成后,将项目打包(打成jar包)
打包完成后在命令行启动两个Eureka实例
两个实例的启动命令分别为:
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=a
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=b
启动成功后就可以看到两个服务之间相互注册,共同组成一个集群
eureka工作细节
eureka本身可以分为两个部分,Eureka Server和Eureka Client
Eureka Server
eureka Server主要对外提供三个功能:
1.服务注册,所有的服务都要注册到Eureka Server上面来
2.提供注册表,注册表就是所有注册上来的服务的一个列表,Eureka Client在调用服务时,需要获取这个注册表,一般来说这个注册表会缓存下来,如果缓存失效,则获取最新的注册表
3.同步状态,Eureka Client通过注册、心跳等机制,和Eureka Server同步当前客户端的状态
Eureka Client
Eureka CLient 主要是用来简化每一个服务和Eureka Server之间的交互。Eureka Client会自动拉取、更新及缓存Eureka Server中的信息,即使Eureka Server 所有节点都宕机,Eureka Client 依然能够获取到想要调用的服务地址(但是地址可能不准确)
服务注册
服务提供者将自己注册到服务注册中心(Eureka Server),需要注意,所谓的服务提供者,只是业务上的划分,本质上他就是一个Eureka Client。当Eureka Client向Eureka Server注册时,他需要提供自身的一些元素数据,例如ip地址、端口号、名称、运行状态等
服务续约
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.instance.lease-renewal-interval-in-seconds 表示服务的续约时间,默认30秒
-eureka.instance.lease-expiration-duration-in-seconds 表示服务失效时间,默认90秒
服务下线
当Eureka Client下线时,他会主动发送一条消息,告诉Eureka Server ,我下线了
获取注册表信息
Eureka Client 从Eureka Server 上获取服务的注册信息,并将其缓存在本地,本地客户端在调用远程服务时,会从该信息中查找远程服务所对应的Ip地址、端口号等信息。Eureka Client 上缓存的服务注册信息会定期更新(30秒),如果Eureka Server 返回的注册表信息与本地缓存的注册表信息不同的话,Eureka Client会自动处理。
这里也涉及到两个属性,一个是是否允许获取注册表信息:
#表示是否从eureka server 上获取注册信息
eureka.client.fetch-registry=true
Eureka Client 上缓存的服务注册信息,定期更新的时间间隔,默认30秒
eureka.client.registry-fetch-interval-seconds=30
Eureka 集群原理
官方的一张集群架构图
在这个集群架构中,Eureka Server 之间通过Replicate 进行数据同步,不同的Eureka Server之间不区分主从节点,所有节点之间都是平等的。节点之间通过置顶serviceUrl来互相注册,形成一个集群,进而提高节点可用性。
在Eureka Server集群中,如果有一个节点宕机,Eureka Client会自动切换到新的Eureka Server上。每一个Eureka Server 节点,都会互相同步数据。Eureka Server 的连接方式,可以是单线的,就是 A-->B-->C,此时A的数据也会和C之前互相同步。但是一般来说,不建议这种写法,在我们配置serviceUrl时,可以指定多个注册地址,即A可以即注册到B上,也可以同时注册到C上。
Eureka分区:
1.region:地理上的不同区域
2.zone:具体的机房