SpringCloud:搭建⾼可⽤Eureka注册中⼼,kettle⾯试题
spring:
application:
name: springcloud-eureka-server
server:
port: 8702
#设置该服务中⼼的hostname,指定ip,该实例名称不能重复
eureka:
instance:
hostname: eureka8702
client:
register-with-eureka: true
fetch-registry: true
service-url:
2、复制SpringcloudEurekaServerApplication启动类命名为
SpringcloudEureka8701ServerApplication,SpringcloudEureka8702ServerApplication,⿏标放在启动类上右键选择如图springcloud难学吗
然在启动类SpringcloudEureka8701ServerApplication添加-Dspring.profiles.active=eureka8701
同理8702启动类操作也是⼀样,此处省略。
3、为了让eureka8701和eureka8702能够被正确相互访问到,同步数据,如果不能相互访问,Eureka服务中的数据不能同步共享,我们需要在C:\Windows\System32\drivers\etc⽬录下的hosts⽂件中添加两⾏配置,如下:
127.0.0.1 eureka8701
127.0.0.1 eureka8702
4、启动两个SpringcloudEureka8701ServerApplication,SpringcloudEureka8702ServerApplication服务我们可以看到注册成功了。
Eureka8702也是如此,到此Eureka服务集搭建完毕
三、Eureka详解
==========
1、服务消费者模式
1-1、获取服务
消费者启动的时候,使⽤服务别名,会发送⼀个rest请求到服务注册中⼼获取对应的服务信息,然后会缓存到本地jvm客户端中,同时客户端每隔30秒从服务器上更新⼀次。
可以通过istry-fetch-interval-seconds=30参数进⾏修改,该配置默认值为30, 单位为秒。
1-2、服务下线
在系统运⾏过程中必然会⾯临关闭或重启服务的某个实例的情况,在服务关闭期间我们⾃然不希望客户端会继续调⽤关闭了的实例。所以在客户端程序中,当服务实例正常的关闭操作时,它会触发⼀个服务下线的REST请求给Eureka Server, 告诉服务中⼼:“我要下线了”。服务端在接收到请求之后,将该服务状态置为下线(DOWN),并将该下线事件传播出去。
2、服务注册模式
2-1、失效剔除
有些时候,我们的服务实例并不⼀定会正常下线,可能由于内存溢出、⽹络故障原因使得服务不能正常⼯作,⽽服务注册中⼼并未收到“服务下线”的请求。为了从服务表中将这些⽆法提供服务的实例剔除,Eureka Server 在启动的时候会创建⼀个定时任务默认每隔⼀段时间(默认为60秒eureka.server.eviction-interval-timer-in-ms=6000L)将当前清单中超时(默认为90秒eureka.instance.lease-expiration-duration-in-seconds= 90)没有续约的服务踢除出去
2-2、Eureka服务注册中⼼⾃我保护机制
当我们在本地调试基于Eureka的程序时,基本上都会碰到这样⼀个问题, 在服务主中⼼的信息⾯板中
出现类似下⾯的红⾊警告信息,在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server⼀起重启(因为在开发过程中不会修改eureka注册中⼼),当⼀分钟内收到的⼼跳数⼤量减少时,会触发该保护机制。可以在eureka管理界⾯看到Renews threshold和Renews(last min),当后者(最后⼀分钟收到的⼼跳数)⼩于前者(⼼跳阈值)的时候,触发保护机制,会出现红⾊的警告:
实际上,该警告就是触发了Eureka Server的⾃我保护机制,服务注册到Eureka Server之后,会维护个⼼跳连接, 告诉Eureka Server⾃⼰还活着。Eureka Server在运⾏期间,会统计客户端节点的⼼跳失败的⽐例在15分钟之内是否低于85%如果出现低于的情况,如果低于85%,那就触发⾃我保护机制,单机调试的时候很容易满⾜,实际在⽣产环境上通常是由于⽹络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,让这些实例不会过期,尽可能保护这些注册信息。但是,在这段保护期间内实例若出现问题,那么客户端很容易拿到实际已经不存服务实例,会出现调⽤失败的情况,所以客户端必须要有容错机制,⽐如可以使⽤请使⽤重试、断路器等机制。
在没有Eureka⾃我保护的情况下,如果 Eureka Server在⼀定时间内没有接收到某个微服务实例的⼼跳, Eureka Server将会注销该实例,但是当发⽣⽹络分区故障时,那么微
【⼀线⼤⼚Java⾯试题解析+后端开发学习笔记+最新架构讲解视频+实战项⽬源码讲义】
浏览器打开:qq.hn/FTf 免费领取
服务与 Eureka Server之间将⽆法正常通信,以上⾏为可能变⾮常危险了,因为微服务本⾝其实是正常的,此时不应该注销这个微服务,如果没有⾃我保护机制,那么Eureka Server就会将此服务注销掉。
Eureka通过“⾃我保护模式”来解决这个问题——当 Eureka Server节点在短时间内丢失过多客户端时(可能发⽣了⽹络分区故障),那么就会把这个微服务节点进⾏保护。⼀旦进⼊⾃我保护模式, Eureka server就会保护服务注册表中的信息,不删除服务注册表中的数据(也就是不会注销任何微服务)。当⽹络故障恢复后,该 Eureka Server节点会再⾃动退出⾃我保护模式。所以,⾃我保护模式是⼀种应对⽹络异常的安全保护措施,它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲⽬注销任何健康的微服务,使⽤⾃我保护模式,可以让Eureka集更加的健壮、稳定当然也可以使⽤配置项: able-self-preservation=fase禁⽤⾃我保护模式。
但是Eureka Server⾃我保护模式也会给我们带来⼀些困扰,如果在保护期内某个服务提供者刚好⾮正常下线了,此时服务消费者就会拿到⼀个⽆效的服务实例,此时会调⽤失败,对于这个问题需要服务消费者端具有⼀些容错机制,如重试,断路器等。
Eureka的⾃我保护模式是有意义的,该模式被激活后,它不会从注册列表中剔除因长时间没收到⼼跳导致注册过期的服务,⽽是等待修复,直到⼼跳恢复正常之后,它⾃动退出⾃我保护模式。这种模式旨
在避免因⽹络分区故障导致服务不可⽤的问题。
例如,两个微服务客户端实例A和B之间有调⽤的关系,A是消费者,B是提供者,但是由于⽹络故障,B未能及时向Eureka发送⼼跳续约,这时候Eureka不能简单的将B从注册表中剔除,因为如果剔除了,A就⽆法从Eureka服务器中获取B注册的服务,但是这时候B服务是可⽤的;所以, Eureka的⾃我保护模式最好还是开启它。
2-3、关闭⾃我保护的相关配置如下
服务端配置

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。