本文的案例是基於 架構師入門:搭建基本的Eureka架構(從項目裏抽取) 改寫的。html
在上文裏,咱們演示Eureka客戶端調用服務的整個流程,在這部分裏咱們將在架構上有所改進。你們能夠想象下,在上文裏案例中,Eureka註冊中心只部署在一臺機器上,這樣它一旦出現問題,會致使整個服務調用系統的崩潰,若是這種狀況發生在生產環境上,後果是不堪設想的。java
你們別覺得這是危言聳聽,在高併發的場景下(好比雙十一的併發環境),這種狀況發生的可能性不低。針對這種場景,這裏咱們將部署兩臺Eureka註冊中心,彼此相互註冊,以此搭建一個可用性比較高的Eureka集羣。web
在這個集羣裏,咱們將配置2臺相互註冊的Eureka服務器,這樣一來,每臺服務器都包含着對方的服務註冊信息,至關於雙機熱備,同時,服務提供者只需向其中的一個註冊服務。面試
這樣,若是服務器A或B宕機,那麼另外一臺服務器依然能夠向外部提供服務列表,服務調用者依然能夠據此調用服務。spring
在併發要求更高的環境裏,咱們甚至能夠搭建2臺以上的服務器,不過事實上,雙機熱備的集羣能知足大多數的場景,一方面,不是每一個系統的併發量都很高,因此雙機熱備足以知足大多數的併發需求,另外一方面,畢竟兩臺服務器同時宕機的可能性也不大。 瀏覽器
這裏爲了演示方便,咱們在一臺機器上模擬雙服務器的場景,在真實項目裏,咱們通常是把兩個相互註冊的服務器安裝在兩臺主機上,由於若是隻安裝在一臺上,那麼該服務器發生故障的話,兩個服務器都會失效。具體的實現步驟以下。服務器
第一步,到C:\WINDOWS\system32\drivers\etc目錄裏,找到hosts文件,在其中加入兩個機器名(其實都是指向本機),代碼以下。修改後,須要重啓機器。架構
127.0.0.1 ekServer1併發
127.0.0.1 ekServer2app
第二步,建立ek-cluster-server項目,這實際上是根據上文 架構師入門:搭建基本的Eureka架構(從項目裏抽取) 裏的EurekaBasicDemo-Server項目改寫而來,和以前的項目相比,咱們只改動了application.yml文件,代碼以下。
1 server: 2 port: 8888 3 spring: 4 application: 5 name: ekServer1 6 eureka: 7 instance: 8 hostname: ekServer1 9 client: 10 serviceUrl: 11 defaultZone: http://ekServer2:8889/eureka/
這裏的端口號沒變,依然是8888,但咱們在第5行把項目名修改爲ekServer1,在第8行把提供服務的主機名也修改爲ekServer1,在第11行,咱們指定了本服務所在的rul,這裏請注意,咱們把ekServer1所在的serverUrl指定到ekServer2的8889端口上,也就是說,這裏咱們指定ekServer1向ekServer2註冊。
第三步,因爲在真實項目裏,咱們通常會在兩臺主機上啓動兩個Eureka服務,因此這裏咱們再建立一個Maven類型的項目ek-cluster-server-backup,和以前的ek-cluster-server相比,它們的差異仍是在application.yml,代碼以下。
1 server: 2 port: 8889 3 spring: 4 application: 5 name: ekServer2 6 eureka: 7 instance: 8 hostname: ekServer2 9 client: 10 serviceUrl: 11 defaultZone: http://ekServer1:8888/eureka/
這裏的配置信息其實和剛纔的是對偶的,這裏的application名和主機名都叫ekServer2,不過請注意第11行,這裏的serviceUrl是註冊到ekServer1的8888端口上,這裏咱們一樣指定ekServer2向ekServer1註冊。結合上文,至此咱們實現了雙服務器之間的相互註冊。
雖然在集羣裏搭建了兩臺服務器,但服務提供者只需向其中的一臺註冊便可,不然高可用的便利性就會以犧牲代碼可維護性爲代價了。
這裏咱們是在ek-cluster-ServiceProvider項目編寫服務提供程序,它是根據上文架構師入門:搭建基本的Eureka架構(從項目裏抽取)裏的項目EurekaBasicDemo-ServerProvider改寫而來,其中只修改了application.yml部分的代碼。
1 server: 2 port: 1111 3 spring: 4 application: 5 name: sayHello 6 eureka: 7 client: 8 serviceUrl: 9 defaultZone: http://ekServer1:8888/eureka/
咱們只改動了第9行的代碼,這說明本服務是向ekServer1的8888號端口註冊。
因爲這裏兩個Eureka服務器是相互註冊,因此本服務提供者無需同時向兩個服務器註冊,由於一旦向ekServer1註冊後,該服務器會自動把這個服務提供者的信息複製到ekServer2上。
咱們把服務調用者的代碼放入ek-cluster-ServiceCaller這個Maven項目裏,這是根據以前裏的EurekaBasicDemo-ServerCaller項目改寫而來。其中咱們也只修改application.yml代碼。
1 spring: 2 application: 3 name: callHello 4 server: 5 port: 8080 6 eureka: 7 client: 8 serviceUrl: 9 defaultZone: http://ekServer1:8888/eureka/
改動點仍是在第9行上,這裏是向ekServer1服務器的8888號端口註冊,同理,這裏無需向另一個機器(ekServer2)註冊。
按以下次序啓動四個項目的Spring Boot服務。
第一, ek-cluster-server(第一個Eureka服務器)。
第二, ek-cluster-server-backup(第二個Eureka服務器)。
第三, ek-cluster-ServiceProvider(服務提供者)。
第四, ek-cluster-ServiceCaller(服務調用者)。
隨後,你們能在http://ekserver1:8888/和http://ekserver2:8889/這兩個瀏覽器上看到以下圖所示的四個可用的服務。因爲是相互註冊,因此它們的內容是同樣的。
雖然這裏咱們也能夠經過http://localhost:8888/和http://localhost:8889/看到相同的效果,但不推薦。這是由於,在真實的項目裏,Eureka的服務器應該是和開發機器分開的,也就是說它們應該被部署在其它機器上,只不過這裏咱們爲了演示方便,把它們都放在本機。
當咱們確認服務啓動後,能夠在瀏覽器裏輸入http://ekserver1:8080/hello來查看服務調用的效果,這裏其實觸發了ek-cluster-ServiceCaller中Controller裏的hello方法。
和以前同樣,這裏的輸出仍是「In Caller, hello Eureka「,這說明雙機熱備的Eureka架構至少不會影響基本的功能。一樣,這裏不建議經過http://localhost:8080/hello來查看運行效果。
這裏咱們能夠故意關閉ek-cluster-server服務,以此來模擬一臺服務器宕機的狀況。
關閉後,咱們在瀏覽器裏輸入http://ekserver1:8080/hello,雖然咱們在服務提供者和服務調用者的application.yml裏指定的serviceUrl.defaultZone都是http://ekServer1:8888/eureka/,但在一臺Eureka服務器失效的狀況下,咱們依然能看到正確的結果,以下圖所示。
若是咱們在剛纔關閉的是ek-cluster-server-backup,讓ek-cluster-server運行,這裏咱們仍是能看到一樣的效果。也就是說,在這個Eureka雙服務器的集羣裏,一臺服務器宕機後,整個服務體系依然可用,這就大大提高的系統的可用性。
本人在寫完java web輕量級開發面試教程後,再想寫一本Spring Cloud方面的書,請各位大神告訴我該寫哪些方面的內容,或者是提些建議,謝謝了。
若是你們想要本案例中代碼,請給我站內留言。
本人保留本文中文字和代碼的版權,轉載請註明出處。