zoukankan      html  css  js  c++  java
  • Spring-Cloud组件eureka

    eureka是什么?

         eureka是Netflix的子模块之一,也是一个核心的模块,eureka里有2个组件,一个是EurekaServer(一个独立的项目) 这个是用于定位服务以实现中间层服务器的负载平衡和故障转移,另一个便是EurekaClient(我们的微服务) 它是用于与Server交互的,可以使得交互变得非常简单:只需要通过服务标识符即可拿到服务。

    eureka与Spring-Cloud有什么关系?

        Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(可以对比Zookeeper)。

    Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。

    而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

    角色关系图:

     在springcloud 项目中添加依赖:

    eureka客户端:
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
      eureka服务端:
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
     eureka服务端项目里面加入以下配置:
    server:
      port: 3000
    eureka:
      server:
        enable-self-preservation: false  #关闭自我保护机制
        eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
      instance:
        hostname: localhost
    
    
      client:
        registerWithEureka: false #不把自己作为一个客户端注册到自己身上
        fetchRegistry: false  #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
     当然,不是全部必要的,这里只是把我这里的配置copy过来了
     然后在spring-boot启动项目上 加入注解:@EnableEurekaServer 就可以启动项目了
    /**
     * 想要咨询vip课程相关的同学加一下木兰老师QQ:2746251334
     * 想要往期视频的同学加一下安其拉老师QQ:3164703201
     * author:鲁班学院-商鞅老师
     */
    @EnableEurekaServer
    @SpringBootApplication
    public class AppEureka {
    
        public static void main(String[] args) {
            SpringApplication.run(AppEureka.class);
    
        }
    }

    成功后会看到:

    这个警告只是说你把他的自我保护机制关闭了
    eureka客户端配置:
    server:
      port: 6000
    eureka:
      client:
        serviceUrl:
            defaultZone: http://localhost:3000/eureka/  #eureka服务端提供的注册地址 参考服务端配置的这个路径
      instance:
          
        instance-id: power-1 #此实例注册到eureka服务端的唯一的实例ID 
        prefer-ip-address: true #是否显示IP地址
        leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
        leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
    
    spring:
      application:
        name: server-power #此实例注册到eureka服务端的name 
    然后在客户端的spring-boot启动项目上 加入注解:@EnableEurekaClient 就可以启动项目了

    eureka集群:

    原理:

    服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

    eureka对比Zookeeper:

        Zookeeper在设计的时候遵循的是CP原则,即一致性,Zookeeper会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时剩余节点会重新进行leader选举,问题在于,选举leader的时间太长:30~120s,且选举期间整个Zookeeper集群是不可用的,这就导致在选举期间注册服务处于瘫痪状态,在云部署的环境下,因网络环境使Zookeeper集群失去master节点是较大概率发生的事情,虽然服务能够最终恢复,但是漫长的选举时间导致长期的服务注册不可用是不能容忍的。

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

    1: Eureka 不再从注册列表中移除因为长时间没有收到心跳而过期的服务。

    2:Eureka 仍然能够接收新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点可用)

    3: 当网络稳定后,当前实例新的注册信息会被同步到其它节点中

     

  • 相关阅读:
    sftp上传到远程服务器
    mysql 的 find_in_set函数使用方法
    wamp2.5 局域网无法访问问题
    JS图片上传预览
    select2的相关问题
    linux 更新源miss问题
    freeMarker遍历map的正确方式
    Input类型是checkbox时checked属性获取
    Java 内存区域划分 备忘录
    简单聊聊java中如何判定一个对象可回收
  • 原文地址:https://www.cnblogs.com/wnlsq/p/12229799.html
Copyright © 2011-2022 走看看