Spring Cloud Eureka(Greenwich版本)集群配置及注意事项

栏目: Java · 发布时间: 6年前

内容简介:Spring Cloud Netflix Eureka 是一个提供服务注册与发现的套件。服务提供者只需要将自己的提供的信息注册到到Eureka上,而客户端就可以直接据此发现所有的可用服务,避免了在客户端直接硬编码指定服务提供者的信息,从而实现服务者和客户端的解耦,同时也极大地提高了整体系统的水平扩展能力和稳定性。Eureka作为一个服务的注册仓库,而本身也是一个服务客户端,可以将自己注册到仓库中。目前最新版本是Greenwich,那么下面就以该最新版本来介绍如何搭建Eureka服务。

Spring Cloud Eureka<Greenwich版本>集群配置及注意事项

一·概述

Spring Cloud Netflix Eureka 是一个提供服务注册与发现的套件。服务提供者只需要将自己的提供的信息注册到到Eureka上,而客户端就可以直接据此发现所有的可用服务,避免了在客户端直接硬编码指定服务提供者的信息,从而实现服务者和客户端的解耦,同时也极大地提高了整体系统的水平扩展能力和稳定性。

Eureka作为一个服务的注册仓库,而本身也是一个服务客户端,可以将自己注册到仓库中。

二·快速使用

目前最新版本是Greenwich,那么下面就以该最新版本来介绍如何搭建Eureka服务。

实现一个Eureka注册与发现服务,步骤相当简单:

  • spring-cloud-starter-netflix-eureka-server 添加到依赖中
  • @EnableEurekaServer 注解添加到 @SpringBootApplication 注解的类上即可。
  • 添加 jaxb-api 等相关的依赖包,因为这些在JDK9中已经移除了,需要手动添加,可以参考一下代码配置文件。

以下是一个典型的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.netease.nis.cloud</groupId>
    <artifactId>lighthouse</artifactId>
    <version>0.0.1</version>
    <name>lighthouse</name>
    <description>Service Registration and Discovery</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.1 单节点配置

配置单节点比较简单,因为无其他节点,且不需要把自己注册进去,因此需要将 registerWithEurekafetchRegistry 都设置为false,如下配置文件 application.yml

server:
  port: 8761
eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false

2.2 多节点集群配置

如果考虑到系统的高可用,最好是配置成多节点集群模式。比如,我想配置三个节点,分别叫杭州、上海、广州,那么其配置文件如下:

---
eureka:
  client:
    service-url:
      defaultZone: http://peer1.com:9801/eureka/,http://peer2.com:9802/eureka/,http://peer3.com:9803/eureka/

---
server:
  port: 9801

eureka:
  environment: dev
  datacenter: hangzhou
  instance:
    hostname: peer1.com
    appname: eureka-cluster

spring:
  profiles: peer1
  application:
    name: application-peer1
---
server:
  port: 9802

eureka:
  environment: dev
  datacenter: beijing
  instance:
    hostname: peer2.com
    appname: eureka-cluster

spring:
  profiles: peer2
  application:
    name: application-peer2

---
server:
  port: 9803

eureka:
  environment: dev
  datacenter: guangzhou
  instance:
    hostname: peer3.com
    appname: eureka-cluster

spring:
  profiles: peer3
  application:
    name: application-peer3

同时再hosts文件中添加如下解析:

127.0.0.1 peer1.com
127.0.0.1 peer2.com
127.0.0.1 peer3.com

这里值得注意的是:

  • eureka.environment 是表示当前的运行环境,在页面Environment会展示出来
  • eureka.datacenter 表示当前的数据中心,对于多中心的最好配置一下
  • eureka.instance.hostname 表示当前实例的主机名, 主机名不能相同,不然副本模式会无法生效!!!在页面上就一直显示为 unavailable-replicas ,即便是单机多个实例最好配置多个不同域名,否则无法工作。
  • eureka.instance.appname 对于多副本的实例,需要配置相同的名字,不然副本模式会无法正常工作。

然后,我们依次启动三个实例

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
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3

可以看到各个Eureka实例已经运行起来了,如下图所示

Spring Cloud Eureka(Greenwich版本)集群配置及注意事项

节点一(peer1.com:9801)的状态

Spring Cloud Eureka(Greenwich版本)集群配置及注意事项

节点二(peer2.com:9802)的状态

Spring Cloud Eureka(Greenwich版本)集群配置及注意事项

节点三(peer3.com:9803)的状态

2.3 自我保护机制

Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。

我们在单机测试的时候很容易满足心跳失败比例在 15 分钟之内低于 85%,这个时候就会触发 Eureka 的保护机制,一旦开启了保护机制,则服务注册中心维护的服务实例就不是那么准确了,此时我们可以使用eureka.server.enable-self-preservation=false来关闭保护机制,这样可以确保注册中心中不可用的实例被及时的剔除(不推荐)。

自我保护模式被激活的条件是:在 1 分钟后, Renews (last min) < Renews threshold 。这两个参数的意思:

  • Renews threshold:Eureka Server 期望每分钟收到客户端实例续约的总数。
  • Renews (last min):Eureka Server 最后 1 分钟收到客户端实例续约的总数。

如果在 1 分钟后, Renews (last min) < Renews threshold ,默认需等待 5 分钟(可以通过 eureka.server.wait-time-in-ms-when-sync-empty 配置),即 5 分钟后你会看到下面的提示信息:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT.
RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

解决方式有三种:

eureka.server.enable-self-preservation
eureka.server.renewal-percent-threshold
eureka.client.register-with-eureka

Eureka 的自我保护模式是有意义的,该模式被激活后,它不会从注册列表中剔除因长时间没收到心跳导致租期过期的服务,而是等待修复,直到心跳恢复正常之后,它自动退出自我保护模式。这种模式旨在避免因网络分区故障导致服务不可用的问题。例如,两个客户端实例 C1 和 C2 的连通性是良好的,但是由于网络故障,C2 未能及时向 Eureka 发送心跳续约,这时候 Eureka 不能简单的将 C2 从注册表中剔除。因为如果剔除了,C1 就无法从 Eureka 服务器中获取 C2 注册的服务,但是这时候 C2 服务是可用的。

参考资料


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Rapid Web Applications with TurboGears

Rapid Web Applications with TurboGears

Mark Ramm、Kevin Dangoor、Gigi Sayfan / Prentice Hall PTR / 2006-11-07 / USD 44.99

"Dear PHP, It's over between us. You can keep the kitchen sink, but I want my MVC. With TurboGears, I was able to shed the most heinous FileMaker Pro legacy 'solu-tion' imaginable. It has relationshi......一起来看看 《Rapid Web Applications with TurboGears》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具