一、使用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 建立項目
配置 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上,是以從任何一台注冊中心上都能查詢到已經注冊的服務,進而達到高可用的效果。

Eureka注冊中心高可用叢集就是各個注冊中心互相注冊。
複制Eureka服務端(springcloud-eureka-server)的application.yml為application-eureka8701.yml,application-eureka8702.yml,我們讓8701和8702的Eureka服務互相注冊。
修改application-eureka8701.yml相應的配置如下:
五、Eureka示例
在剛才的父工程下建立 eureka-server 注冊中心的項目。
添加依賴:
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/