前言
本篇主要介紹的是SpringCloud相關知識、微服務架構以及搭建一個高可用的服務註冊與發現的服務模組(Eureka)。
SpringCloud介紹
Spring Cloud是在Spring Boot的基礎上構建的,用於簡化分散式系統構建的工具集,為開發人員提供快速建立分散式系統中的一些常見的模式。
例如:
配置管理(configuration management),服務發現(service discovery),斷路器(circuit breakers),智慧路由( intelligent routing),微代理(micro-proxy),控制匯流排(control bus),一次性令牌( one-time okens),全域性鎖(global locks),領導選舉(leadership election),分散式會話(distributed sessions),叢集狀態(cluster state)等等。
微服務架構是什麼
微服務架構風格是一種將單個應用程式開發為一套小型服務的方法,每個小型服務都在自己的流程中執行,並與輕量級機制(通常是HTTP資源API)進行通訊。這些服務圍繞業務功能構建,可通過全自動部署機制獨立部署。這些服務至少集中管理,可以用不同的程式語言編寫,並使用不同的資料儲存技術。
SpringCloud Eureka
Eureka 介紹
Eureka是Netflix開源的一款提供服務註冊和發現的產品,它提供了完整的Service Registry和Service Discovery實現。也是springcloud體系中最重要最核心的元件之一。
Eureka主要由兩個元件組成:Eureka伺服器和Eureka客戶端。 Eureka伺服器用作服務註冊伺服器。 Eureka客戶端是一個java客戶端,用來簡化與伺服器的互動、作為輪詢負載均衡器,並提供服務的故障切換支援。
開發準備
開發環境
- JDK:1.8
- SpringBoot:2.1.1.RELEASE
- SpringCloud:Finchley
注:不一定非要用上述的版本,可以根據情況進行相應的調整。需要注意的是SpringBoot2.x以後,jdk的版本必須是1.8以上!
確認了開發環境之後,我們再來新增相關的pom依賴。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
複製程式碼
注: 基於SpringBoot1.x以上SpringCloud是Dalston版本的eureka 依賴是 <artifactId>spring-cloud-starter-eureka</artifactId>
,少了個 netflix 。SpringCloud的版本命名方式是通過倫敦的地方來命名的,版本順序是根據首字母的順序來的。
SpringCloud Eureka Hello World
我們先來實現Eureka的Hello World版,其實也就是實現簡單的服務註冊和發現功能。
服務端
首先建立一個服務端的工程,新增如上的依賴之後,在application.properties
新增如下的配置:
配置資訊:
spring.application.name=springcloud-eureka-client
server.port=8000
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
複製程式碼
配置說明:
- spring.application.name: 這個是指定服務名稱。
- server.port:服務指定的埠。
- eureka.client.register-with-eureka:表示是否將自己註冊到Eureka Server,預設是true。
- eureka.client.fetch-registry:表示是否從Eureka Server獲取註冊資訊,預設為true。
- eureka.client.serviceUrl.defaultZone: 這個是設定與Eureka Server互動的地址,客戶端的查詢服務和註冊服務都需要依賴這個地址。
完成配置資訊的新增後,我們再來看程式碼如何實現。
在服務端這邊只需要在SpringBoot啟動類新增@EnableEurekaServer
註解就可以了,該註解表示此服務是一個服務註冊中心服務。
程式碼示例:
@EnableEurekaServer
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
System.out.println("註冊中心服務啟動...");
}
}
複製程式碼
客戶端
這裡我們在新建一個客戶端的專案,新增如上的依賴之後,在application.properties
新增如下的配置:
配置資訊:
spring.application.name=springcloud-eureka-client
server.port=9001
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
複製程式碼
配置說明:
- spring.application.name: 這個是客戶端的服務名稱。如果有多個服務使用同一個名稱但是訪問地址不同,結合ribbon 使用,則可以實現負載均衡功能。
- server.port:服務指定的埠。
- eureka.client.serviceUrl.defaultZone: 註冊中心服務端的地址。
服務端這邊的實現也很簡單,只需在啟動類上新增@EnableDiscoveryClient
該註解即可,使用該註解表示該專案就具有了服務註冊的功能。
程式碼示例:
@SpringBootApplication
@EnableDiscoveryClient
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
System.out.println("客戶端服務啟動...");
}
}
複製程式碼
功能測試
完成如上的工程開發之後,我們依次啟動服務端和客戶端程式,然後在瀏覽器介面輸入:http://localhost:8000/
,即可檢視註冊中心的資訊。
訪問介面地址:
通過上述示例圖中,可以看到Eureka啟動成功了,並且有一個服務進行註冊了。
成功的實現了服務註冊功能之後,我們來測試下Eureka服務的保護機制。 這裡我們先關閉客戶端,檢視介面資訊,發現沒什麼改變,等待大約15分鐘左右之後,再到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可能錯誤地聲稱例項已經啟動,而實際上並沒有。續訂小於閾值,因此例項不會為了安全而過期。
介面示例圖:
這裡就順便說下Eureka的自我保護機制。
自我保護模式正是一種針對網路異常波動的安全保護措施,使用自我保護模式能使Eureka叢集更加的健壯、穩定的執行。
自我保護機制的工作機制是如果在15分鐘內超過85%的客戶端節點都沒有正常的心跳,那麼Eureka就認為客戶端與註冊中心出現了網路故障,Eureka Server自動進入自我保護機制,此時會出現以下幾種情況:
- Eureka Server不再從註冊列表中移除因為長時間沒收到心跳而應該過期的服務。
- Eureka Server仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上,保證當前節點依然可用。
- 當網路穩定時,當前Eureka Server新的註冊資訊會被同步到其它節點中。
因此Eureka Server可以很好的應對因網路故障導致部分節點失聯的情況,而不會像ZK那樣如果有一半不可用的情況會導致整個叢集不可用而變成癱瘓。
自我保護機制的相關配置如下:
服務端的配置:
- eureka.server.enable-self-preservation: 該配置可以移除這種自我保護機制,防止失效的服務也被一直訪問 (Spring Cloud預設該配置是 true)。
- eureka.server.eviction-interval-timer-in-ms:該配置可以修改檢查失效服務的時間,每隔10s檢查失效服務,並移除列表 (Spring Cloud預設該配置是 60s)
客戶端的配置:
- eureka.instance.lease-renewal-interval-in-seconds: 該配置指示eureka客戶端需要向eureka伺服器傳送心跳的頻率 (Spring Cloud預設該配置是 30s)。
- eureka.instance.lease-expiration-duration-in-seconds: 該配置指示eureka伺服器在接收到最後一個心跳之後等待的時間,然後才能從列表中刪除此例項 (Spring Cloud預設該配置是 90s)。
這裡順便說下Eureka的的心跳機制。
Eureka Client需要每30秒給Eureka Server發一次心跳,同時更新Server上最新的註冊資訊到本地,如果Server多次沒有收到來自客戶端的心跳,那麼在90秒內會被Server上剔除。
高可用的註冊中心
上述的服務註冊中心示例是單點的,如果在生產環境中就顯得不適合,顯然這並不適合應用於線上生產環境。作為分散式系統最重要的註冊服務功能,為了使其高可用,使用叢集是最普遍的方式。Eureka可以通過互相註冊的方式來實現高可用的部署。
Eureka實現相互註冊的方式很簡單,只需要將各個服務端的地址相互進行配置即可。 那麼我們再來新建兩個服務端的工程,其中配置資訊如下:
server2配置資訊:
spring.application.name=springcloud-eureka-server
server.port=8002
eureka.instance.hostname = server2
eureka.client.serviceUrl.defaultZone=http://server3:8003/eureka/
複製程式碼
server3配置資訊:
spring.application.name=springcloud-eureka-server
server.port=8003
eureka.instance.hostname = server3
eureka.client.serviceUrl.defaultZone=http://server2:8002/eureka/
複製程式碼
上述的配置在之前已經說過了,這裡就不在過多描述了。這裡的服務端配置和之前專案的服務端配置略有不同,允許自己進行註冊了。並且這裡的eureka.instance.hostname
相當於是對服務地址起一個別名,也可以不配置,預設將會使用IP進行查詢。eureka.client.serviceUrl.defaultZone
這裡配置的是另一個服務端的地址,如果是多個就通過 ","逗號隔開。
因為這裡使用了別名進行區分服務,所以需要在hosts檔案新增如下配置,用於做對映。
127.0.0.1 server2
127.0.0.1 server3
複製程式碼
hosts檔案地址:
Windows 系統地址:C:\Windows\System32\drivers\etc\hosts
Linux系統地址: /etc/hosts
配置完成之後,啟動這兩個服務,然後在瀏覽器輸入:
http://server2:8002/
或
http://server3:8003/
即可檢視資訊.
高可用註冊中心示例圖:
這裡我們把之前的客戶端程式的配置改下,改成指定這個高可用註冊中心的地址,然後在關閉其中一個服務,檢視是否能夠正常的使用。
示例圖:
可以看到其中一個服務可以正常執行和使用!
其他
專案地址
基於SpringBoot1.x、SpringCloud的Dalston版本開發的地址:https://github.com/xuwujing/springcloud-study
。
基於SpringBoot1.x、SpringCloud 的Dalston版本開發的地址: https://github.com/xuwujing/springcloud-study-old
。
如果感覺專案不錯,希望能給個star,謝謝!
音樂推薦
挺有節奏感的一首純音樂!
原創不易,如果感覺不錯,希望給個推薦!您的支援是我寫作的最大動力! 版權宣告: 作者:虛無境 部落格園出處:www.cnblogs.com/xuwujing CSDN出處:blog.csdn.net/qazwsxpcm 個人部落格出處:www.panchengming.com