架構師入門:搭建雙注冊中心的高可用Eureka架構(基於項目實戰)


    本文的案例是基於 架構師入門:搭建基本的Eureka架構(從項目里抽取 改寫的。

    在上文里,我們演示Eureka客戶端調用服務的整個流程,在這部分里我們將在架構上有所改進。大家可以想象下,在上文里案例中,Eureka注冊中心只部署在一台機器上,這樣它一旦出現問題,會導致整個服務調用系統的崩潰,如果這種情況發生在生產環境上,后果是不堪設想的。

    大家別以為這是危言聳聽,在高並發的場景下(比如雙十一的並發環境),這種情況發生的可能性不低。針對這種場景,這里我們將部署兩台Eureka注冊中心,彼此相互注冊,以此搭建一個可用性比較高的Eureka集群。

    

1 集群的示意圖

    在這個集群里,我們將配置2台相互注冊的Eureka服務器,這樣一來,每台服務器都包含着對方的服務注冊信息,相當於雙機熱備,同時,服務提供者只需向其中的一個注冊服務。

    

    這樣,如果服務器A或B宕機,那么另一台服務器依然可以向外部提供服務列表,服務調用者依然可以據此調用服務。

    在並發要求更高的環境里,我們甚至可以搭建2台以上的服務器,不過事實上,雙機熱備的集群能滿足大多數的場景,一方面,不是每個系統的並發量都很高,所以雙機熱備足以滿足大多數的並發需求,另一方面,畢竟兩台服務器同時宕機的可能性也不大。    

2編寫相互注冊的服務器端代碼

    這里為了演示方便,我們在一台機器上模擬雙服務器的場景,在真實項目里,我們一般是把兩個相互注冊的服務器安裝在兩台主機上,因為如果只安裝在一台上,那么該服務器發生故障的話,兩個服務器都會失效。具體的實現步驟如下。

    第一步,到C:\WINDOWS\system32\drivers\etc目錄里,找到hosts文件,在其中加入兩個機器名(其實都是指向本機),代碼如下。修改后,需要重啟機器。

          127.0.0.1       ekServer1

          127.0.0.1       ekServer2

    第二步,創建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注冊。結合上文,至此我們實現了雙服務器之間的相互注冊。    

3 服務提供者只需向其中一台服務器注冊

    雖然在集群里搭建了兩台服務器,但服務提供者只需向其中的一台注冊即可,否則高可用的便利性就會以犧牲代碼可維護性為代價了。

    這里我們是在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上。   

4修改服務調用者的代碼

     我們把服務調用者的代碼放入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)注冊。

5正常場景下的運行效果

    按如下次序啟動四個項目的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來查看運行效果。 

6 一台服務器宕機后的運行效果

    這里我們可以故意關閉ek-cluster-server服務,以此來模擬一台服務器宕機的情況。

    關閉后,我們在瀏覽器里輸入http://ekserver1:8080/hello,雖然我們在服務提供者和服務調用者的application.yml里指定的serviceUrl.defaultZone都是http://ekServer1:8888/eureka/,但在一台Eureka服務器失效的情況下,我們依然能看到正確的結果,如下圖所示。

    

    如果我們在剛才關閉的是ek-cluster-server-backup,讓ek-cluster-server運行,這里我們還是能看到同樣的效果。也就是說,在這個Eureka雙服務器的集群里,一台服務器宕機后,整個服務體系依然可用,這就大大提升的系統的可用性。

 

7 尋求大牛幫助

    本人在寫完java web輕量級開發面試教程后,再想寫一本Spring Cloud方面的書,請各位大神告訴我該寫哪些方面的內容,或者是提些建議,謝謝了。

8 本文代碼和版權聲明

    如果大家想要本案例中代碼,請給我站內留言。

    本人保留本文中文字和代碼的版權,轉載請注明出處。

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM