一、SpringCloud簡介
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分散式系統基礎設施的開發,如服務發現註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring Cloud並沒有重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝遮蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分散式系統開發工具包。
二、微服務的註冊與發現-Eureka
Eureka是Netflix開源的服務發現元件,本身是基於Rest的服務,它包含服務端和客戶端兩部分;在SpringCloud中將它整合在其中,從而實現了微服務的發現與註冊;
– Eureka的GitHub:github.com/Netflix/Eur…
Eureka Server
– 服務端-沒有儲存,記憶體保持,每服務例項需要傳送心跳去續約
– 客戶端-在記憶體中快取著eureka的註冊資訊,因此不必每請求到eureka查×××
– eureka之間會做註冊服務同步,從而保證狀態一致,客戶端只需訪問一個eureka
Service Provider
– 會向Eureka Server做Register(服務註冊)、Renew(服務續約)、Cancel(服務下線)等操作
Service Consumer
– 會向Eureka Server獲取註冊服務列表,並消費服務
三、簡單實戰
1、編寫服務端(SpringCloud使用的是Edgware SR3版本)
在pom.xml中加入以下依賴:
<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中新增以下配置:
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
@EnableEurekaServerpublic class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
複製程式碼
啟動專案,開啟http://localhost:8781/,如下:
2、編寫客戶端(SpringCloud使用的版本與服務端一致)
在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等配置:
server.port=8782#對該應用另起別名
spring.application.name=client-8782#注入目標,配置服務中心url,與服務端的配置保持一致
eureka.client.service-url.defaultZone=http://localhost:8781/eureka/
複製程式碼
建立客戶端啟動類ClientApplication.java,並加入客戶端被發現註解:
@SpringBootApplication
@EnableDiscoveryClientpublic class ClientApplication { public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
複製程式碼
啟動應用,接著開啟之前Eureka的註冊頁面http://localhost:8781/,如下:
發現剛剛啟動的客戶端已經註冊在了服務端了。
當我將客戶端關閉後,再次開啟Eureka的註冊頁面,發現有一串紅字:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY`RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
這是因為Eureka進入了自我保護機制,預設情況下,如果EurekaServer在一定時間內沒有接收到某個微服務例項的心跳時,EurekaServer將會登出該例項(預設90s)。但是當網路發生故障時,微服務與EurekaServer之間無法通訊,這樣就會很危險了,因為微服務本身是很健康的,此時就不應該登出這個微服務,而Eureka通過自我保護機制來預防這種情況,當網路健康後,該EurekaServer節點就會自動退出自我保護模式;
這時再次將客戶端微服務啟動,重新整理服務註冊中心會發現,自我保護狀態已取消。
綜上所述,我們可以看出來Eureka的兩個元件EurekaServer和EurekaClient的作用:
-
EurekaServer 提供服務發現的能力,各個微服務啟動時,會向EurekaServer註冊自己的資訊(例如:ip、埠、微服務名稱等),EurekaServer會儲存這些資訊;
-
EurekaClient是一個Java客戶端,用於簡化與EurekaServer的互動;
-
微服務啟東後,會定期性(預設30s)的向EurekaServer傳送心跳以續約自己的“租期”;
-
如果EurekaServer在一定時間內未接收某個微服務例項的心跳,EurekaServer將會登出該例項(預設90s);
-
預設情況下,EurekaServer同時也是EurekaClient。多個EurekaServer例項,互相之間通過複製的方式,來實現服務登錄檔中資料的同步;
-
EurekaClient也會快取服務登錄檔中的資訊;
綜上,Eureka通過心跳檢查、客戶端快取等機制,提高了系統的靈活性、可伸縮性和可用性,所以作為一個微服務架構,需要一個服務註冊中心來統籌管理服務;
3、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=8781spring.application.name=eureka-server-1spring.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=8782spring.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/
複製程式碼
分別啟動兩個服務端server2、server1,訪問,server1:8781/,server2:8782/,如下:
啟動客戶端,發現客戶端分別在兩個服務端都有相應的註冊,而我們的客戶端實際只指定了一個Server;
至此,完成了Eureka的高可用;
示例程式碼:gitee.com/lfalex/spri…
參考書籍:《SpringCloud與Docker微服務架構實戰》周力著
文章出處:www.cnblogs.com/lfalex0831/…
末尾福利
36份一線網際網路Java面試電子書
84個Java稀缺面試題視訊