如何完全剔除对Eureka的依赖,报错Cannot execute request on any known server

发布于:2025-02-11 ⋅ 阅读:(49) ⋅ 点赞:(0)

【现象】

程序运行报错如下:

com.netflix.discovery.shared.transport.TransportException报错Cannot execute request on any known server

【解决方案】

(1)在Maven工程中的pom去掉Eureka相关的引用(注释以下部分)

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-eureka</artifactId>

</dependency>

(2)在工程中搜索,org.springframework.cloud.netflix.eureka相关的import引用

(3)服务器上,打包的jar或者在lib/等目录下,删除如下jar包(否则还是会一直打印错误日志,具体原因参见原因分析)

spring-cloud-starter-netflix-eureka.xxxxxx.jar

spring-cloud-netflix-eureka-client.xxxxxx.jar

【原因分析】

主要分析一下Eureka是如何注册成为Spring中Bean的,在Spring中会调用finishRefresh()方法,代码如下:

protected void finishRefresh() {

  // Clear context-level resource caches (such as ASM metadata from scanning).
   //清空缓存
  clearResourceCaches();

  // Initialize lifecycle processor for this context.
   //初始化一个LifecycleProcessor,在Spring启动的时候启动bean,在spring结束的时候销毁bean
  initLifecycleProcessor();

  // Propagate refresh to lifecycle processor first.
    //调用LifecycleProcessor的onRefresh方法,启动实现了Lifecycle接口的bean
  getLifecycleProcessor().onRefresh();

  // Publish the final event.
   //发布ContextRefreshedEvent
  publishEvent(new ContextRefreshedEvent(this));

  // Participate in LiveBeansView MBean, if active.
   //注册MBean,通过JMX进行监控和管理
  LiveBeansView.registerApplicationContext(this);
}

        重点关注 getLifecycleProcessor().onRefresh() ,它是调用生命周期处理器的onrefresh方法,找到SmartLifecycle接口的所有实现类并调用start方法。
  其调用链路为:DefaultLifecycleProcessor.startBean -> start() -> doStart() -> bean.start()

        而Eureka中,正是利用这个机制,而对应的类就是 EurekaAutoServiceRegistration(在spring-cloud-starter-netflix-eureka.xxxxxx.jar里),就实现了 SmartLifeCycle,服务注册自动配置类。

        此处就不对Eureka原理进行分析了,贴图一张供大家参考(有兴趣的自行调试代码)


网站公告

今日签到

点亮在社区的每一天
去签到