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


    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>
    
    &lt;properties&gt;
        &lt;java.version&gt;1.8&lt;/java.version&gt;
        &lt;spring-cloud.version&gt;Greenwich.SR1&lt;/spring-cloud.version&gt;
    &lt;/properties&gt;
    
    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
            &lt;artifactId&gt;spring-cloud-starter-netflix-eureka-server&lt;/artifactId&gt;
        &lt;/dependency&gt;
    
        &lt;dependency&gt;
            &lt;groupId&gt;javax.xml.bind&lt;/groupId&gt;
            &lt;artifactId&gt;jaxb-api&lt;/artifactId&gt;
            &lt;version&gt;2.3.0&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.sun.xml.bind&lt;/groupId&gt;
            &lt;artifactId&gt;jaxb-impl&lt;/artifactId&gt;
            &lt;version&gt;2.3.0&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.glassfish.jaxb&lt;/groupId&gt;
            &lt;artifactId&gt;jaxb-runtime&lt;/artifactId&gt;
            &lt;version&gt;2.3.0&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;javax.activation&lt;/groupId&gt;
            &lt;artifactId&gt;activation&lt;/artifactId&gt;
            &lt;version&gt;1.1.1&lt;/version&gt;
        &lt;/dependency&gt;
    
        &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
            &lt;scope&gt;test&lt;/scope&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;
    
    &lt;dependencyManagement&gt;
        &lt;dependencies&gt;
            &lt;dependency&gt;
                &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
                &lt;artifactId&gt;spring-cloud-dependencies&lt;/artifactId&gt;
                &lt;version&gt;${spring-cloud.version}&lt;/version&gt;
                &lt;type&gt;pom&lt;/type&gt;
                &lt;scope&gt;import&lt;/scope&gt;
            &lt;/dependency&gt;
        &lt;/dependencies&gt;
    &lt;/dependencyManagement&gt;
    
    &lt;build&gt;
        &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
            &lt;/plugin&gt;
        &lt;/plugins&gt;
    &lt;/build&gt;
    

    </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实例已经运行起来了,如下图所示

    image

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

    image

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

    image

    节点三(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设为false),不推荐。
    • 降低renewalPercentThreshold的比例(eureka.server.renewal-percent-threshold设置为0.5以下,比如0.49),不推荐。
    • 部署多个 Eureka Server 并开启其客户端行为(eureka.client.register-with-eureka不要设为false,默认为true),推荐。

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

    参考资料

    原文地址:http://www.easysb.cn/2019/06/411.html
  • 相关阅读:
    wp8模拟器中使用电脑键盘和模拟器的版本解释
    程序员如何正确的评估自己的薪资
    本地资源之绑定页面的标题和增加软件的语言支持
    C#导出数据的EXCEL模板设计
    程序员高效编程的14点建议
    使用StaticResource给控件定义公共的样式和属性来写界面XAML
    程序员什么时候该考虑辞职
    我的第一个wp8小程序
    检测CPU是否支持虚拟化
    所有经历都是一种恩赐
  • 原文地址:https://www.cnblogs.com/jpfss/p/11316277.html
走看看 - 开发者的网上家园