2.Eureka

发布时间 2023-05-24 20:20:35作者: 22-10-21

3.Eureka

3.1.简介

EurekaNetflix在线影片公司开源的一个服务注册与发现的组件,和其他Netflix公司的服务组件(例如负载均衡、 熔断器、网关等) 一起,被Spring Cloud社区整合为SpringCloudNetflix模块。

3.2.Eureka与Zookeeper

3.2.1.CAP原则

CAP原则又叫CAP定理,指的是在一个分布式系统中,

一致性(Consistency)

可用性(Availability)

分区容错性(Partition tolerance)(这个特性是不可避免的)

CAP原则:这三个要素最多只能同时实现两点,不能三者兼顾。

3.2.2.分布式特征

image-20230524100902629

数据的一致性:(A,B,C 里面的数据是一致的)

  • Zookeeper注重数据的一致性。
  • Eureka不是很注重数据的一致性!

服务的可用性:(若 Zookeeper集群里面的master挂了怎么办)

  • Paxos(多数派) 在Zookeeper里面,若主机挂了,则Zookeeper集群整体不对外提供服务了,需要选一个新的出来(120s左右)才能继续对外提供服务!
  • Eureka注重服务的可用性,当Eureka集群只有一台活着,它就能对外提供服务

分区的容错性:(在集群里面的机器,因为网络原因,机房的原因,可能导致数据不会里面 同步),它在分布式必须需要实现的特性!

Zookeeper注重数据的一致性,CP(注册中心,配置文件中心,协调中心)

Eureka注重服务的可用性,AP(注册中心)

3.3.快速入门

image-20230524102034640

3.3.1.搭建Eureka-server

①创建项目

image-20230524102405551

②选择依赖

image-20230524102318548

③pom.xml

image-20230524105738887

④修改配置文件

image-20230524105804725

⑤修改启动类

image-20230524105915081

⑥访问测试

http://localhost:8761/

image-20230524114403215

Eureka-Server不仅提供让别人注册的功能,它也能注册到别人里面,自己注册自己 所以,在启动项目时,默认会注册自己,也可以关掉这个功能。

3.3.2.搭建Eureka-client

①创建项目

image-20230524111431442

②选择依赖

image-20230524111633135

③pom.xml

image-20230524112320807

④修改配置文件

image-20230524113857025

⑤修改启动类

image-20230524112248546

⑥访问测试

http://localhost:8761/

image-20230524113932894

还可以继续创建多个client,只需要修改端口和服务名即可。

3.3.3.注册中心的状态认识

UP:服务是上线的,括号里面是具体服务实例的个数,提供服务的最小单元

DOWN:服务是下线的

UN_KONW:服务的状态未知

3.3.4.常用配置设置

image-20230524124247547

image-20230524124231328

①server中的配置

server:
  port: 8761  # eureka默认端口
spring:
  application:
    name: eureka-server  # 服务名称
eureka:
  server: #server既是服务端又是客户端
    eviction-interval-timer-in-ms: 10000  #服务端间隔多少毫秒进行定期删除
    renewal-percent-threshold: 0.85 #超过百分之多少的客户端和当前服务端没有进行续约时,eureka会进行保护服务,不会进行删除
  instance:
    hostname: localhost #主机名称/服务的ip
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #主机名称:服务名称:端口号  localhost:eureka-server:8761
    prefer-ip-address: true  #以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 5 #服务实例的续约时间间隔,单位是秒
    lease-expiration-duration-in-seconds: 20 #表示 eureka server 至上一次收到 client 的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该实例

②client中的配置

server:
  port: 8001 # 客户端的端口可以随便给,只要不冲突即可
spring:
  application:
    name: eureka-client-a # 访问名称
# 将客户端注册到服务端
eureka:
  client:
    eureka-server:
      defaultZone: http://localhost:8761/eureka/ # 注册地址
    register-with-eureka: true #是否注册自己
    fetch-registry: true #是否拉取服务列表
    registry-fetch-interval-seconds: 5 # 表示eureka-client间隔多久去拉取服务注册信息
  instance:
    hostname: localhost # 服务主机名称
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} # 实例id
    prefer-ip-address: true # 服务列表以ip的形式显示
    lease-renewal-interval-in-seconds: 10 # 表示eureka-client发送心跳给server端的频率
    lease-expiration-duration-in-seconds: 20 #表示eureka-server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该实例

3.4.构建集群

image-20230524131859338

3.4.1.server-1

server:
	port: 8761 #端口号
spring:
	application:
		name: eureka-server #服务名称
eureka:
    client:
    	fetch-registry: true #是否拉取服务列表
    	register-with-eureka: true #是否注册自己(集群需要注册自己和拉取服务)
    	service-url:
    		defaultZone: http://localhost2:8762/eureka/,http://localhost3:8763/eureka/
    instance:
    	lease-expiration-duration-in-seconds: 90  #server在等待下一个客户端发送的心跳时间,若在指定时间不能收到客户端心跳,则剔除此实例并且禁止流量

3.4.2.server-2

server:
	port: 8762 #端口号
spring:
	application:
		name: eureka-server #服务名称,server1,2,3都要相同
eureka:
    client:
    	fetch-registry: true #是否拉取服务列表
    	register-with-eureka: true #是否注册自己(集群需要注册自己和拉取服务)
    	service-url:
    		defaultZone: http://localhost1:8761/eureka/,http://localhost3:8763/eureka/
    instance:
    	lease-expiration-duration-in-seconds: 90  #server在等待下一个客户端发送的心跳时间,若在指定时间不能收到客户端心跳,则剔除此实例并且禁止流量

3.4.3.server-3

server:
	port: 8763 #端口号
spring:
	application:
		name: eureka-server #服务名称,server1,2,3都要相同
eureka:
    client:
    	fetch-registry: true #是否拉取服务列表
    	register-with-eureka: true #是否注册自己(集群需要注册自己和拉取服务)
    	service-url:
    		defaultZone: http://localhost1:8761/eureka/,http://localhost2:8762/eureka/
    instance:
    	lease-expiration-duration-in-seconds: 90  #server在等待下一个客户端发送的心跳时间,若在指定时间不能收到客户端心跳,则剔除此实例并且禁止流量

3.4.4.client

server:
  port: 8001 #端口号
spring:
  application:
    name: eureka-client-a # 访问名称
# 将客户端注册到服务端
eureka:
  client:
    eureka-server:
      defaultZone: http://localhost:8761/eureka/ # 注册地址
    register-with-eureka: true #是否注册自己
    fetch-registry: true #是否拉取服务列表
  instance:
    instance-id: ${spring.application.name}:${server.port} # 实例id
    lease-renewal-interval-in-seconds: 10 # 表示eureka-client发送心跳给server端的频率

3.4.5.访问测试

当无论访问的是8061/8062/8063哪个服务端时都能看到8001这个端口的客户端即为创建集群成功。

3.4.6.server宕机

EurekaServer的集群里面,没有主机和从机的概念,节点都是对等的,只有集群里面有一 个集群存活,就能保证服务的可用性。 (主机 (写) 从 (读)) 只要有一台存活,服务就能注册和调用

http://thesecretlivesofdata.com/raft/

这个网址生动的表达了一些问题是如何解决的,比如主机和从机之间的数据如何传输,主机是怎么选的,日志复制等。。

分布式数据一致性协议

zkPaxos

eureka没有分布式数据一致性的机制节点都是相同的

nacosraft

在有主从模式的集群中 一般都要遵循这样的协议才可以稳定对外提供服务

Zookeeper -> Paxos

acos -> raft

3.5.概念理解

3.5.1.服务的注册

当项目启动时(eureka的客户端),就会向eureka-server发送自己的元数据(原始数据)(运行的ip,端口port,健康的状态监控等,因为使用的是http/ResuFul请求风格),eureka-server会在自己内部保留这些元数据(内存中)。(有一个服务列表,restful风格,以http动词的请求方式,完成对url资源的操作)

3.5.2.服务的续约

项目启动成功了,除了向eureka-server注册自己成功,还会定时的向eureka-server汇 报自己,心跳,表示自己还活着。(修改一个时间)

3.5.3.服务的主动下线

当项目关闭时,会给eureka-server报告,说明自己要下机

3.5.4.服务的被动下线

当项目超过了指定时间没有向eureka-server汇报自己,那么eureka-server就会认为此 节点死掉了,会把它剔除掉,也不会放流量和请求到此节点了。