赞
踩
Eureka2.0版本已经停止维护,为什么要写这篇博客重复已停止更新的中间件,其目的主要是:
Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
"心跳"是一段定时发送的自定义信息,让对方知道自己"存活",以确保连接有效性,大部分CS架构的应用程序都采用心跳机制,服务端和客户端都可以发送心跳。通常情况下客户端发送请求心跳包给服务器端。服务器端判断客户端是否存活在线。
服务中心(Eureka Server)是个十分重要的角色,他是服务提供者(Provider)和服务消费者(Consumer)之间的桥梁。服务提供者只有将自己的服务注册到服务注册中心才可能被服务消费者调用。而服务消费者也只有通过服务注册中心获取可用服务列表后,才能调用所需的服务。为保证应用的高可用型;使用多个注册中心,相互注册保证任何一台注册中心故障不影响整个服务器中心向外提供服务。
添加spring-boot-starter-parent依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
<relativePath/>
</parent>
添加依赖dependencyManagement
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
添加相关依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>3.0.5</version> <scope>test</scope> </dependency>
package com.goyeer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
//Eureka注册中心注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaService {
public static void main(String[] args){
SpringApplication.run(EurekaService.class,args);
}
}
server: port: 30009 eureka: instance: #服务注册中心实例的主机名 hostname: localhost client: #实例是否在eureka服务器上注册自己的信息以供其他服务发现,默认为true register-with-eureka: false #此客户端是否获取eureka服务器注册表上的注册信息,默认为true fetch-registry: false service-url: #与Eureka注册服务中心的通信zone和url地址 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ registerWithEureka: false fetchRegistry: false server: enable-self-preservation: false eviction-interval-timer-in-ms: 5000
pom文件可用直接使用Eureka服务端pom文件,只需要把spring-cloud-starter-netflix-eureka-server替换为spring-cloud-netflix-eureka-client
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-client</artifactId>
</dependency>
package com.awinic;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class EurekaProviderClientApp {
public static void main(String[] args){
SpringApplication.run(EurekaProviderClientApp.class,args);
}
}
server:
port: 30001
eureka:
instance:
hostname: localhost
client:
#实例是否在eureka服务器上注册自己的信息以供其他服务发现,默认为true
register-with-eureka: true
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:30000/eureka/
registerWithEureka: false
fetchRegistry: false
Eureka在CAP理论当中是属于AP , 也就说当产生网络分区时,Eureka保证系统的可用性,但不保证系统里面数据的一致性,当发生网络分区的时候,Eureka-Server和Client端的通讯被终止,Eureka Server端接收不到Eureka Client续约请求,此时,如果直接将没有收到心跳Eureka Client端自动剔除,那么就可能误把正常的Eureka Client端给剔除。这个不符合AP理论,所有Eureka-Server会保留可能已宕机的Eureka Server端。从而保证了Eureka Server的健壮性,符合AP理论。
this.expectedNumberOfRenewsPerMin = count * 2;
this.numberOfRenewsPerMinThreshold =(int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold());
expectedNumberOfRenewsPerMin :每分钟最大的续约数量,由于客户端是每30秒续约一次,一分钟就是续约2次, count代表的是客户端数量。
所以这个变量的计算公式 : 客户端数量*2
numberOfRenewsPerMinThreshold : 每分钟最小续约数量, 使用expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold()。
serverConfig.getRenewalPercentThreshold()的默认值为0.85 , 也就是说每分钟的续约数量要大于85% 。
Eureka的自我保护机制,都是围绕以上两个变量实现的,如果每分钟的续约数量小于numberOfRenewsPerMinThreshold,此时就会开启自动保护机制。
在此期间,Eureka Server不会主动剔除任何一个客户端。
Eureka 是Spring Cloud核心它提供一下几个主要的服务:
30秒
向 Eureka Server 发送一次心跳进行服务续约,通过续约告知 Eureka Server 自己是正常的。如果 Eureka Server 180秒
没有收到客户端的续约,就会认为客户端故障,并将其剔除。30秒
增量抓取注册表合并到本地注册表。如果合并后的本地注册表与 Eureka Server 端的注册表不一致(hash 比对),就全量抓取注册表覆盖本地的注册表。180秒
没有向 Eureka Server 发送续约请求,就会被认为实例故障,然后从注册表剔除。Peer to Peer
)来进行副本之间的数据同步,集群中每个 Server 节点都可以接收写操作和读操作。Server 节点接收到写操作后(注册、续约、下线、状态更新)会通过后台任务打包成批量任务发送到集群其它 Server 节点进行数据同步。Eureka Server 集群副本之间的数据会有短暂的不一致性,它是满足 CAP 中的 AP,即 高可用性和分区容错性
。后面将陆续介绍Eureka配置项、Eureka服务集群、Eureka源码解析…
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。