https://blog.csdn.net/u011531425/article/details/81675289
在之前的Spring Cloud Config的基礎上,搭建簡單的Eureka Server
沒有代碼,很多試驗做不起來,我們先創建個Eureka Server再說。
本篇主要講如何創建Eureka Server和Eureka Client,還有個重點是通過源碼分析Eureka Client是如何自動啟動的。
創建Eureka Server
1、通過idea創建Eureka Server
通過Spring Initializr創建,選擇Web和Cloud Discovery里面的Eureka Server
使用intellij創建spring boot項目的時候,選擇Cloud Discovery下面Eureka有兩個選項,Eureka Server和Eureka Discovery。一個是Eureka Server,一個是Eureka Client。
查看生成的pom,區別就在引入的jar包不同,一個是spring-cloud-starter-netflix-eureka-client,一個是spring-cloud-starter-netflix-eureka-server。netflix的starter幾經修改,變成了現在的樣子,大家在網上看一些老的帖子,有可能那時候的pom.xml中的dependency和現在是不一樣的。
2、配置eureka server
server application.yml配置文件
spring:
application:
name: eureka-server
server:
#指定服務端口
port: 8761
eureka:
#指定主機名稱
instance:
hostname: localhost
#server一定程度上也是client,互為client,
client:
#由於自己就是服務器,不需要注冊到自己
register-with-eureka: false
#由於自己就是服務器,不需要從服務器獲取注冊信息
fetch-registry: false
#服務地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
3、在啟動類上添加@EnableEurekaServer
4、啟動項目,輸入localhost:8761 看一下效果先
5、我們先創建完客戶端,配置完客戶端,再來看配置項的意義
創建Eureka Client
1、添加依賴項,使項目成為Eureka Client
從idea創建時,Eureka client使用Eureka Discovery創建,會自動添加依賴項。我們不新建,把之前的Config Client項目增加Eureka Client依賴,到maven repository那些網站搜spring eureka client,就能找到依賴的xml,注意不要弄成spring boot的starter,是spring cloud的,貼到之前的配置客戶端中。
<!-- Eureka Client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、Eureka Client會在項目啟動時自動啟動,不像Server需要添加什么@EnableEurekaClient之類的
我一開始只添加了這個依賴,其它什么也沒做,沒配置指向eureka server,eureka server都沒啟動。啟動Eureka Client時報錯了,報錯無法連接eureka server。但是項目照樣起了起來,我訪問localhost:8080/hello能成功打印出內容。
說明了幾個問題:
1、eureka client獲取和注冊中心交互是異步線程,不干擾主線程的啟動。這是很合理的設計。
2、然后我把報錯信息清空,發現每30s又會報一次錯。也就是有什么東西30s觸發一次
3、看起來是假設引入了jar包,就會有個線程自動啟動,嘗試用某個默認的連接去與“注冊中心”通信。假設通信失敗,30s會再次心跳一次。我們去看源碼到底特么哪里“自動”啟動了。
4、根據報錯信息的最開始的堆棧信息查看源碼,注意要從一開始啟動的報錯信息開始找。后面30s一次的報錯信息,是已經開啟了心跳之后的。看這個之前又得補習spring容器的知識(龐大的知識),可以先搜一下LifecycleProcessor這個接口的作用。
從這里看,后面的再底層的我們不管,上層會觸發DefaultLifecycleProcessor這個類的onRefresh方法,DefaultLifecycleProcessor(默認生命周期處理器)繼承自接口LifecycleProcessor。Spring容器加載完一個bea后,如果bean實現了LifecycleProcessor接口,會判斷bean實現的isAutoStartUp方法的返回值是true返回false,這個方法默認為false。如果我們修改為return true,會執行start()方法,我們可以在start()方法中做一些額外的工作,我后面打算總結一篇關於LifecycleProcessor的文章。
而EurekaAutoServiceRegistration就繼承了這么個接口,並且也將isAutoStartUp方法實現為return true,所以會執行它的start()方法
然后一直往上找,最終會找到new DiscoveryClient的地方
調用DiscoveryClient的構造函數,這個構造函數,里面有句this.initScheduledTasks(); 。這名字,你懂的。追代碼會發現initScheduledTasks()這個方法會根據shouldFecthRegistry和shouldRegisterWithEureka這兩個配置決定是否開啟兩個TimedSupervisorTask。這個方法先不繼續追下去,總之,會開啟調度方法,根據配置的刷新時間,如果沒有默認值30S,去配置的配置中心拿數據。如果配置中心連接不上,報錯連接不上unknown server
5、因為獲取注冊信息的task會一直重復,假設注冊中心某個時間掛掉,或者沒有事先啟動,客戶端會在服務中心重新活躍之后和注冊中心進行交互。
至此明白了為什么只要加了Eureka Client的依賴項,引入了jar包,就會默認啟動,以及稍微了解了啟動的一些機制。下面我們來點正常操作,先把Eureka Server啟動起來,然后配置一下客戶端。
3、配置Eureka Client
application.yml 配置
在原來的配置里添加eureka的配置
spring:
application:
name: springcloudweb
cloud:
config:
#指定配置服務中心地址
uri: http://localhost:8888/
profile: dev
server:
port: 8080
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:8761/eureka/
上面也說過Eureka的啟動是通過類集成LifeCycle來自啟動的,所以不需要像Config Server一樣,需要加注解。
添加完刷新Eureka界面。會發現已經注冊上去了
然后頁面上會有DS Replicas,由於我們是standalone的server,所以這里是空的,還有各種信息,這些我們先不管,慢慢都會涉及到。
后來我再看spring文檔中的eureka部分,里面其實講到了在Eureka Client中引入jar包就會在啟動時自動嘗試往Eureka Server注冊的事情,但是只一筆帶過,太容易被忽略,並且也沒講原理,我喜歡先讀一遍文檔了解大概,再實踐踩坑,再去研讀理論。。。
好了,主要就先將Eureka Client如何自動啟動的,太多容易消化不良。
---------------------
作者:今夕何夕_1988
來源:CSDN
原文:https://blog.csdn.net/u011531425/article/details/81675289
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!