springcloud组件
一、Eureka注册中心
Eureka负责管理记录服务提供者的信息。服务调用者无需自己寻找服务。Eureka自动匹配服务给调用者。
Eureka与服务之间通过心跳机制进行监控。
服务治理的过程:
- Eureka Client 向Eureka注册中心注册自己的信息
- Eureka Client 从Eureka注册中心获取注册表信息,并将其缓存在本地(Service Consumer为了避免每次调用服务请求都需要向Eureka Server获取服务实例的注册信息,此时需要设置eureka.client.fetchRegistry=true,它会在本地缓存所有实例注册信息。为了保证缓存数据的有效性,它会定时(值由eureka.client.registry-fetch-interval-seconds定义,默认值为30s)向注册中心拉取更新缓存。)
- 注册中心通过心跳续约来监控服务提供者,就是Eureka Client 每隔30s(默认)定时更新自己状态来表示自己的服务还活着(如果超过30s没有收到心跳续约还不会剔除,如果90s还没有收到服务提供者的心跳续约就会把服务给剔除出去)
- 当 Eureka Client 从注册中心获取到服务提供者信息后,就可以通过 Http 请求调用对应的服务;服务提供者有多个时,Eureka Client 客户端会通过 Ribbon 自动进行负载均衡
- Eureka会统计服务实例最近15分钟心跳续约的比例是否低于85%,如果低于则会触发自我保护机制,自我保护机制下不会剔除任何服务
Eureka Server 进入自我保护机制,会出现以下几种情况:
(1 Eureka 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
(2 Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
(3 当网络稳定时,当前实例新的注册信息会被同步到其它节点中
Eureka 自我保护机制是为了防止误杀服务而提供的一个机制。当个别客户端出现心跳失联时,则认为是客户端的问题,剔除掉客户端;当 Eureka 捕获到大量的心跳失败时,则认为可能是网络问题,进入自我保护机制;当客户端心跳恢复时,Eureka 会自动退出自我保护机制。
1.0、Eureka注册中心
server:
port: 18081
eureka:
client:
fetch-registry: false #是否定期拉取服务列表信息
register-with-eureka: false #将自己注册到注册中心去
service-url:
defaultZone: http://localhost:18081/eureka
server:
eviction-interval-timer-in-ms: 5000 #多久检测一次失效的服务,并剔除
enable-self-preservation: false #关闭自我保护机制
spring:
application:
name: eureka-server
1.1、服务提供者
eureka:
client:
fetch-registry: true #是否定期拉取服务列表信息
register-with-eureka: true #将自己注册到注册中心去
service-url:
defaultZone: http://localhost:7001/eureka
instance:
#租约到期,服务时效时间,默认值90秒
lease-expiration-duration-in-seconds: 90
#租约续约间隔时间,默认30秒
lease-renewal-interval-in-seconds: 30
prefer-ip-address: true
1.2、服务消费者
eureka:
client:
fetch-registry: true #是否定期拉取服务列表信息
# 设置服务消费者从注册中心拉取服务列表的间隔
registry-fetch-interval-seconds: 30
register-with-eureka: true #将自己注册到注册中心去
service-url:
defaultZone: http://localhost:7001/eureka
instance:
prefer-ip-address: true
在服务消费者yml加上后
instance:
prefer-ip-address: true # 将自己的ip注册到Eureka Server上 如果不配置该属性 则默认为false且表示注册微服务所在操作系统的主机名到Eureka Server而不是ip地址
不生效????
二、Eureka 集群原理
erurak:集群,各个节点的数据一致,各个节点都属于同等级别的注册中心,不存在leader的概念。
zookeeper:Zookeeper集群存在Leader节点,并且会进行Leader选举,Leader具有最高权限。
不是集群时配置:
server:
port: 7001
spring:
application:
name: eureka-server
eureka:
client:
fetch-registry: false #是否定期拉取服务列表信息
register-with-eureka: false #将自己注册到注册中心去
service-url:
defaultZone: http://localhost:7001/eureka
server:
eviction-interval-timer-in-ms: 5000 #多久检测一次失效的服务,并剔除
enable-self-preservation: false #关闭自我保护机制
集群的配置:
本地电脑配置主机ip地址跟主机名映射
节点1:eureka-server01
server:
port: 2001 #端口号
spring:
application:
name: eureka-server01 # 应用名称,会在Eureka中作为服务的id标识(serviceId)
#profiles:
#active: dev
eureka:
instance:
hostname: eureka-server01
server:
enable-self-preservation: false #关闭自我保护机制
client:
register-with-eureka: false #是否将自己注册到Eureka中
fetch-registry: false #是否从eureka中获取服务信息
service-url:
defaultZone: http://eureka-server02:2002/eureka/,http://eureka-server03:2003/eureka/ # EurekaServer的地址 搭集群就是eureka相互注册,并且配置另外eurek地址
节点2:eureka-server02
server:
port: 2002 #端口号
spring:
application:
name: eureka-server02 # 应用名称,会在Eureka中作为服务的id标识(serviceId)
#profiles:
#active: dev
eureka:
instance:
hostname: eureka-server02
server:
enable-self-preservation: false #关闭自我保护机制
client:
register-with-eureka: false #是否将自己注册到Eureka中
fetch-registry: false #是否从eureka中获取服务信息
service-url:
defaultZone: http://eureka-server01:2001/eureka/,http://eureka-server03:2003/eureka/
节点3:eureka-server03
server:
port: 2003 #端口号
spring:
application:
name: eureka-server03 # 应用名称,会在Eureka中作为服务的id标识(serviceId)
#profiles:
#active: dev
eureka:
instance:
hostname: eureka-server03
server:
enable-self-preservation: false #关闭自我保护机制
client:
register-with-eureka: false #是否将自己注册到Eureka中
fetch-registry: false #是否从eureka中获取服务信息
service-url:
defaultZone: http://eureka-server01:2001/eureka/,http://eureka-server02:2002/eureka/
微服务注册到Eureka集群中:
server:
port: 18085
spring:
application:
name: transactional
eureka:
client:
service-url:
defaultZone: http://eureka-server01:2001/eureka/ #
instance:
prefer-ip-address: true #访问服务的时候,推荐使用IP(
可以看到注册到eureka-server01中,但是在三个注册中心都有微服务transactional的信息,说明注册中心集群是会同步的