【現象】
程序運行報錯如下:
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原理進行分析了,貼圖一張供大家參考(有興趣的自行調試代碼)