【现象】
程序运行报错如下:
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原理进行分析了,贴图一张供大家参考(有兴趣的自行调试代码)