【SpringCloud】Eureka服务注册与发现

1. Eureka是什么

  Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于Rest的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对微服务架构来说非常重要,有了服务发现与注册,只需使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。类似于Dubbo的注册中心zookeeper


2. 原理

  Eureka采用了C-S的设计架构,有两个组件:Eureka Server 和 Eureka Client
  Eureka Server:提供服务注册服务,即作为服务注册功能的服务器,是服务注册中心,而系统中其他微服务,使用Eureka的客户端 Eureka Client连接到Eureka Server并维持心跳连接,这样系统的维护人员就可通过Eureka Server来监控系统中各个微服务是否正常运行。Spring Cloud的其它模块(如ZUUL)就可通过Eureka Server来发现系统中的其它服务,并进行相关的逻辑
  Eureka Client:是一个java客户端,用于简化Eureka server的交互,相当于我们在的本地提供服务的程序,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器,在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒),如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)


3.自我保护机制

  默认情况下,如果EurekaServer在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例。但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险,因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题:当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式,一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(即不再注销任何微服务)。当网络故障恢复后(即受到的心跳数重新恢复到阈值以上),该EurekaServer节点会自动退出自我保护模式。它的设计哲学为:宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。好死不如赖活着。


4. 项目实战

4.1 Eureka server

  1. 添加Eureka依赖

     <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-eureka-server</artifactId>
     </dependency>
    
  2. 主启动类上面,添加Eureka有关注解

    @SpringBootApplication
    @EnableEurekaServer // EurekaServer服务器端启动类,接受其它微服务注册进来
    public class EurekaServer7001_App
    {
    	public static void main(String[] args)
    	{
    		SpringApplication.run(EurekaServer7001_App.class, args);
    	}
    }
    
  3. 配置文件

    server: 
      port: 7001  // eureka server 端口号
     
    eureka: 
      instance:
        hostname: eureka7001.com  #eureka服务端的实例名称
      client: 
        register-with-eureka: false     #false表示不向注册中心注册自己。
        fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url: 
          #单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/       #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
          defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/  // 集群
    

  到此eureka server就搭建成功了,其它服务就可以注册了(是不是很简单)

4.2 Eureka Client

  1. 添加依赖

      <dependency>
    	  <groupId>org.springframework.cloud</groupId>
    	   <artifactId>spring-cloud-starter-eureka</artifactId>
      </dependency>
      <dependency>
    	   	<groupId>org.springframework.cloud</groupId>
    	   	<artifactId>spring-cloud-starter-config</artifactId>
       </dependency>
    
  2. 配置启动项,在主启动上添加@EnableEurekaClient就注册到Eureka上了

    @SpringBootApplication
    @EnableEurekaClient //本服务启动后会自动注册进eureka服务中
    @EnableDiscoveryClient //服务发现
    public class DeptProvider8001_App
    {
    	public static void main(String[] args)
    	{
    		SpringApplication.run(DeptProvider8001_App.class, args);
    	}
    }
    
  3. 配置文件

    eureka:
      client: #客户端注册进eureka服务列表内
        service-url: 
          #defaultZone: http://localhost:7001/eureka
           defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/      
      instance:
        instance-id: microservicecloud-dept8001
        prefer-ip-address: true     #访问路径可以显示IP地址     
    

 到此此服务就暴露出来注册到Eureka上了

5. Eureka 与 zookeeper 的区别

将区别前先将两个概念:

传统的ACID分别是:

  1. A (Atomicity)原子性
  2. C (Consistency)一致性
  3. I (Isolation)独立性
  4. D (Durability)持久性

CAP指:

  1. C (Consistency)强一致性
  2. A (Availability)可用性
  3. P (Partition tolerance)分区容错性
    CAP只能保证两点,无法同时满足

5.1 Zookeeper保证的是CP

  当向注册中心查询服务列表时,可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。即服务注册功能对可用性的要求要高于一致性,但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举,但是leader选举时间太长,30~120s,且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪,在云部署的环境下,因网络问题导致zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是选举时间导致的注册长期不可用是不能容忍的

5.2 Eureka 保证的是AP

  优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以可以提供注册和查询服务。而Eureka客户端在向Eureka注册是发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查询到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:

  1. Eureka不再从注册列表中移除因长时间没收到心跳而应该过期的服务
  2. Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上(即保证当前节点依然可用)
  3. 当网络稳定时,当前实例新的注册信息会被同步到其它节点中

因此,Eureka可以很好的应对网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪

猜你喜欢

转载自blog.csdn.net/wrs120/article/details/91470223