Eureka服务注册与发现
@[toc]
1、Eureka简介
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务注册和发现功能。
Eureka是基于REST(Representional State Transfer)服务的,主要以AWS云服务为支撑,提供服务发现并实现负载均衡和故障转移。Eureka提供了Java客户端组件Eureka Client,方便与服务端交互。客户端内置了基于round-robin实现的简单负载均衡,在Netflix中为Eureka提供更为复杂的负载均衡方案进行封装,以实现高可用,包括基于流量、资源利用率以及请求返回状态的加权负载均衡。
Eureka高级架构图如下所示。其中,Application Server表示服务提供方,Application Client表示服务消费方,Make Remote Call表示远程调用。服务在Eureka上注册,然后每隔30秒发送心跳来更新它们的租约。如果客户端不能多次续订租约,就将在大约90秒内从服务器注册表中剔除。注册信息和更新被复制到集群中的所有Eureka节点。来自任何区域的客户端都可以查找注册表信息(每30秒发生一次)来定位它们的服务(可能在任何区域)并进行远程调用。
服务发现有两种模式:一种是客户端模式,一种是服务端模式。Eureka采用的是客户端发现模式。
2、搭建Eureka注册中心
2.1 创建项目并进入Eureka server依赖
spring cloud版本:Hoxton SR6
spring boot版本:2.2.5.RELEASE
<!--引入 eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.2 编写application.properties
# Eureka Server端口号 默认端口号8761
server.port=8761
# 指定服务名称 注意:服务名不能出现下划线 默认服务命不区分大小写 推荐服务名大写
spring.application.name=EUREKASERVER
# eureka server的服务注册中心的地址 暴露服务地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka
2.3 开启Eureka server,入口类加入注解
@SpringBootApplication
@EnableEurekaServer //开启当前应用是一个服务注册中心
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
2.4 访问Eureka的服务注册页面
2.5 虽然能看到管理界面为什么项目启动控制台报错?
出现上述问题原因:eureka组件包含 eurekaserver 和eurekaclient。server是一个服务注册中心,用来接受客户端的注册。client的特性会让当前启动的服务把自己作为eureka的客户端进行服务中心的注册,当项目启动时服务注册中心还没有创建好,所以找我不到服务的客户端组件就直接报错了,当启动成功服务注册中心创建好了,日后client也能进行注册,就不再报错啦!
2.6 关闭Eureka自己注册自己
# Eureka Server端口号 默认端口号8761
server.port=8761
# 指定服务名称 注意:服务名不能出现下划线 默认服务命不区分大小写 推荐服务名大写
spring.application.name=EUREKASERVER
# eureka server的服务注册中心的地址 暴露服务地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# 关闭eureka client的立即注册
eureka.client.fetch-registry=false
# 让当前应用仅仅是一个服务注册中心
eureka.client.register-with-eureka=false
2.7 7.再次启动,当前应用就是一个单纯Eureka Server,控制器也不再报错
3、开发Eureka Client
3.1 创建项目并引入eureka client依赖
<!--引入eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.2 编写配置application.properties
# 指定服务端口
server.port=8989
# 指定服务名称
spring.application.name=EUREKACLIENT
# 指定服务注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
3.3 开启eureka客户端加入注解
@SpringBootApplication
@EnableEurekaClient //让当前的微服务作为一个eurekaserver客户端 进行服务注册
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class,args);
}
}
3.4 启动之前的8761服务注册中心
再启动eureka客户端服务
4、eureka自我保护机制
4.1 在服务频繁启动时Eureka Server出现错误
- 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.
4.2 自我保护机制
默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。这种设计的哲学原理就是"宁可信其有不可信其无!"。自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
4.3 在eureka server端关闭自我保护机制
eureka.server.enable-self-preservation=false #关闭自我保护
eureka.server.eviction-interval-timer-in-ms=3000 #超时3s自动清除
4.4 微服务修改减短服务心跳的时间
4.5 关闭自我保护机制还是会出现警告
官方不建议在生产环境下关闭自我保护机制
5、搭建Eureka注册中心集群
由于所有服务都会注册到注册中心,服务之间的调用都是通过从注册中心获取服务列表来调用的,注册中心一旦宕机,所有服务调用都会出现问题,因此需要多个注册中心组成集群来提供服务。
5.1第一台注册中心
第一个注册中心(将8761往8762和8763端口的注册中心进行注册,因为三个注册中心之间也是相互注册的)
在IDEA中,可以通过使用不同的配置文件启动同一个Spring Boot应用,从原启动配置中复制一份,修改下VM options即可。
5.2 第二台注册中心
第二个注册中心(将8762往8761和8763端口注册)
# Eureka Server端口号 默认端口号8761
server.port=8761
# 指定服务名称 注意:服务名不能出现下划线 默认服务命不区分大小写 推荐服务名大写
spring.application.name=EUREKASERVER
# eureka server的服务注册中心的地址 暴露服务地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka,http://localhost:8763/eureka
# 关闭eureka client的立即注册
eureka.client.fetch-registry=false
# 让当前应用仅仅是一个服务注册中心
eureka.client.register-with-eureka=false
#关闭自我保护
eureka.server.enable-self-preservation=false
#超时3s自动清除
eureka.server.eviction-interval-timer-in-ms=3000
5.3 第三台注册中心
第三个注册中心(将8763端口的注册中心往8761和8762端口的注册中心进行注册)
# Eureka Server端口号 默认端口号8761
server.port=8761
# 指定服务名称 注意:服务名不能出现下划线 默认服务命不区分大小写 推荐服务名大写
spring.application.name=EUREKASERVER
# eureka server的服务注册中心的地址 暴露服务地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka
# 关闭eureka client的立即注册
eureka.client.fetch-registry=false
# 让当前应用仅仅是一个服务注册中心
eureka.client.register-with-eureka=false
#关闭自我保护
eureka.server.enable-self-preservation=false
#超时3s自动清除
eureka.server.eviction-interval-timer-in-ms=3000
分别启动三个服务注册中心
然后在客户端中指定服务注册中心的地址
由于我们是三个注册中心组成的集群,会依次按照顺序去注册,如果8761没有注册成功,就会去尝试到8762,8763进行注册,以此类推,直到注册成功。
5.4 注册成功后在注册中心查找注册的服务
我们分别访问注册中心集群的三个节点查看注册的服务
8761端口的注册中心
8762端口的注册中心
8763端口的注册中心
至此,我们完成了Eureka注册中心集群的搭建。
- 点赞
- 收藏
- 关注作者
评论(0)