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服务配置文件中配置其他服务的地址
如何搭建高可用的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)

posted @ 2023-04-18 17:06  必行之码  阅读(1076)  评论(0)    收藏  举报