Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,均可以用Spring Boot的開發風格作到一鍵啓動和部署。Spring Cloud並無重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,經過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分佈式系統開發工具包。java
Eureka是Netflix開源的服務發現組件,自己是基於Rest的服務,它包含服務端和客戶端兩部分;在SpringCloud中將它集成在其中,從而實現了微服務的發現與註冊;
- Eureka的GitHub:https://github.com/Netflix/Eureka
git
Eureka Server
- 服務端-沒有存儲,內存保持,每服務實例須要發送心跳去續約
- 客戶端-在內存中緩存着eureka的註冊信息,所以沒必要每請求到eureka查找服務
- eureka之間會作註冊服務同步,從而保證狀態一致,客戶端只需訪問一個eureka
Service Provider
- 會向Eureka Server作Register(服務註冊)、Renew(服務續約)、Cancel(服務下線)等操做
Service Consumer
- 會向Eureka Server獲取註冊服務列表,並消費服務github
在pom.xml中加入如下依賴:web
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在配置文件application.xml中添加如下配置:spring
server.port=8781 #表示是否將本身註冊在EurekaServer上,默認爲true。因爲當前應用就是EurekaServer,因此置爲false eureka.client.register-with-eureka=false #表示表示是否從EurekaServer獲取註冊信息,默認爲true。單節點不須要同步其餘的EurekaServer節點的數據 eureka.client.fetch-registry=false #設置Eureka的地址 eureka.client.service-url.defaultZone=http://localhost:8781/eureka
添加啓動類,並加上啓動Eureka註解:緩存
@SpringBootApplication @EnableEurekaServer public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
啓動項目,打開http://localhost:8781/,以下:網絡
在pom.xml中加入依賴:架構
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在配置文件application.xml加入要注入的配置中心的url等配置:app
server.port=8782 #對該應用另起別名 spring.application.name=client-8782 #注入目標,配置服務中心url,與服務端的配置保持一致 eureka.client.service-url.defaultZone=http://localhost:8781/eureka/
建立客戶端啓動類ClientApplication.java,並加入客戶端被發現註解:負載均衡
@SpringBootApplication @EnableDiscoveryClient public class ClientApplication { public static void main(String[] args) { SpringApplication.run(ClientApplication.class, args); } }
啓動應用,接着打開以前Eureka的註冊頁面http://localhost:8781/,以下:
發現剛剛啓動的客戶端已經註冊在了服務端了。
當我將客戶端關閉後,再次打開Eureka的註冊頁面,發現有一串紅字:
這是由於Eureka進入了自我保護機制,默認狀況下,若是EurekaServer在必定時間內沒有接收到某個微服務實例的心跳時,EurekaServer將會註銷該實例(默認90s)。可是當網絡發生故障時,微服務與EurekaServer之間沒法通訊,這樣就會很危險了,由於微服務自己是很健康的,此時就不該該註銷這個微服務,而Eureka經過自我保護機制來預防這種狀況,當網絡健康後,該EurekaServer節點就會自動退出自我保護模式;
這時再次將客戶端微服務啓動,刷新服務註冊中心會發現,自我保護狀態已取消。
綜上所述,咱們能夠看出來Eureka的兩個組件EurekaServer和EurekaClient的做用:
綜上,Eureka經過心跳檢查、客戶端緩存等機制,提升了系統的靈活性、可伸縮性和可用性,因此做爲一個微服務架構,須要一個服務註冊中心來統籌管理服務;
複製上面server項目,分別命名:eureka-keepalived-server-1,eureka-keepalived-server2;
複製上面client項目,命名爲:eureka-keepalived-client;
修改hosts文件:
127.0.0.1 localhost server1 server2
修改application.properties配置文件(注意須要將eureka.client.register-with-eureka、eureka.client.fetch-registry註釋掉):
eureka-keepalived-server-1的配置文件:
server.port=8781 spring.application.name=eureka-server-1 spring.profiles.active=server1 #eureka.client.register-with-eureka=false #eureka.client.fetch-registry=false #指定主機名 eureka.instance.hostname=server1 #設置EurekaServer的地址,將自身註冊到Server2 eureka.client.service-url.defaultZone=http://server2:8782/eureka
eureka-keepalived-server-2的配置文件:
server.port=8782 spring.application.name=eureka-server-2 #指定hostname spring.profiles.active=server2 #eureka.client.register-with-eureka=false #eureka.client.fetch-registry=false #指定主機名 eureka.instance.hostname=server2 #設置EurekaServer的地址,將本身註冊在Server2上 eureka.client.service-url.defaultZone=http://server1:8781/eureka
eureka-keepalived-client的配置文件:
server.port=8783 #對該應用另起別名 spring.application.name=client-8783 #注入目標,配置服務中心url,與服務端的配置保持一致,這裏能夠寫多個,以「,」分隔,如http://server1:8781/eureka/,http://server2:8782/eureka/ eureka.client.service-url.defaultZone=http://server1:8781/eureka/
分別啓動兩個服務端server二、server1,訪問,server1:8781/,server2:8782/,以下:
啓動客戶端,發現客戶端分別在兩個服務端都有相應的註冊,而咱們的客戶端實際只指定了一個Server;
至此,完成了Eureka的高可用;
示例代碼:https://gitee.com/lfalex/springcloud-example.git
參考書籍:《SpringCloud與Docker微服務架構實戰》周力著