微服务Spring Cloud实战—Eureka Server的简介和高可用性—集群

Eureka简介

什么是Eureka?

Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务。它包含Server和Client两部分。Spring Cloud将它集成在子项目Spring Cloud Netflix中,从而实现服务的注册与发现
(注:Eureka的GitHub: https://github.com/Netflix/Eureka
Netflix是一家在线影片租借提供商。)

Eureka的作用

Eureka包含两个组件:Eureka Server和Eureka Client,他们的作用如下:

Eureka Server提供服务发现的能力,各个微服务启动时,他们会向Eureka Server
注册自己的信息(例如IP、端口、微服务名称等),Eureka Server会存储这些信息。

Eureka Client是一个Java客户端,用于简化Eureka Server的交互。

微服务启动后,会周期性(默认30秒)地向Eureka Server发送心跳
以续约自己的“租期”。

如果Eureka Server在一定时间内没有接收到某个微服务示例的心跳,Eureka
Server将会注销该实例(默认90秒)。

默认情况下,Eureka Server同时也是Eureka Client。多个Eureka Server实例,
互相之间通过复制的方式,来实现服务注册表内的数据的同步。

Eureka Client会缓存服务注册表内的信息。这种方式有一定的优势————首先,微服务
每次请求都查询Eureka Server,从而降低了Eureka Server的压力;其次,即使Eureka
Server所有节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者并完成调用。

综上,Eureka通过心跳检查、客户端缓存等机制,提高了系统的灵活性、可伸缩性和可用性。

Eureka Server的高可用

Eureka Server并不适合线上生产环境。Eureka Server会定时连接Eureka Server,获取服务注册表
中的信息并缓存在本地。微服务在消费远程API时总是使用本地缓存的数据。因此,一般来说,即使
Eureka Server发生宕机,也不影响到服务之间的调用。但如果Eureka Server宕机时,某些微服务也
出现了不可用的情况,Eureka Client中缓存若不被更新,就可能会影响到微服务的调用,甚至影响到
整个应用的高可用性。因此,在生产环境中,通常会部署一个高可用的Eureka Server集群。
Eureka Server实例会彼此增量地同步信息,从而保存所有节点数据一致。

构建Eureka Server集群

1.复制项目eureka,蒋ArtifactId修改为eureka-x。

2.配置系统的hosts改为127.0.0.1 peer1 peer2

3.修改application.yml如下:让两个节点的Eureka Server相互注册。

spring:
    application:
        name: eureka-ha
---
spring:
    cloud:
        inetutils:
            ignored-interfaces:  #对于服务发现注册,忽略某些命名的网络接口是非常有用的,比如使用Docker容器的时候。可以通过一些规则设置来忽略这些网络接口 https://springcloud.cc/spring-cloud-dalston.html
            - docker0 #忽略“docker0”的入口
            - veth.* #忽略所有的入口以“veth.*”
    profiles: peer1
server:
    port: 8761          #指定该Eureka实例的端口
eureka:
    server:
        enableSelfPreservation: false #关闭自我保护
        eviction-interval-timer-in-ms: 10000 #剔除已关停服务间隔(单位毫秒,默认是60*1000)
    instance:
        lease-expiration-duration-in-seconds: 30 #1
        lease-renewal-interval-in-seconds: 10 #2
        prefer-ip-address: true #3
        #ip-address: 192.168.0.xxx //4
        #指定当profiles=peer1,主机名是peer1
        hostname: peer1
    client:
        register-with-eureka: false
        fetch-registry: false
        service-url:
            #将自己注册到peer2这个Eureka上面去
            defaultZone: http://peer2:8762/eureka/
---
spring:
    profiles: peer2
server:
    port: 8762
eureka:
    instance:
        hostname: peer2
    client:
        service-url: http://peer1:8761/eureka/

将application.yml文件分为三段。第二段和第三段分别为spring.properties
指定一个值,该值表示他所在的那段内容应在哪个Profile里。第一段由于并未指定
spring.profiles,因此这段内容会对所有Profile生效。

在这里插入图片描述

本文大部分内容转载自周立的《Spring Cloud与Docker微服务架构实战》

猜你喜欢

转载自blog.csdn.net/weixin_43439494/article/details/83306355