1.Eureka 实例注册状态保持 STARTING 的源码问题排查
2.Error creating bean with name 'traceFilterRegistration' defined in class path resource
Eureka 实例注册状态保持 STARTING 的问题排查
真实生产环境案例中,实例启动并正常运行,源码但在注册中心的源码状态持续显示为“STARTING”,而本地状态显示为“UP”。源码这导致服务的源码消费方无法发现可用实例。这种情况虽然出现概率极低,源码linux plc源码但在运行一年后首次出现,源码建议采取多实例运行以避免类似问题。源码下文提出了解决方案,源码若不需详细分析过程,源码可直接跳至最后。源码
环境配置包括eureka-client版本1.7.2、源码spring-boot版本1.5..RELEASE以及spring-cloud版本Edgware.SR3。源码有线新闻源码
问题重现涉及使用Btrace工具来重现情况,源码通过观察主线程在更新实例本地状态(从“STARTING”变为“UP”)前是源码否等待心跳线程完成第一次心跳并尝试注册实例。获取到的状态显示为“STARTING”。主线程更新状态后触发一系列事件。
Btrace脚本用于分析服务实例注册过程。
服务实例注册逻辑分析如下:
实例信息通过`InstanceInfoFactory#create()`方法初始化时,源码时代面试实例状态默认设置为“STARTING”。
在真正进行服务实例注册的逻辑中,主动注册和被动注册的实现分别通过`EurekaAutoServiceRegistration`和`DiscoveryClient`方法完成。主动注册逻辑涉及`EurekaClientAutoConfiguration`中`eurekaAutoServiceRegistration()`的实例化,以及`EurekaAutoServiceRegistration#start()`方法将EurekaRegistration注册给`EurekaServiceRegistry`。被动注册逻辑则涉及`DiscoveryClient#register()`方法的赞赏系统源码调用,由`EurekaServiceRegistry#register()`触发,包括状态监听器的实现和实例状态的更新。
实例注册过程中涉及的线程包括`InstanceInfoReplicator`和`HeartbeatThread`,它们负责更新状态和上报实例状态。若心跳请求结果为,则会发起注册操作。NG源码授权状态检查由`HealthCheckHandler`完成,实例状态默认为“STARTING”。
问题分析涉及TCP抓包、堆信息以及注册中心实例信息,显示本地状态与注册中心状态不一致,问题出在`lastDirtyTimestamp`未更新,导致注册中心状态未更新。服务端处理逻辑中,如果请求中的`lastDirtyTimestamp`与当前保存的实例信息相同,则直接返回`OK`,不更新注册中心实例状态。
此问题归因于应用启动过程中两个线程同时触发注册动作,序列化过程导致状态与`lastDirtyTimestamp`获取非原子操作,极端情况下可能导致注册中心状态被覆盖。后续心跳请求虽更新状态至“UP”,但不会更新注册中心状态。
解决策略在于修改`EurekaJacksonCodec$InstanceInfoSerializer#serialize()`方法,确保`#autoMarshalEligible()`调用发生在`jgen.writeStartObject()`之后,确保状态与`lastDirtyTimestamp`获取顺序正确,避免状态与实际不符。此解决方案已提交并合并,但未确定1.7.x版本的发布时间。
Error creating bean with name 'traceFilterRegistration' defined in class path resource
Error creating bean with name 'traceFilterRegistration' defined in class path resource [org/springframework/cloud/netflix/eureka/server/EurekaServerAutoConfiguration.class]
åå springboot åspingclould çæ¬ä¸å¹é 导è´ï¼
parentï¼ éç¨äºä¸ä¸ªçæ¬ï¼å é¨åéæ°éç¨äºå¦ä¸ä¸ªçæ¬