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>
<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 单节点配置
配置单节点比较简单,因为无其他节点,且不需要把自己注册进去,因此需要将registerWithEureka和fetchRegistry都设置为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 服务是可用的。
参考资料
- Service Discovery: Eureka Serve
- Spring Boot Service Discovery with Eureka
- Introduction to Spring Cloud Netflix – Eureka
- Spring Cloud Eureka 自我保护机制
原文地址:http://www.easysb.cn/2019/06/411.html
Spring Cloud Eureka集群配置及注意事项(Greenwich版本)的更多相关文章
- Spring Cloud Eureka集群部署到Linux环境
还是三板斧:先改配置文件,支持集群,然后出包,上传到linux环境(3个节点),最后启动jar包跑起来. 1.在原eureka服务端代码(参见Greenwich.SR2版本的Spring Cloud ...
- Spring Cloud Eureka 集群搭建 - 以及发现一个 “直觉BUG”
首先解释一下标题所说的“直觉BUG”,这个是我自己的定义.就是我们直觉上认为这是一个BUG,是一个错误,而实际并没有出错. 比如下图: 虽然出现报错信息,但是,整个程序并没有出错.至于原因,图片上的文 ...
- Spring Cloud Eureka集群 动态扩展新节点
场景描述: Eureka的集群节点有两个,互相注册形成集群,已经支持动态刷新(不知道怎么让Eureka支持动态刷新的可以参考http://www.cnblogs.com/flying607/p/845 ...
- docker-compose 完整打包发布, 多服务,多节点SPRING CLOUD ,EUREKA 集群
这里不再使用 端口映射的方式,因为不同主机上,Feign 根据 docker hostname访问会有问题. 把打包的好jar copy到docker镜像里 有几个服务,就复制几个dockerfile ...
- 三(2)、springcloud之Eureka集群配置
1)原理说明** 服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会 ...
- 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 ...
- Spring Cloud Eureka 之常用配置解析
[原创内容,转载.引用请注明出处] 1. 配置项解析 1.1 通用配置 # 应用名称,将会显示在Eureka界面的应用名称列 spring.application.name=config-servic ...
- SpringCloud学习之eureka集群配置
一.集群方案及部署思路: 如果是单节点的注册中心,是无法保证系统稳定性的,当然现在项目部署架构不可能是单节点的. 集群节点的部署思路:通过运行多个实例并请求他们相互注册,来完成注册中心的高可用性(结伴 ...
- spring 使用redis集群配置
上面两篇介绍了redis集群的配置合一些基本的概念,所以接下来当然是要在项目中使用咯,redis的java支持已经做的非常好了,所以我们来试着使用这些api来进行redis的操作,首先我们需要操作re ...
随机推荐
- vue语法糖
加冒号,就是个语法糖 两点: 例如 export default { data(){ return { item: { src: 'xxxxx' } } } } <img :src='item ...
- SpringCloud学习笔记(八):Zuul路由网关
概述 是什么? Zuul包含了对请求的路由和过滤两个最主要的功能: 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现请 ...
- SpringBoot--Banner的定制和关闭
SpringBoot项目启动的时候控制台会打印如下信息: 上面红色框框内的“SPRING BOOT”被称为Banner,意为横幅,默认会开启并在控制台打印,其实我们可以修改它的内容和样式,即定制:并选 ...
- css3@media实现原理
window.matchMedia() 基本用法 window.matchMedia方法用来检查CSS的mediaQuery语句.各种浏览器的最新版本(包括IE 10+)都支持该方法,对于不支持该方法 ...
- threading线程例子 (27-08)
利用阻塞的时间空闲去执行另一个子线程 import threading from time import ctime, sleep def music(func): for i in range(2) ...
- Facebook分布式框架—Thrift介绍。
Thrift介绍 Thrift是一个分布式RPC框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, ...
- 使用Math.random()函数生成n到m间的随机数字
使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备,Math.random()函数返回0和1之间的伪随机数 讲解: 本文讲解如何使用js生成n到m间的随机数字,主要目的是为后期的j ...
- Spring父子上下文(WebApplicationContext)(防止事务失效)
如果你使用了listener监听器来加载配置,一般在Struts+Spring+Hibernate的项目中都是使用listener监听器的.如下 <listener> <listen ...
- 分离vue文件,方便后期维护
参考: https://www.cnblogs.com/wy120/p/10179901.html https://blog.csdn.net/sinat_36146776/article/detai ...
- html选择器[获取兄弟(同级元素)]
1.html <div class="col-md-5"> <h4 class="m-t-md" id="dwzh"> ...