Eureka 面试题
Eureka 面试题
ps:自己一些整理和想法。
1、eureka是什么?
为了解决微服务集群中服务的注册发现问题。包含两大组件 eureka server 和 eureka client
eureka server功能:
(1)客户端注册
(2)心跳检测
(3)客户端下线
(4)集群
(5)提供获取注册列表
eureka client功能:
(6)向服务端注册
(7)请求注册列表信息
(8)远程访问
2、使用eureka怎么配置?
服务端
1、启动类
@EnableEurekaServer
2、pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3、application.yml
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #不向注册中心注册自己
#表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与 eureka server 交互的模块,查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
提供者|消费者
1、启动类
@EnableEurekaClient
2、pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3、application.yml
eureka:
client:
register-with-eureka: true #将自己注册到 EurekaServer
#是否从从 EurekaServer 抓取注册信息,默认为 true, 单节点无所谓,
#集群必须设置为 true 才能配合 ribbon 使用负载均衡
fetchRegistry: true
service-url:
#表示将自己注册到哪个 eurekaServer
defaultZone: http://localhost:9001/eureka
2、Eureka为什么要采用自我保护机制
禁用保护模式:如果Eureka在server端在一定时间内(默认90秒)没有收到EurekaClient发送心跳包,
便会直接从服务注册列表中剔除该服务
开启保护模式:在短时间(90秒中)内丢失了大量的服务实例心跳,这时候EurekaServer会开启自我保护机制,不会剔除该服务(该现象可能出现在如果网络不通或者阻塞) 因为客户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的。
在默认情况下, Eureka 启动了自我保护模式
在分布式系统的CAP理论中,Eureka采用的AP,也就是Eureak保证了服务的可用性(A),而舍弃了数据的一致性(C)。当网络发生分区时,客户端和服务端的通讯将会终止,那么服务端在一定的时间内将收不到大部分的客户端的一个心跳,如果这个时候将这些收不到心跳的服务剔除,那可能会将可用的客户端剔除了,这就不符合AP理论。自我保护是 属于 CAP 里面的 AP 分支, 保证高可用和分区容错性。 自我保护模式是—种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务 。 使 用 自 我 保 护 模 式 , 可 以 让 Eureka 集 群 更 加 的 健 壮 、 稳 定 。
配置:
#服务端application.yml配置
server:
#禁用自我保护模式
enable-self-preservation: false
#超时时两秒超时
eviction-interval-timer-in-ms: 2000
#客户端application.yml配置
instance:
#每隔1秒发送心跳(默认30)
lease-renewal-interval-in-seconds: 1
# 最后一次心跳后最长等待时间(默认90),等待超时剔除服务
lease-expiration-duration-in-seconds: 2
3、如何搭建高可用的eureka集群
在每一个eureka服务配置文件中配置其他服务的地址

4、eureka client如何获取注册列表信息
1、启动类上
@EnableDiscoveryClient
public class SpringbootApplication
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/member/consumer/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
for (String service:services) {
log.info("服务名={}",service);
List<ServiceInstance> instances = discoveryClient.getInstances(service);
for (ServiceInstance instance:instances) {
log.info("id={},host={},port={},uri={}",instance.getInstanceId(),instance.getHost(),instance.getPort(),instance.getUri());
}
}
return discoveryClient;
}
5、Eureka Client 的工作流程
Server同时是client 注册表Map<name,Map<id,InstanceInfo>>
Clinet
1、启动
(1)读取与EurekaServer交互的配置新信息分装成读取与EurekaClintConfig
(2)读取自身配置信息分装成EurekaInstanceConfig
(3)从eureka服务端拉取注册信息,缓存到本地
(4)把自己服务注册
(5)初始化3个定时器
①发送心跳
②缓存刷新
③按需注册
2、执行
(1)定时发送像心跳到服务端,维持在注册表中的服务租约
(2)定时从服务拉取注册表信息,更新本地缓存
(3)监控自身变化,如果变了重新发起注册
3、销毁
一般情况下,应用服务在关闭的时候,EurekaClient会主动向EurekaServer注销自身在注册表中的信息
Clinet中与server的配合工作
Eureka REST operations · Netflix/eureka Wiki (github.com)

浙公网安备 33010602011771号