深入微服务-服务注册与发现 SpringCloud Eureka之高可用以及核心原理

4 篇文章 0 订阅
4 篇文章 0 订阅

系列文章目录



前言

本系列带着大家深入微服务 Spring体系的各个框架的基本使用以及底层原理。上一篇文章介绍了SpringCloud Eureka基本使用以及搭建,本节将带着大家掌握微服务服务注册与发现框架 Spring Eureka 的高可用以及核心原理


Eureka 之高可用概念

  • 在微服务环境,一旦注册中心发生故障或短时间通信断开,可能导致整个微服务无法访问,所以注册中心需要实现高可用

Eureka、Zookeeper作为注册中心的区别

首先了解下CAP理论

C - consistency 强一致性
A - availability 可用性
P - partition tolerance 分区容错性

CAP理论:一个分布式系统,不可能同时做到这三点(强一致性、可用性、分区容错性)
CAP理论

CP - 满足一致性,分区容错性,强一致性
AP - 满足可用性,分区容错性,最终一致性

  • Eureka 保证最终一致性(AP),Eureka 服务节点都是平等的,某个服务节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务
  • 当Eureka 客户端注册服务失败会自动切换其他服务节点,保证可用性,Eureka不能保证强一致性(即查询到的信息可能不是最新的服务信息),只能保证最终一致性
  • Zookeeper保证强一致性(CP),当Zookeeper的主节点leader发生宕机,进行leader选举的时候会进行投票选举(Zab算法),选举期间会发生服务(注册中心)不可用的情况,直到选举成功之后才能保证正常使用,因此Zookeepr能保证强一致性(各个节点的数据是最新的)。

Eureka 高可用环境搭建

eureka Server 相互注册,服务名称一致
1)eureka Server1

server:
  port: 8007 # server 端口号
spring: 
  application: 
    name: eureka-server
eureka:
  instance:
    hostname: 127.0.0.1 # eureka 注册的主机地址
  client:
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:8008/eureka/
    register-with-eureka: true # 指定是否从注册中心获取服务
    fetch-registry: true # 指定是否注册到注册中心

2)eureka Server2

server:
  port: 8008 # server 端口号
spring: 
  application: 
    name: eureka-server
eureka:
  instance:
    hostname: 127.0.0.1 # eureka 注册的主机地址
  client:
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:8007/eureka/
    register-with-eureka: true # 指定是否从注册中心获取服务
    fetch-registry: true # 指定是否注册到注册中心

客户端集成Eureka集群

server:
  port: 8001
spring:
    application:
        name: provider-server
eureka:
  client:
    service-url:
        defaultZone: http://localhost:8007/eureka,http://localhost:8008/eureka ##填写注册中心地址
    register-with-eureka: true # 指定是否从注册中心获取服务
    fetch-registry: true  #指定是否注册到注册中心

Eureka 集群启动成功可看到web界面显示的信息
Eureka

Eureka核心原理

客户端获取服务

客户端启动服务的时候,会发送一个rest请求到注册中心获取服务信息,缓存到客户端本地,每隔30s会重新获取,可通过eureka.client.registry进行调优

客户端服务下线

当客户端正常下线的时候会发送一个rest请求到注册中心,注册中心会把服务的状态改为DOWN,也会推送服务下线的UDP事件到各个服务

服务端失效剔除

微服务环境中某个Eureka下线因网络故障等原因短时间内不可用,又没有收到服务下线通知时,Eureka 服务端 注册中心启动的时候会初始化一个定时任务,每隔60s剔除续约超时

服务端自我保护/心跳续约

Eureka 客户端定时向Eureka Server服务端发送心跳(renew),当服务端长时间(60s)没有收到心跳续约时间会进行失效剔除
Eureka 核心

核心配置

服务端核心配置

server:
  port: 8007
##定义服务名称
spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: 127.0.0.1 #注册中心ip地址
  client:
    serviceUrl:
    ##注册地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    register-with-eureka: false # 指定是否从注册中心获取服务
    fetch-registry: false # 指定是否注册到注册中心
  server:
    # 是否开启自我保护机制
    enable-self-preservation: false  
    # 剔除失效服务间隔
    eviction-interval-timer-in-ms: 2000 

客户端核心配置

server:
  port: 8001
spring:
  application:
    name: provider-server
eureka:
  client:
    service-url:
       defaultZone: http://localhost:8007/eureka
    register-with-eureka: true # 指定是否从注册中心获取服务
    fetch-registry: true # 指定是否注册到注册中心
    #eureka服务器获取注册表信息的频率
    registry-fetch-interval-seconds: 30 
  # 心跳检测检测与续约时间
  instance:
    # Eureka客户端向服务端发送心跳的时间间隔,单位为秒,默认为30s
    lease-renewal-interval-in-seconds: 30 
    #Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,默认为90s,超过则剔除
    lease-expiration-duration-in-seconds: 90  
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

janyxe

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

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

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

打赏作者

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

抵扣说明:

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

余额充值