springCloud系列-Eureka

Posted by     "麦子" on Wednesday, 2019年04月17日

[TOC]

说明: 本学习主要对尚硅谷周阳大神《SpringCloud视频》记录,一下文字来源这个视频PPT

说明: 版本springboot2.14 <spring-cloud.version>Greenwich.SR1</spring-cloud.version>

Eureka是什么

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

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

18-1

Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到。

Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务。

Eureka包含两个组件:Eureka Server和Eureka Client

Eureka Server提供服务注册服务

各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到

EurekaClient是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

搭建Eureka Server集群

通过IDEA直接创建eureka server,需要注意其中他的相关包无法下载的时候,先maven clear,然后删除maven库里面的已经没下载好的包, 然后点击maven projects, 执行reimport,从新建立jar包依赖。

启动类添加:@EnableEurekaServer 注解

application.yml配置如下:

server:
  port: 5001
eureka:
  instance:
    hostname: eureka5001.com #eureka服务端的实例名称, 我这边做了host映射
  client:  #声明自己是服务端
    register-with-eureka: false  #false表示不向注册中心注册自己。
    fetch-registry: false
    service-url:
     defaultZone: http://eureka5002.com:5002/eureka/,http://eureka5003.com:5003/eureka/
#其他两个服务,把对应的地址和端口修改就OK了。    

集群效果如下:

18-2

搭建Eureka Client客户端

注册相关微服务到cureka server端,

启动类添加:@EnableEurekaClient 注解

pom.xml配置如下

 <!--
     添加客户端eureka-client包:
     
     因为我的cloud版本是 <spring-cloud.version>Greenwich.SR1</spring-cloud.version>,所以
     我的eureka-client版本是<version>2.1.1.RELEASE</version>
  -->
<dependencies>
     <dependency>
			  <groupId>org.springframework.cloud</groupId>
			  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
</dependencies>

application.yml如下:

server:
  port: 8001

spring:
  application:
    name: provide-1 #入驻eureka的服务名称

eureka:
  client:
    service-url:
      defaultZone: http://eureka5001.com:5001/eureka,
                   http://eureka5002.com:5002/eureka,
                   http://eureka5003.com:5003/eureka

效果如上图,显示除了Eureka里面注册的服务是provide-1,同时也对应出来ip地址。

自我保护机制

什么是自我保护模式?

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

在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话讲解:好死不如赖活着

综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。

一句话:某时刻某一个微服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存

Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 即会进入自我保护机制。

eureka.server.enable-self-preservation=true

Eureka和Zookeeper比较

转载地址: https://www.cnblogs.com/Eternally-dream/p/9833464.html

传统数据库:ACID

NOSQL: CAP

18-4

18-3

18-5

18-6

yaml说明

server:
  port: 8000
management:  
  port: 9000   # spring-boot-starter-acturator(监控系统健康)  一个管理端口
eureka:
  server:
    eviction-interval-timer-in-ms: 30000 #续期时间,即扫描失效服务的间隔时间。(默认是60秒)
    enable-self-preservation: false  #关闭自我保护模式 (缺省为打开)
  instance:
    hostname: localhost   # eureka服务端的实力名称
  client:
    service-url:    
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机版)
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    register-with-eureka: false   # false表示自己不需要向注册中心注册自己
    fetch-registry: false # false表示自己就是注册中心。我的职责就是维护服务实例,并不需要去检索服务
security:
  basic:
    enabled: false  # 配置不需要登录验证

「真诚赞赏,手留余香」

真诚赞赏,手留余香

使用微信扫描二维码完成支付