天天看點

Spring Cloud與Eureka

​​一、使用SpringCloud注冊中心Eureka​​

1.1 Eureka和Zookeeper對比

1.1.1 Zookeeper保證CP

1.1.2 Eureka保證AP

​​二、搭建與配置 Eureka服務注冊中心​​

2.1 SpringCloud專欄案例采用多子產品化管理,在父子產品(spirngcloud-learn)中添加SpringCloud管理依賴

2.2 創鍵Eureka服務端子產品(springcloud-eureka-server)

2.2.1 添加Eureka服務端依賴

2.2.2 配置application.yml

2.2.3 在啟動類上添加@EnableEurekaServer注解

2.2.4 啟動Eureka服務端,通路http://localhost:8700/顯示

​​三、向Eureka服務注冊中心注冊服務​​

3.1 修改服務提供者(springcloud-service-provider)

3.2 修改服務消費者(springcloud-service-consumer)

​​四、搭建高可用Eureka注冊中心​​

4.1 Eureka注冊中心高可用叢集搭建

​​五、Eureka示例​​

5.1 添加依賴

5.2 建立項目![在這裡插入圖檔描述](https://s4.51cto.com/images/blog/202106/01/bd2e51762d260b4429be0274ded047ca.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

​​配置 Eureka Server 注冊中心​​

相關内容​​https://blog.51cto.com/lovebetterworld​​​

一、使用SpringCloud注冊中心Eureka

在微服務架構中,服務注冊與發現是核心元件之一,手動指定每個服務是很低效的, Spring cloud提供了多種服務注冊與發現的實作方式,例如: Eureka、Consu、 Zookeeper

什麼是服務治理:

在傳統rpc遠端調用中,服務與服務依賴關系,管理比較複雜,是以需要使用服務治理,管理服務與服務之間依賴關系,可以實作服務調用、負載均衡、容錯等,實作服務發現與注冊。

服務注冊與發現

在服務注冊與發現中,有一個注冊中心,當伺服器啟動的時候,會把目前自己伺服器的資訊 比如 服務位址通訊位址等以别名方式注冊到注冊中心上。

另一方(消費者|服務提供者),以該别名的方式去注冊中心上擷取到實際的服務通訊位址,讓後在實作本地rpc調用遠端。

Eureka是什麼

Eureka是一個服務治理元件,它主要包括服務注冊和服務發現,主要用來搭建服務注冊中心。

Eureka是一個基于REST的服務,用來定位服務,進行中間層伺服器的負載均衡和故障轉移

Eureka采用了C-S(用戶端/服務端)的設計架構,也就是Eureka由兩個元件組成:Eureka服務端 和 Eureka用戶端。Eureka server作為服務注冊的服務端,它是服務注冊中心,而系統中的其他微服務,使用 Eureka的用戶端連接配接到 Eureka server服務端,并維持心跳連接配接, Eureka用戶端是一個Java用戶端,用來簡化與伺服器的互動、負載均衡,服務的故障切換等。

著名的CAP理論指出,一個分布式系統不可能同時滿足C(一緻性)、A(可用性)和P(分區容錯性)

由于分區容錯性在是分布式系統中必須要保證的,是以我們隻能在A和C之間進行權衡,在此 Zookeeper保證的是CP而 Eureka則是AP。

Consistency(一緻性), 資料一緻更新,所有資料變動都是同步的

Availability(可用性), 好的響應性能

Partition tolerance(分區容忍性) 可靠性

“C”是指一緻性,即當一個Process(過程)修改了某個資料後,其他Process讀取這是資料是,得到的是更新後的資料,但并不是所有系統都 可以做到這一點。例如,在一些并非嚴格要求一緻性的系統中,後來的Process得到的資料可能還是修改之前的資料,或者需要等待一定時間後才能得到修改 之後的資料,這被成為“弱一緻性”,最經典的應用就是DNS系統。當使用者修改了DNS配置後,往往不會馬上在全網更新,必定會有一個延遲,這個延遲被稱為 “不一緻視窗”,它的長度取決于系統的負載、備援的個數等因素。但對于某些系統而言,一旦寫入,後面讀取的一定是修改後的資料,如銀行賬戶資訊,這被稱為 “強一緻性”。

“A”是指可用性。即系統總是能夠為使用者提供連續的服務能力。當使用者送出請求是,系統能給出響應(成功或者失敗),而且是立即給出響應,而不是等待其他事情完成才響應。如果需要等待某件事情完成才響應,那麼“可用性”就不存在了。

“P”是指容錯性。任何一個分布式計算系統都是由多個節點組成的。在正常情況下,節點與節點之間的通信是正常的。但是在某些情況下,節點之間的通信會 斷開,這種斷開成為“Partition”。在分布式計算的實作中,Partition是很常見的,因為節點不可能永遠不出故障,尤其是對于跨實體地區的 海量存儲系統而言,而容錯性則可以保證如果隻是系統中的部分節點不可用,那麼相關的操作仍舊能夠正常完成。

在 ZooKeeper中,當 master節點因為網絡故障與其他節點失去聯系時,剩餘節點會重新進行 leader選舉,但是問題在于,選舉 leader需要一定時間,且選舉期間整個 ZooKeeper叢集都是不可用的,這就導緻在選舉期間注冊服務癱瘓。在雲部署的環境下,因網絡問題使得 ZooKeeper叢集失去 master節點是大機率事件,雖然服務最終能夠恢複,但是在選舉時間内導緻服務注冊長期不可用是難以容忍的。

Eureka優先保證可用性, Eureka各個節點是平等的,某幾個節點挂掉不會影響正常節點的工作,剩餘的節點依然可以提供注冊和查詢服務。而 Eureka的用戶端在向某個 Eureka注冊或時如果發現連接配接失敗,則會自動切換至其它節點,隻要有一台 Eureka還在,就能保證注冊服務可用(保證可用性),隻不過查到的資訊可能不是最新的(不保證強一緻性)

是以 Eureka在網絡故障導緻部分節點失去聯系的情況下,隻要有一個節點可用,那麼注冊和查詢服務就可以正常使用,而不會像 zookeeper那樣使整個注冊服務癱瘓, Eureka優先保證了可用性。

二、搭建與配置 Eureka服務注冊中心

SpringCloud要使用 Eureka注冊中心非常簡單和友善, SpringCloud中的Eureka服務注冊中心實際上也是一個SpringBoot工程,我們隻需通過引入相關依賴和注解配置就能讓 SpringBoot建構的微服務應用輕松地與Eureka進行整合,他不像Zookeeper那樣需要安裝獨立的Zookeeper服務。

三、向Eureka服務注冊中心注冊服務

在服務提供者加入Eureka用戶端依賴

在主類上添加@EnableEurekaClient注解

修改服務提供者的application.yml配置添加Eureka注冊中心位址

服務的發現由 eureka用戶端實作,而服務的消費由 Ribbon實作也就是說服務的調用需要 eureka用戶端和 Ribbon兩者配合起來才能實作。

Eureka用戶端是什麼

Eureka用戶端是一個Java用戶端,用來連接配接 Eureka服務端,與服務端進行互動、負載均衡,服務的故障切換等

Ribbon是什麼

Ribbon是一個基于HTTP和TCP的用戶端負載均衡器,當使用Ribbon對服務進行通路的時候,它會擴充 Eureka用戶端的服務發現功能,實作從 Eureka注冊中心中擷取服務端清單,并通過Eureka用戶端來确定服務端是否己經啟動。

Ribbon在Eureka用戶端服務發現的基礎上,實作了對服務執行個體的選擇政策進而實作對服務的負載均衡消費。

在調用服務提供者時使用 Ribbon來調用

加入ribbon的支援,那麼在調用時,即可改為使用服務名稱來通路,将ip:port改為服務名稱調用就行了。

四、搭建高可用Eureka注冊中心

在微服務架構的這種分布式系統中,我們要充分考慮各個微服務元件的高可用性問題,不能有單點故障,由于注冊中心Eureka本身也是一個服務,如果它隻有一個節點,那麼它有可能發生故障,這樣我們就不能注冊與查詢服務了,是以我們需要—個高可用的服務注冊中心,這就需要通過注冊中心叢集來解決。Eureka服務注冊中心它本身也是一個服務,它也可以看做是一個提供者,又可以看做是一個消費者,我們之前通過配置eureka.client.register-with-eureka= false讓注冊中心不注冊自己,但是我們可以向其他注冊中心注冊自己。

Eureka server的高可用實際上就是将自己作為服務向其他服務注冊中心注冊自己,這樣就會形成一組互相注冊的服務注冊中心,進而實作服務清單的互相同步,往注冊中心A上注冊的服務,可以被複制同步到注冊中心B上,是以從任何一台注冊中心上都能查詢到已經注冊的服務,進而達到高可用的效果。

Spring Cloud與Eureka

Eureka注冊中心高可用叢集就是各個注冊中心互相注冊。

複制Eureka服務端(springcloud-eureka-server)的application.yml為application-eureka8701.yml,application-eureka8702.yml,我們讓8701和8702的Eureka服務互相注冊。

修改application-eureka8701.yml相應的配置如下:

五、Eureka示例

在剛才的父工程下建立 eureka-server 注冊中心的項目。

Spring Cloud與Eureka
Spring Cloud與Eureka
Spring Cloud與Eureka
Spring Cloud與Eureka

添加依賴:

server:

port: 8761 # 端口

spring:

application:

name: eureka-server # 應用名稱

配置 Eureka Server 注冊中心

eureka:

instance:

hostname: localhost # 主機名,不配置的時候将根據作業系統的主機名來擷取

client:

register-with-eureka: false # 是否将自己注冊到注冊中心,預設為 true

fetch-registry: false # 是否從注冊中心擷取服務注冊資訊,預設為 true

service-url: # 注冊中心對外暴露的注冊位址

defaultZone: http://

e

u

r

k

a

.

i

n

s

t

c

h

o

m

:

{eureka.instance.hostname}:

eureka.instance.hostname:{server.port}/eureka/

通路:

通路:http://localhost:8761/

Spring Cloud與Eureka