【现象】
程序运行报错如下:
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结束的时候销毁beaninitLifecycleProcessor();// Propagate refresh to lifecycle processor first.//调用LifecycleProcessor的onRefresh方法,启动实现了Lifecycle接口的beangetLifecycleProcessor().onRefresh();// Publish the final event.//发布ContextRefreshedEventpublishEvent(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原理进行分析了,贴图一张供大家参考(有兴趣的自行调试代码)