JAVA开发(分布式部署微服务注册到Eureka出现registration status: 204错误)

问题背景:

将服务注册到多个Eureka出现有点的服务只注册到一个Eureka有点的服务可以注册到多个Eureka的问题,有的注册不上,报错:registration status: 204

Eureka界面:

Eureka1:

Eureka2:

 从截图可以看出有两台服务器上的HN-BASE-ADMIN 和HN-BLOCKCHAIN-BUSINESS都可以注册到Eureka1

HN-BASE-GATEWAY分别都只有一台服务器上的微服务注册成功。

日志报错::registration status: 204

我们先了解Eureka的工作原理:

 简要介绍:

Eureka 是 Netflix 出品的用于实现服务注册和发现的工具,Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现
Eureka采用C-S的设计架构,包含Eureka Server 和Eureka Client两个组件

基本工作原理:

Applecation-server :服务提供者
Application-cliene:服务消费者
服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

1.服务注册(register):Eureka Client会通过发送REST请求的方式,向Eureka Server注册自己的服务。注册时,提供自身的元数据,比如ip地址、端口、运行状况指标、主页地址等信息。Eureka Server接收到注册请求后,就会把这些元数据信息存储在一个双层的Map中。什么时候注册?在启动微服务的时候。

2.服务续约(renew):在服务注册后,Eureka Client会维护一个心跳来持续通知Eureka Server,说明服务一直处于可用状态,防止被剔除。默认每隔30秒eureka.instance.lease-renewal-interval-in-seconds 发送一次心跳来进行服务续约。

3.获取服务列表(get registry):服务消费者(Eureka Client)在启动的时候,会发送一个REST请求给Eureka Server,获取注册中心的服务清单,并且缓存在客户端本地。同时,为了性能及安全性考虑,Eureka Server会每隔30秒更新一次缓存中的服务清单。

4.服务调用:服务消费者在获取到服务清单后,可以根据清单中的服务信息,查找到该服务的地址,从而进行访问(远程调用)。

6.服务下线(cancel):当Eureka Client需要关闭或重启时,就不希望在这个时间段内再有请求进来,所以,就需要提前先发送REST请求给EurekaServer,告诉Eureka Server自己要下线了,Eureka Server在收到请求后,就会把该服务状态置为下线(DOWN),并把该下线事件传播出去。

7.失效剔除(evict):服务实例可能会因为网络故障等原因,导致不能提供服务,而此时该实例也没有发送请求给Eureka Server来进行服务下线。所以,还需要有服务剔除的机制。Eureka Server在启动的时候会创建一个定时任务,每隔一段时间(默认60秒),从当前服务清单中把超时没有续约(默认90秒eureka.instance.lease-expiration-duration-inseconds)的服务剔除。

服务端配置:

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://eureka1.com:7002/eureka/,http://eureka2.com:7003/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。

单机模式配置:

#--------------------------单机模式--------------------------#
#eureka:
#  instance:
#    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
#    prefer-ip-address: true
#    ip-address: localhost
#    #服务续约(renew)的间隔,默认为30秒
#    lease-renewal-interval-in-seconds: 30
#    #服务失效时间
#    lease-expiration-duration-in-seconds: 90
#  server:
#    # 设置eureka是否启动自我保护   true指开启eureka的自我保护   false指关闭eureka的自我保护
#    # 如果关闭eureka的自我保护,则不可用的服务会被及时剔除掉
#    enable-self-preservation: false
#    # 剔除服务的时间间隔毫秒数(单位:毫秒)  扫描失效服务的时间间隔(默认是60*1000 即60秒)
#    eviction-interval-timer-in-ms: 5000
#
#  client:
#    register-with-eureka: false # 表示是否向Eureka注册中心注册自己
#    fetch-registry: false # 如果为false 则表示自己为注册中心
#    service-url:
#      defaultZone: http://localhost:8762/eureka/

集群模式模式配置:

#--------------------------集群模式--------------------------#
eureka:
  instance:
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    prefer-ip-address: true
    ip-address: 10.13.10.6
    #服务续约(renew)的间隔,默认为30秒
    lease-renewal-interval-in-seconds: 30
    #服务失效时间
    lease-expiration-duration-in-seconds: 60
  server:
    # 设置eureka是否启动自我保护   true指开启eureka的自我保护   false指关闭eureka的自我保护
    # 如果关闭eureka的自我保护,则不可用的服务会被及时剔除掉
    enable-self-preservation: false
    # 剔除服务的时间间隔毫秒数(单位:毫秒)  扫描失效服务的时间间隔(默认是60*1000 即60秒)
    eviction-interval-timer-in-ms: 5000

  client:
    register-with-eureka: true # 表示是否向Eureka注册中心注册自己
    fetch-registry: true # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: ${app.eureka.defaultZone} #注册的注册中心集群配置

其中{app.eureka.defaultZone} 通过外部配置注入,这个的配置需要指定IP,最好不要用hosts映射域名。

如:

http://eureka1:8761/eureka/,http://eureka2:8761/eureka/

应该直接指定域名:

http://10.13.13.8:8761/eureka/,http://10.13.13.7:8761/eureka/

问题解决:

注意!!!!

如果使用域名映射就会出现 registration status: 204,使用http://10.13.13.8:8761/eureka/,http://10.13.13.7:8761/eureka/ 就可以全部注册上了

随便介绍一下eureka与nacos的区别

Nacos与eureka的共同点

都支持服务注册和服务拉取

都支持服务提供者心跳方式做健康检测

Nacos与Eureka的区别

Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式

临时实例心跳不正常会被剔除,非临时实例则不会被剔除

Nacos支持服务列表变更的消息推送模式,服务列表更新更及时

Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

1、范围不同。

Nacos的阈值是针对某个具体Service的,而不是针对所有服务的;但Eureka的自我保护阈值是针对所有服务的。nacos支持CP和AP两种;eureka只支持AP。nacos使用netty,是长连接;eureka是短连接,定时发送

2、保护方式不同。

Eureka保护方式:当在短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。自我保护开关(eureka.server.enable-self-preservation: false)。

Nacos保护方式:当域名健康实例(Instance)占总服务实例(Instance)的比例小于阈值时,无论实例(Instance)是否健康,都会将这个实例(Instance)返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例(Instance)能正常工作。

3、连接方式不同。

nacos支持动态刷新,在控制器(controller)上加@RefreshScope注解即可,采用Netty连接,是长连接;eureka本身不支持动态刷新,需要配合MQ完成动态刷新,且是短连接,是定时发送。

Nacos中的CAP模式切换

Nacos 支持 AP 和 CP 模式的切换,这意味着 Nacos 同时支持两者一致性协议。这样,Nacos能够以一个注册中心管理这些生态的服务。不过在Nacos中,AP模式和CP模式的具体含义,还需要再说明下。

AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。AP 模式是在网络分区下也能够注册实例。在AP模式下也不能编辑服务的元数据等非实例级别的数据,但是允许创建一个默认配置的服务。同时注册实例前不需要进行创建服务的操作,因为这种模式下,服务其实降级成一个简单的字符创标识,不在存储任何属性,会在注册实例的时候自动创建。

CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,因此网络分区下不能够注册实例,在网络正常情况下,可以编辑服务器别的配置。改模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

MIXED 模式可能是一种比较让人迷惑的模式,这种模式的设立主要是为了能够同时支持临时实例和持久化实例的注册。这种模式下,注册实例之前必须创建服务,在服务已经存在的前提下,临时实例可以在网络分区的情况下进行注册。

猜你喜欢

转载自blog.csdn.net/dongjing991/article/details/131189429