SpringCloud--02构建高可用的Eureka集群

1.Eureka的一些概念

       Renew(服务续约):Eureka Client 在默认情况下每个三十秒会发送一次心跳来进行服务的续约,通过服务的续约来告知Server客户端没有出现故障。如果server在90秒内没有收到Client的心跳,从注册列表中将其剔除。

      Fetch Registries--获取服务的注册列表信息:Client从Server获取服务的注册列表信息,并将其缓存到本地,然后他就会查找信息进行远程调用。该注册列表的信息每隔30秒更新一次,更新的信息和Client缓存的信息不同Client会自己处理这些信息。Server和Client之间采用JSON和XML的数据格式进行通信。

  2.Eureka高可用架构

        整个架构分为两个角色:Eureka Server 和Eureka Client,Eureka Client又分为Application Server和Application Client。

Client向Server注册信息,通过心跳机制来续约服务,如果不能持续续约,那么该客户大约90秒后从Server服务注册列表中剔除。服务的注册列表信息和服务的续约信心都会被复制到集群中的每个Service节点,来自任何区域的Client都可以获取整个系统的服务注册和列表信息。根据这些注册列表信息,Application Client可以远程调用Application Service来消费服务。

          

  Eureka Client一启动(不是启动完成),不是立即向Eureka Server注册,它有一个延迟向服务端注册的时间,通过跟踪源码,可以发现默认的延迟时间为40秒。原因是第一Eureka Server维护每30秒更新的响应缓存, 所以即使实例刚刚注册,它也不会出现在调用/ eureka / apps REST端点的结果中。第二Eureka客户端保留注册表信息的缓存。 该缓存每30秒更新一次(如前所述)。 因 此,客户端决定刷新其本地缓存并发现其他新注册的实例可能需要30秒。刚注册的Eureka Client也不能立即被其他服务调用,因为调用方因为各种缓存没有及时的获取到新的注册列表。

  3.Eureka的自我保护模式

      一个新的Eureka Server出现时,它尝试从相邻节点获取所有实例注册表信息。如果从Peer节点获取信息时出现问题,Eureka Serve会尝试其他的Peer节点。如果服务器能够成功获取所有实例,则根据该信息设置应该接收的更新阈值。如果有任何时间,Eureka Serve接收到的续约低于为该值配置的百分比(默认为15分钟内低于85%),则服务器开启自我保护模式,即不再剔除注册列表的信息。这样做的好处就是,如果是Eureka Server自身的网络问题,导致Eureka Client的续约不上,Eureka Client的注册列表信息不再被删除,也就是Eureka Client还可以被其他服务消费。

    通俗点的说法就是: 默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,这就可能变得非常危险了----因为微服务本身是健康的,此时本不应该注销这个微服务。

  Eureka Server通过“自我保护模式”来解决这个问题----当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。自我保护模式是一种对网络异常的安全保护措施。使用自我保护模式,而已让Eureka集群更加的健壮、稳定。

   在Spring Cloud中,可以使用eureka.server.enable-self-preservation=false来禁用自我保护模式。

 4.搭建高可用的Eureka Server集群

      继续采用上一节搭建的工程,在Eureka Server中采用多文件配置的方式,如下:

   

  application-peer1.yml和application-peer2.yml的配置:

spring:
  application:
    name: eurka-server1
  profiles:
    active: peer1
server:
  port: 8761

eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2:8762/eureka/
spring:
  application:
    name: eurka-server2
  profiles:
    active: peer2
server:
  port: 8762

eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/

 因为是在本地搭建所以需要修改hosts文件:路径:C:\Windows\System32\drivers\etc

127.0.0.1  peer1
127.0.0.1  peer2

  Eureka Client的配置:只将服务注册到了peer1。

server:
  port: 8763

spring:
  application:
    name: service-hi

eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/

 利用maven将工程打包,打包的时候突然就报错了:

原因在于在pom中配置<parent>时,需指定<relativePath>. 相对路径的默认值是../pom.xml.maven首先会在当前路径下寻找父项目pom.xml,其次会在relativePath下寻找,然后在本地仓库,最后在远程仓库中寻找。我在代码里面是写的<relativePath/>.所以报错就是上面的那样,把这句去掉就可以了。

relativePath的作用:查找顺序:relativePath元素中的地址–本地仓库–远程仓库  <relativePath/>设定一个空值将始终从仓库中获取,不从本地路径获取。

可以参考:史上最全的maven pom.xml文件教程详解

所以在本项目中去掉所有的relativePath标签,子模块也一样:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <!--<relativePath/>-->
    </parent>

重新打包:mvn xlean package

在项目的target目录下出现打好的jar包:

启动命令:

java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

启动客户端:

在客户端的配置文件中并没有制定向peer2节点注册,但是在两个Eureka Server中都显示其注册了。

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值