springcloud-五大神兽之eureka

 配置和说明相关

 关于红色提示字体

  •  在配置上,自我保护机制关闭了,但是一分钟内的续约数没有达到85% , 可能发生了网络分区,会有如下提示(心跳超时会被踢出)

    THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
  • 开启了知我保护机制,官网建议开启(客户端心跳传输时,有网络抖动的情况)即一个服务长时间没有发送心跳, eureka也不会将其删除

    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE

配置:

  服务端

eureka.instance.hostname=localhost
#是否注册到eureka
eureka.client.registerWithEureka=false
#是否从eureka中拉取注册信息
eureka.client.fetchRegistry=false
##暴露eureka服务的地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

#自我保护模式,当出现出现网络分区、eureka在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳,
# eureka也不会将其删除,默认为true
eureka.server.enable-self-preservation=false

#Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来
eureka.server.renewal-percent-threshold=0.85

#eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒
eureka.server.eviction-interval-timer-in-ms=60000

#安全登陆配置
security.basic.enabled=true
spring.security.user.name=admin
spring.security.user.password=admin

  客户端

是否讲ip注册到倒eureka
eureka.instance.prefer-ip-address=true
#服务续约,心跳的时间间隔
eureka.instance.lease-renewal-interval-in-seconds=30
#如果从前一次发送心跳时间起,90秒没接受到新的心跳,讲剔除服务
eureka.instance.lease-expiration-duration-in-seconds=90
#表示eureka client间隔多久去拉取服务注册信息,默认为30秒
eureka.client.registry-fetch-interval-seconds=30
#是否注册到eureka
eureka.client.registerWithEureka=true
#是否从eureka中拉取注册信息
eureka.client.fetchRegistry=true
#健康检测
eureka.client.healthcheck.enabled=true
eureka.client.serviceUrl.defaultZone=http://admin:admin@localhost:8763/eureka/

  

 

源码赏析 

下面的代码最好对spring和springboot 源码有一定的了解,服务端是以定时器来驱动的,和zookeeper不同不是靠事件来驱动

客户端

 SPI 加载 spring.factories

 

 

 

实例化

 

 

 

客户端配置

 

 

 

 

DiscoveryClient

 

 

 

 

 

 

 

 

 

 

 定时器

 

 

 核心方法

 

心跳定时任务

 

 

 

 

默认客户端注册到服务端

心跳定时器

 

心跳会调用注册

 

 

 

 

详细调用:

 

 

 

 

 

注册

 

 

 

 

注册的实例对象:InstanceInfo

 

 

成功后还回的是204状态 

 

 

 

 客户端下线

 

 

 

客户端拉取服务

 

 

 

 

 

 

 

 

重要方法:

refreshRegistry

 

 

 

 

 

 

 

 

 

客户端从eureka拿到的服务

 

 

 

 

 

 

 客户端的核心类:DiscoveryClient  要方法initScheduledTasks()


 

 服务端

用到的技术

JAX-RS 是 JAVA EE6 引入的一个新技术。 JAX-RS 即 Java API for RESTful WebServices, 是一个 Java 编程语言的应用程序接口, 支持按照表述性状态转移( REST) 架构风格创建 Web 服务。 JAX-RS 使用了 Java SE5 引入的 Java 注解来简化 Web 服务的客户端和服务端的开发和部署。

其实就是类似于 Servlet 规范来接收用户请求的一个规范。

1、 jar 包导入

服务端

 

 

 

 

 

 

 

 

 

 

重要的类说明:

 

 

 

 

 

 

 

 

 

 

 

最后代码位置走到

 

 

 

 服务列表保存本地;服务复制

 

 

 注册和同步

同步不能保证一致性

服务端心跳和注册都会同步到其它的服务端

 

 

 

服务注册中心保存了key为服务名称value为具体服务的concurrentMap

 

 

服务端心跳接口

 

 

 

心跳

AbstractInstanceRegistry

服务端清除服务——默认60秒

 

 

 

 

 

 

 

last min期望值和threshold阈值  默认0.85 ----开启自我保护的地方

 

 

 

 

 

 

总结:

客户端:

1.注册服务信息;

2.拉取服务端的定时任务;

3.上传心跳的定时任务;

 服务端:

1.定时器清理无用的服务;

2.开启自我保护机制;

3.服务端上传的心跳

4.节点复制;

 服务端定时器:节点下线、清理定时器、阈值定时器

核心代码入口类:

AbstractInstanceRegistry
ApplicationResource
ApplicationsResource

 

posted @ 2021-12-02 16:59  cqzaier  阅读(242)  评论(0)    收藏  举报