服务注册中心-Eureka
所谓服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。
demo地址
什么是服务注册中心
- 可以对所有的微服务的信息进行存储,如微服务的名称、IP、端口等
- 可以在进行服务调用时通过服务发现查询可用的微服务列表及网络地址进行服务调用
- 可以对所有的微服务进行心跳检测,如发现某实例长时间无法访问,就会从服务注册表移除该实例。
常用的注册中心
springcloud支持的多种注册中心 Eureka(netflix)、Consul(Go)、Zookeeper(java)、以及阿里巴巴推出Nacos(java阿里巴巴)。这些注册中心在本质上都是用来管理服务的注册和发现以及服务状态的检查的。
Eureka
- 简介
- github.com/Netflix/eur...
- Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务注册和发现功能。
Eureka包含两个组件:
Eureka Server
和Eureka Client
。
开发Eureka Server
细节 :在微服务架构中服务名称代表服务唯一标识, 至关重要, 服务名称必须唯一 使用时必须通过如下配置指定服务名称
spring.application.name=EUREKASERVER 推荐服务名称大写 注意:服务名不能出现下划线_
- 创建项目并引入eureka server依赖
java
<!--引入 eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 编写配置application.properties
java
server.port=8761 #执行服务端口
# 指定服务名称 注意:服务名不能出现下划线 默认服务名不区分大小写 推荐服务名大写
spring.application.name=EUREKASERVER
# eureka server服务注册中心地址 暴露服务地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
- 开启Eureka Server,入口类加入注解
java
@SpringBootApplication
@EnableEurekaServer
public class Eurekaserver8761Application {
public static void main(String[] args) {
SpringApplication.run(Eurekaserver8761Application.class, args);
}
}
- 访问Eureka的服务注册页面
- 虽然能看到管理界面为什么项目启动控制台报错?
- 出现上述问题原因: eureka组件包含 eurekaserver 和 eurekaclient。
server是一个服务注册中心, 用来接受客户端的注册。
client的特性会让当前启动的服务把自己作为eureka的客户端进行服务中心的注册, 当项目启动时服务注册中心还没有创建好, 所以找我不到服务的客户端组件就直接报错了,当启动成功服务注册中心创建好了,日后client也能进行注册,就不再报错啦!
出错解释:enreka 含有两个组件 eureka serve、eureka client组件,当项目中引用eurekaServe时,这个组件同时将eurekaClient 引入到项目中, 因此启动时既会将自己作为一个服务中心启动, 同时也会将自己作为服务客户端进行注册, 默认启动时立即注册, 注册时服务还没有准备完成,因此会出现当前错误。
注意:在微服务架构中服务名称代表服务唯一标识,至关重要,服务名称必须唯一,使用时必须通过如下配置指定服务名 spring.application.name=EUREKASERVER 推荐服务名称大写
注意:服务名不能出现下划线_
- 关闭Eureka自己注册自己
java
server.port=8761
spring.application.name=eurekaserver
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
eureka.client.register-with-eureka=false #不再将自己同时作为客户端进行注册
eureka.client.fetch-registry=false #关闭作为客户端时从eureka server获取服务信息
- 再次启动, 当前应用就是一个单纯Eureka Server, 控制器也不再报错
开发Eureka Client
开发eureka client 就是日后基于业务拆分出来一个个微服务
- 创建项目并引入eureka client依赖
java
<!--引入eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 编写配置application.properties
java
server.port=8888 #服务端口号
spring.application.name=eurekaclient8888 #服务名称唯一标识
eureka.client.service-url.defaultZone=http://localhost:8761/eureka #eureka注册中心地址
- 开启eureka客户端加入注解
java
@SpringBootApplication
@EnableEurekaClient
public class EurekaclientApplication {
public static void main(String[] args) {
SpringApplication.run(Eurekaclient8888Application.class, args);
}
}
-
启动之前的8761的服务注册中心, 在启动eureka客户端服务
-
查看eureka server的服务注册情况
eureka自我保护机制
注意: 自我保护机制默认是开启的
现象:在自我保护模式下,eureka服务器将停止逐出所有实例。
机制:这样做是为了确保灾难性的网络事件不会清除eureka注册表数据,并将其传播到下游的所有客户端
触发自我保护机制,什么时候将客户端在服务注册中清除:
-
心跳的次数高于预期阈值
-
它看到的心跳更新次数重新高于预期阈值,或者自我保护被禁用
-
服务频繁启动时 EurekaServer出现错误
- 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.
- 自我保护机制 (self Preservation Mode)
注意: 自我保护机制默认是开启的
现象: 在自我保护模式下,eureka服务器将停止逐出所有实例。
机制: 这样做是为了确保灾难性的网络事件不会清除eureka注册表数据,并将其传播到下游的所有客户端 触发自我保护机制,什么时候客户端在服务器注册中清除:
- 心跳的次数高于预期阈值
- 自我保护被禁用
- eureka server关闭自我保护机制
ini
#用来修改eureka server默认接受心跳的最大时间 默认是90s
eureka.instance.lease-expiration-duration-in-seconds=10
#指定客户端多久向eureka server发送一次心跳 默认是30s
eureka.instance.lease-renewal-interval-in-seconds=5
- 官网地址: github.com/Netflix/eur...
- 默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。
- 但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。
Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。
这种设计的哲学原理就是"宁可信其有不可信其无!"。
自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
即使关闭了自我保护,也不会立即宕机,还有个超时时间,超时时间默认是60*1000 1分钟
- 在eureka server端关闭自我保护机制
java
eureka.server.enable-self-preservation=false #关闭自我保护
eureka.server.eviction-interval-timer-in-ms=3000 #超时3s自动清除 ,默认是60*1000 1分钟
即使关闭自我保护在宕机时也不会立即生效,还有个超时时间。 等心跳比例低于85%后才会3s清除,周期达不到也不会清
- 微服务(客户端)修改减短服务心跳的时间
java
eureka.instance.lease-expiration-duration-in-seconds=10 #用来修改eureka server默认接受心跳的最大时间 默认是90s,一组90s。15min*60/90=10组,每组90/30=3次心跳,总的15min,30次心跳,30*85%=25.5,26个心跳都失败
eureka.instance.lease-renewal-interval-in-seconds=5 #指定客户端多久向eureka server发送一次心跳 默认是30s
- 尽管如此关闭自我保护机制还是会出现警告
- THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
官方并不建议在生产情况下关闭
eureka 停止更新
官方停止更新说明
- github.com/Netflix/eur...
- 在1.x版本项目还是活跃的, 但是在2.x版本中停止维护, 出现问题后果自负!!!
eureka server集群搭建
完全集群
a. 创建3个springboot项目
b. 引入eureka server依赖
c. 配置文件application.properties
node1: server.port=8761
http://localhost:8762/eureka,http://localhost:8763/eureka
node2: server.port=8762
http://localhost:8761/eureka,http://localhost:8763/eureka
node3: server.port=8763
http://localhost:8761/eureka,http://localhost:8762/eureka
在这里配置端口,能把配置文件中的端口覆盖掉
服务端8761向 8762 或 8763注册
客户端把集群都写上,在启动时会随机选择一台可用的eurekaServer进行注册
客户端(微服务 )集群
同一个集群的特点是服务名字一定是一样的
只改端口号:
注意:springboot服务集群,集群名字一定是一样的,只是端口不同