在Springcloud
項目中,服務提供者對外提供服務,服務消費者進行消費服務,如果微服務很多,就需要一個服務管理中心去統一管理服務,而消費者在調用服務時就可以去這個管理中心中去查找需要調用的服務進行調用。
Eureka
在Springcloud
中就作爲最常用的服務註冊與發現的組件,下面主要記錄一下Eureka
的基本原理與使用方法。
Eureka是什麼
Eureka
是Netflix
的核心模塊之一,它採用CS架構,基於CAP理論中的AP原則,是一種高可用的服務註冊中心, 用於服務發現和故障轉移。
Eureka架構
Eureka的原理簡述如下:
-
Eureka Server
啓動後,當微服務客戶端(Eureka Client
/Application Client
)啓動時,根據配置將服務信息(服務主機ip、端口、服務名稱等)註冊到Eureka Server
中; -
當Eureka客戶端(
Eureka Client
/Application Client
)啓動時,根據配置將服務信息(服務主機ip、端口、服務名稱等)註冊到Eureka Server
中; -
Eureka Server 通過Replicate複製方式向Eureka集羣中其他各個節點的Eureka Server同步服務信息;
-
服務消費者調用微服務時,先去Eureka Server中去查找可用的服務;
-
Eureka Server 通過查找可用的服務信息,並返回給Eureka Client進行調用。
Eureka的自我保護機制
Eureka Server啓動後,Eureka Client每隔30s便會給Eureka Server發送心跳,以表示自己的可用狀態,如果在指定的心跳週期內(默認90s),沒有收到某個Client的心跳,造成server沒有收到client心跳的原因大體分爲兩種:
- 該Client確實已經down了,不能提供服務, 此時Eureka Server按理應該刪除和註銷該Client在註冊中心的信息;
- 該Client本身服務正常,但是由於網絡分區的原因導致收Server收不到該Client的心跳,此時如果刪除Client的註冊信息,那將是不合理而且危險的。
基於上述兩點,Eureka Server無法確定是由於哪種原因導致的收不到Client的心跳,所以Eureka Server會啓動自我保護機制:不再刪除和註銷任何微服務的註冊信息,即使該服務真的不可用。當網絡恢復正常(所有的Client都能正常發送心跳)時,Eureka Server將推出自我保護。
Eureka的另一種自我保護機制:當超過15分鐘沒有接收到85%的Client的心跳時,EurekaServer認爲出現網絡分區錯誤,則:
- 不再從註冊中心刪除任何長時間沒有發送心跳的過期Client的註冊信息;
- 如果接收到新的Client的心跳,不再進行節點同步;
- 如果網絡恢復正常(正常接收到Client心跳)後,則同步節點信息。
Eureka的高可用性
分佈式數據庫系統滿足CAP定理,由於網絡分區原因,P(Partition Tolerance分區容錯)是必須要解決而且保證的,C(Consistant強一致性)和A(Avalibale可用性)不可能同時滿足,所以需要根據需要進行兩者之間的權衡。Eureka是AP原則實現的,保證了集羣的高可用。
Eureka集羣的每個節點都是平等的,沒有master-slave(主從)關係,當其中某個節點down掉之後,其他的節點是沒有影響的,繼續提供服務,Eureka中的負載均衡器會尋找其他的可用的節點繼續提供服務,除非所有節點都不可用。
Eureka和Zookeeper的區別
Zookeeper是基於CP原則實現的,集羣採用master-slave模式,當master節點出現故障後,其他的slave節點將會進行選舉新的mater,這個選舉過程一般在30s-120s,此段時間內,整個集羣是不可用的。
Eureka是基於AP原則實現的,具有高可用性。
Eureka 在Springcloud項目中的使用
1. Eureka Server構建
- pom.xml:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
- application.yml:
server:
port: 7010
eureka:
instance:
hostname: eureka7001.com #服務主機名
client:
register-with-eureka: false #不把自己註冊進註冊中心
fetch-registry: false #發現服務時不用檢查自己
service-url:
# 單機時只需指定自己
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
#集羣中不必指定自己,只需指定其他的節點的訪問地址 ,中間用逗號分隔
defaultZone: http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
- 主啓動類添加啓用EurekaServer註解
@SpringBootApplication
@EnableEurekaServer // 啓用EurekaServer
public class App {
public static void main( String[] args ) {
SpringApplication.run(App.class, args);
}
}
- 瀏覽器中訪問所配置的地址,即可訪問Eureka的註冊中心頁面
Eureka Client構建
- pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- application.yml
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
instance:
appname: aitao-sevice-usercenter8003
prefer-ip-address: true # 可以顯示微服務主機ip
- 啓動類添加
@EnableEurekaClient
註解。