Eureka 介绍
Eureka 是什么
Eureka 是 Netflix 开发的一款基于 HTTP REST 的服务,由 Pivotal 公司将其整合进 Spring Cloud 生态。Netflix 在设计 Eureka 时遵守的是 AP 原则,通常用于服务注册发现、负载均衡和故障转移等,也是 Spring Cloud 中使用的服务注册发现组件。Eureka 采用 C/S 架构,提供了一个基于 Java 的 Client 组件,用来与服务端交互,同时具有一套内置的负载均衡器,可以进行基本的轮询负载均衡。
Eureka架构体系
Eureka 服务的三个角色
- 服务注册中心:Eureka 提供的服务端,提供服务注册与发现的功能,一般被称作 Eureka-Server;
- 服务消费者:消费者应用从服务注册中心获取服务列表,从而使消费者可以知道去何处调用其所需要的服务;
- 服务提供者:提供服务的应用,可以是 Spring Boot 应用,也可以是其他技术平台且遵循 Eureka 通信机制的应用。它将自己提供的服务注册到 Eureka,以供其他应用发现。
Eureka 的自我保护模式
默认情况下,如果 Eureka Server 在一定时间内(默认 90 秒)没有接收到某个微服务实例的心跳,Eureka Server 将会注销该实例。但是当网络分区故障发生时,微服务与 Eureka Server 之间无法正常通信,这就可能变得非常危险了。因为微服务本身是健康的,此时本不应该注销这个微服务。Eureka Server 通过 “自我保护模式” 来解决这个问题,当 Eureka Server 节点在短时间内丢失过多客户端时(超过 85%【默认情况下,可以通过请设置属性:eureka.renewalPercentThreshold=[0.0, 1.0]】 的服务实例丢失心跳,可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server 就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该 Eureka Server 节点会自动退出自我保护模式。自我保护模式是一种对网络异常的安全保护措施,使用自我保护模式,可以让 Eureka 集群更加的健壮、稳定。
在自我保护模式中,Eureka Server 会保护注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阀值以上时,该 Eureka Server 节点就会自动退出自我保护模式。
如何选择关闭还是开启自我保护机制
Eureka服务端默认情况下是会开启自我保护机制的,但我们在不同环境应该选择是否开启保护机制。
我们可以通过配置文件使用 eureka.server.enable-self-preservation: false 来禁用自我保护模式。
Eureka 的健康检查
在 Eureka 中,微服务状态可取值为 DOWN、OUT_OF_SERVICE、UNKNOWN 等,只有 UP 的微服务会被请求。由于 Eureka Server 与 Eureka Client 之间使用心跳机制来确定 Eureka Client 的状态,默认情况下服务器端与客户端的心跳保持正常,应用程序就会始终保持 UP 状态,所以微服务的 UP 并不能完全反应应用程序的状态。Spring Boot Actuator 提供了 /health 端点,该端点可展示应用程序的健康信息,只要将该端点中的健康状态传播到 Eureka Server 就可以了,实现这点很简单,只需为微服务配置如下内容即可。如果需要更细粒度健康检查,可实现 com.netflix.appinfo.HealthCheckHandler 接口,EurekaHealthCheckHandler 已实现了该接口。
# 开启健康检查(需要添加spring-boot-starter-actuator依赖)
eureka.client.healthcheck.enabled = true
Eureka的一些概念
- Register:服务注册
- Renew:服务续约
- Fetch Registries:获取注册列表信息
- Cancel:服务下线
- Eviction 服务剔除
Eureka 入门案例
创建 Maven 父级 Pom 工程
<properties>
<springcloud.version>Dalston.SR1</springcloud.version>
<springboot.version>1.5.9.RELEASE</springboot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${springcloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
创建 Eureka Server 工程
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
创建 Eureka Server 的启动主类,这里添加相应注解,作为程序的入口:
@SpringBootApplication
@EnableEurekaServer //开启Euraka注册中心服务
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
添加 Eureka Server 需要的 application.yml 配置文件到工程的 src/main/resources 目录下:
server:
port: 8761 # 默认端口
spring:
application:
name: cloud-eureka-service #应用名称
配置
直接运行后就可以在浏览器访问http://localhost:8761
创建 Eureka Client 工程
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
创建 Eureka Client 的启动主类,添加注解 @EnableEurekaClient
@EnableEurekaClient
@SpringBootApplication
public class DeptProviderApplication {
public static void main(String[] args){
SpringApplication.run(DeptProviderApplication.class, args);
}
}
配置文件
server:
port: 8088
spring:
application:
name: cloud-eureka-client-a #应用名称
#注册的含义就是将自己的一些信息(ip,port......)发送给Eureka-server
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
运行访问
Eureka 常用配置
Eureka 配置有三种
server
#服务端开启自我保护模式。无论什么情况,服务端都会保持一定数量的服务。避免client与server的网络问题,而出现大量的服务被清除。
eureka.server.enable-self-preservation=true
#开启清除无效服务的定时任务,时间间隔。默认1分钟
eureka.server.eviction-interval-timer-in-ms= 60000
#在设置的时间范围类,期望与client续约的百分比。
eureka.server.renewal-percent-threshold=0.85
client
#实例是否在eureka服务器上注册自己的信息以供其他服务发现,默认为true
eureka.client.register-with-eureka=false
#此客户端是否获取eureka服务器注册表上的注册信息,默认为true
eureka.client.fetch-registry=false
#是否过滤掉,非UP的实例。默认为true
eureka.client.filter-only-up-instances=true
#与Eureka注册服务中心的通信zone和url地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
#从eureka服务器注册表中获取注册信息的时间间隔(s),默认为30秒
eureka.client.registry-fetch-interval-seconds=30
instance
#服务注册中心实例的主机名
eureka.instance.hostname=localhost
#该实例的IP地址
eureka.instance.ip-address=
#该实例,相较于hostname是否优先使用IP
eureka.instance.prefer-ip-address=false
#服务中心删除此服务实例的等待时间(秒为单位),时间间隔为最后一次服务中心接受到的心跳时间
eureka.instance.lease-expiration-duration-in-seconds=90
#该实例给服务中心发送心跳的间隔时间,用于表明该服务实例可用
eureka.instance.lease-renewal-interval-in-seconds=30
Eureka 集群配置 初级方案
集群作用:为了保证Eureka高可用
假设现有三台 Eureka Server 主机,每台主机的 IP 与端口分别是: localhost:8005、localhost:8006、localhost:8007
Eureka Server1 配置
server:
port: 8001
eureka:
instance:
hostname: eureka1
client:
register-with-eureka: false #是否注册自己
fetch-registry: false #是否拉取注册服务
service-url:
defaultZone: http:// eureka2:8002/eureka/,http:// eureka3:8003/eureka/
Eureka Server2 配置
server:
port: 8002
eureka:
instance:
hostname: eureka2
client:
register-with-eureka: false #是否注册自己
fetch-registry: false #是否拉取注册服务
service-url:
defaultZone: http:// eureka1:8001/eureka/,http:// eureka3:8003/eureka/
Eureka Server3 配置
server:
port: 8083
eureka:
instance:
hostname: eureka3
client:
register-with-eureka: false #是否注册自己
fetch-registry: false #是否拉取注册服务
service-url:
defaultZone: http:// eureka1:8001/eureka/,http:// eureka2:8002/eureka/
本地集群搭建的细节说明
若三台 Eureka Server 的 IP 都是 127.0.0.1 或者 localhost,彼此只是服务端口不一样;此时建议修改系统的 hosts 文件作相应的域名映射,方便日后访问 Eureka 的服务。当 hosts 文件加入下述配置之后,则可以通过不同的域名访问对应的 Eureka 服务了
127.0.0.1 eureka1
127.0.0.1 eureka2
127.0.0.1 eureka3
特别注意:新版的 Eureka 搭建集群时,eureka.client.serviceUrl.defaultZone 配置项的地址,不能使用 localhost 或者内网/外网 IP,必须使用域名,DNS 解析需自行配置,也可以在本机的 /etc/hosts 里映射域名,否则各节点均出现在 unavailable-replicas 下
Eureka 集群配置 终极方案
同时我们也可以只开一个服务来实现集群模式,通过启动时改变端口号来实现
server:
port: 9090
spring:
application:
name: demo-client
eureka:
client:
service-url:
defaultZone: http:// eureka1:8001/eureka/,http:// eureka2:8002/eureka/,http:// eureka3:8003/eureka/
instance:
instance-id: demo-client-9090
prefer-ip-address: true
参考资料
https://blog.csdn.net/forezp/article/details/73017664
https://www.techgrow.cn/posts/be1e11c7.html
https://zhuanlan.zhihu.com/p/138542807