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

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

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

节点三(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

Spring Cloud Eureka集群配置及注意事项(Greenwich版本)的更多相关文章

  1. Spring Cloud Eureka集群部署到Linux环境

    还是三板斧:先改配置文件,支持集群,然后出包,上传到linux环境(3个节点),最后启动jar包跑起来. 1.在原eureka服务端代码(参见Greenwich.SR2版本的Spring Cloud ...

  2. Spring Cloud Eureka 集群搭建 - 以及发现一个 “直觉BUG”

    首先解释一下标题所说的“直觉BUG”,这个是我自己的定义.就是我们直觉上认为这是一个BUG,是一个错误,而实际并没有出错. 比如下图: 虽然出现报错信息,但是,整个程序并没有出错.至于原因,图片上的文 ...

  3. Spring Cloud Eureka集群 动态扩展新节点

    场景描述: Eureka的集群节点有两个,互相注册形成集群,已经支持动态刷新(不知道怎么让Eureka支持动态刷新的可以参考http://www.cnblogs.com/flying607/p/845 ...

  4. docker-compose 完整打包发布, 多服务,多节点SPRING CLOUD ,EUREKA 集群

    这里不再使用 端口映射的方式,因为不同主机上,Feign 根据 docker hostname访问会有问题. 把打包的好jar copy到docker镜像里 有几个服务,就复制几个dockerfile ...

  5. 三(2)、springcloud之Eureka集群配置

    1)原理说明** 服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会 ...

  6. Redis 哨兵(sentinel)模式集群配置(5.0.3版本)

    一.准备工作 1.系统环境:centos6.4 2.服务器六台(1主5从): 192.168.1.161(master) 192.168.1.162(slave) 192.168.1.163(slav ...

  7. Spring Cloud Eureka 之常用配置解析

    [原创内容,转载.引用请注明出处] 1. 配置项解析 1.1 通用配置 # 应用名称,将会显示在Eureka界面的应用名称列 spring.application.name=config-servic ...

  8. SpringCloud学习之eureka集群配置

    一.集群方案及部署思路: 如果是单节点的注册中心,是无法保证系统稳定性的,当然现在项目部署架构不可能是单节点的. 集群节点的部署思路:通过运行多个实例并请求他们相互注册,来完成注册中心的高可用性(结伴 ...

  9. spring 使用redis集群配置

    上面两篇介绍了redis集群的配置合一些基本的概念,所以接下来当然是要在项目中使用咯,redis的java支持已经做的非常好了,所以我们来试着使用这些api来进行redis的操作,首先我们需要操作re ...

随机推荐

  1. Docker系列(七):Docker图形化管理和监控

    Docker管理工具之官方三剑客 Docker Machine是什么鬼 从前 现在 你需要登录主机,按照主机及操作系统特有的安装以及配置步骤安装Docker,使其 能运行Docker容器. Docke ...

  2. FTP、FTPS、SFTP概览

    1. 基本概念 FTP:File Transfer Protocol FTPS:FTP over SSL.构建在SSL/TLS(Secure Socket Layer/Transport Layer ...

  3. Java 面试题经典 77 问(含答案)!

    金三银四了,3月底,4月初,找工作换单位的黄金时期.4月初将会有有一大批职场人士流动... 作为Java开发码农的你是不是也在蠢蠢欲动,或者已经搞了几轮车轮战了? 我们为大家准备了 77 道经典 Ja ...

  4. java8 新特性学习笔记

    Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...

  5. shell脚本练习03--字符串

    ######################################################################### # File Name: -.sh # Author ...

  6. c# Data = select new{} 返回值的显示

  7. iOS开发系列-NSURLConnection

    概述 NSURLConnection是负责发送请求,建立客户端与服务端的连接.发送数据给服务器,并收集来自服务器的响应数据.其中NSURLRequest类是用来封装一个请求,包含NSURL对象.请求方 ...

  8. (转)NodeJS收发GET和POST请求

    NodeJS收发GET和POST请求 目录: 一 express框架接收 二 接收Get 三 发送Get 四 接收Post 五 发送Post 一 express框架接收 1 2 3 4 5 app.g ...

  9. HTML - 表格标签相关

    <html> <head></head> <body> <!-- table (表格) border : 表格的边框 width : 表格的宽 h ...

  10. strict

    strict为3.2.3新增连贯操作,用于设置数据写入和查询是否严格检查是否存在字段.默认情况下不合法数据字段自动删除,如果设置了严格检查则会抛出异常. 例如: $model->strict(t ...