一、Eureka
基本概念
Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目 spring-cloud-netflix中,实现SpringCloud的服务发现功能。Eureka包含两个组件:
- Eureka Server
- Eureka Client
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也包含一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会 向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有 接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90 秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。
综上,Eureka通过心跳检查、集群、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
二、搭建Eureka服务器
1、父工程中定义Spring Cloud的版本
(已添加)
<dependencyManagement>
<dependencies>
<!--Spring Cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、创建Eureka服务器模块
创建Maven模块:guli-commonservice-eureka
3、配置pom
<dependencies>
<!--注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
4、配置application.properties
#服务端口
server.port=8220
# 服务名
spring.application.name=guli-eureka
# 环境设置:dev、test、prod
spring.profiles.active=dev
#Eureka客户端与Eureka服务端进行通信的地址
eureka.client.service-url.defaultZone=http://localhost:${server.port}/eureka
5、创建启动类
在启动类上添加注解@EnableEurekaServer
package com.guli.eureka;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class);
}
}
6、logback.xml
7、启动Eureka注册中心并在浏览器中访问
System Status:系统信息
DS Replicas:服务器副本
Instances currently registered with Eureka:已注册的微服务列表
General Info:一般信息
Instance Info:实例信息
将注册中心的本身从服务注册列表中移除
#是否将自己注册到Eureka服务器中,本身是服务器,无需注册
eureka.client.register-with-eureka=fals
三、服务注册
在edu微服务中完成以下配置
1、客户端配置pom
配置Eureka客户端的pom依赖
<!--服务注册-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、添加服务配置信息
配置application.properties,在客户端微服务中添加注册Eureka服务的配置信息
#指定注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8220/eureka/
#eureka服务器上获取的是服务器的ip地址,否则是主机名
eureka.instance.prefer-ip-address=true
3、添加Eureka客户端注解
在客户端微服务启动类中添加注解
@EnableEurekaClient
@EnableDiscoveryClient和@EnableEurekaClient:都是能够让注册中心能够发现,扫描到该服务。
@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
从Spring Cloud Edgware开始,@EnableDiscoveryClient 或@EnableEurekaClient 可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。
4、启动客户端微服务
启动注册中心
启动已注册的微服务,可以在Eureka注册列表中看到被注册的微服务
项目中应用
源码guli-commonservice-eureka是eureka server服务注册中心
guli-microservice-edu是eureka client服务客户端
- 先启动guli-commonservice-eureka,因为edu项目中是配置的多个eureka server服务,所以都启动了。设定不同的端口即可
- 在启动guli-microservice-edu
- 打开http://localhost:8220 就可以查看注册中心的信息。
四、Eureka的自我保护模式
1、测试自我保护
首先启动Eureka服务器和edu微服务,访问注册中心 http://localhost:8220/,可以看到,实例是成功注册到中心的。
此时我们将edu服务关闭,刷新注册中心,我们会发现如下界面
我们除了看到了一行红色的警告信息,还发现了一件神奇的事情,就是我们的服务实例虽然被kill了,但是在服务注册中心它还是存在的。这就是Eureka自我保护机制,它不会剔除已经挂掉的服务,它会认为这个服务是在尝试重新连接的。
Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果低于,就会将当前实例注册信息保护起来,让实例不会过期,尽可能保护这些注册信息。
2、关闭自我保护
如果在保护期间,实例出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败。这个时候客户端的容错机制就很重要了。(重新请求,断路器)
保护机制,可能会导致服务实例不能够被正确剔除。我们在开发过程中不希望Eureka的自我保护机制开启,不利于开发。我们可以关闭Eureka的自我保护机制(实际生产环境不建议关闭)。
在本地开发时,可使用:eureka.server.enable-self-preservation=false关闭保护机制,使不可用实例能够正常下线。
guli-commonservice-eureka 添加如下配置
#关闭保护机制,以确保注册中心将不可用的实例正确剔除
eureka.server.enable-self-preservation=false
#(代表是5秒,单位是毫秒,清理失效服务的间隔 )
eureka.server.eviction-interval-timer-in-ms=5000
guli-microservice-edu 的配置
# 心跳检测检测与续约时间
# 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
# 配置说明
# lease-renewal-interval-in-seconds 每间隔5s,向服务端发送一次心跳,证明自己依然”存活“
# lease-expiration-duration-in-seconds 告诉服务端,如果我10s之内没有给你发心跳,就代表我“死”了,将我踢出掉。
eureka.instance.lease-renewal-interval-in-seconds=5
eureka.instance.lease-expiration-duration-in-seconds=10
我们重新启动Eureka服务,此时我们发现,红色警告变成了自我保护被关闭的警告,
然后关闭edu客户端进行测试,发现隔20秒左右,edu实例被注册中心剔除,表明此时自我保护机制被关闭。
五、Eureka的高可用
1、Eureka服务集群
Eureka服务器两两互相注册,其它微服务注册到集群中所有的服务器上
2、模拟Eureka集群部署
(1)编辑启动配置
(2)分配端口
三个服务分别8200、8201、8202端口
3、配置并启动
(1)配置eureka集群并启动
注意:测试时修改配置和启动的速度尽量快一些!保证服务尽可能的同时启动
服务器0:配置并启动
#服务端口
#server.port=8220
......
#Eureka客户端与Eureka服务端进行通信的地址
eureka.client.service-url.defaultZone=http://127.0.0.1:8221/eureka/,http://127.0.0.1:8222/eureka/
服务器1、服务器2同服务器0,注册到另外两台Eureka服务上,然后启动
(2)配置edu并启动
测试edu只注册到8220端口,启动后发现集群中其他端口的eureka服务也获取到了edu的注册信息
# 注册中心
eureka.client.service-url.defaultZone=http://localhost:8220/eureka
为了确保edu任何时候都能注册到集群中的可用注册中心服务器上,可以在edu中做如下配置
# 注册中心
eureka.client.service-url.defaultZone=http://localhost:8220/eureka,http://localhost:8221/eureka,http://localhost:8222/eureka
生产上建议至少两台或以上的Eureka服务器集群