Eureka服務注冊與發現
Eureka包含兩個組件:Eureka Server和Eureka client .
Eureka Server提供服務注冊服務,各個節點啟動后,會在EurekaServer中進行注冊,這樣Eureka Server中的服務注冊表中將會村粗所有可用服務節點的資訊,服務節點的資訊可以在界面中直觀的看到,
EurekaClient是一個Java客戶端,用于簡化EurekaServer的互動,客戶端同時也具備一個內置的,使用輪詢負載演算法的負載均衡器,在應用啟動后,將會向EurekaServer發送心跳(默認周期為30秒),如果Eureka Server在多個心跳周期內沒有接收到某個節點的心跳,EurekaServer將會從服務注冊表中把這個服務節點移除掉(默認周期為90秒)
- 三大角色
- Eureka Server:提供服務的注冊于發現,zookeeper
- Service Provider:將自身服務注冊到Eureka中,從而使消費方能夠找到,
- Service Consumer:服務消費方從Eureka中獲取注冊服務串列,從而找到消費服務,
第一步,new 一個module springcloud-ureka-7001
匯入依賴
<!-- 導包 -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
第二步、application.yml
server:
port: 7001
#Eureka配置
eureka:
instance:
hostname: localhost #Eureka服務器的實體名稱
client:
register-with-eureka: false #表示是否向eureka注冊中心注冊自己
fetch-registry: false # 如果為false,則表示自己為注冊中心
service-url: #監控頁面~
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
第三步、主啟動類
@SpringBootApplication
@EnableEurekaServer //@EnableEurekaServer 服務端的啟動類,可以接受別人注冊進來~
public class EurekaServer_7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer_7001.class,args);
}
}
測驗 訪問 localhost:7001
Eureka : 服務注冊-資訊配置-自我保護機制
是對springcloud-provider-dept-8001的添加
第一步、加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
第二步、application.yml 添加eureka配置
# eureka的配置 服務注冊到哪里
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: springcloud-provider-dept8001 #修改eureka上的默認描述資訊!
第三步、主啟動類加注解
//啟動類
@SpringBootApplication
@EnableEurekaClient //在服務啟動后自動注冊到eureka中
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
}
測驗 訪問 開啟 8001 7001

點擊UP【1】的鏈接 404 完善配置資訊 8001的
1.加依賴
<!-- actuator完善監控資訊 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.application.yml加配置
# info 配置
info:
app.name: kuangshen-springcloud
company.name: blog.kuangstudy.com
自我保護機制
- 好死不如賴活著
- 綜上,自我保護模式是一種應對網路例外的安全保護措施,它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目注銷任何健康的微服務,使用自我保護模式,可以讓Eureka集群更加的健壯和穩定
- 一句話總結:某時刻某一個微服務不可以用了,eureka不會立刻清理,依舊會對該微服務的資訊進行保存!
- 在SpringCloud中,可以使用
eureka.server.enable-self-preservation m false禁用自我保護模式【不推薦關閉自我保護機制】
擴展 用代碼獲取資訊
- 8001 controller
//獲取一些配置的資訊,得到具體的微服務
@Autowired
private DiscoveryClient client;
//注冊進來的微服務~ 獲取一些訊息~
@GetMapping("/dept/discovery")
public Object discovery(){
//獲取微服務的清單
List<String> services = client.getServices();
System.out.println("discovery==> "+services);
//得到一個具體的微服務資訊 通過具體的微服務id,ApplicationName
List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");
for (ServiceInstance instance : instances) {
System.out.println(
instance.getHost()+"\t"+
instance.getPort()+"\t"+
instance.getUri()+"\t"+
instance.getServiceId()
);
}
/*discovery==> [springcloud-provider-dept]
DESKTOP-2O58D28 8001 http://DESKTOP-2O58D28:8001 SPRINGCLOUD-PROVIDER-DEPT */
return this.client;
}
主啟動類加上 @EnableDiscoveryClient 注解
測驗 訪問 http://localhost:8001/dept/discovery
Eureka : 集群環境配置
創建兩個和springcloud-eureka-7001一樣的專案 為 7002 7003
- 7001 application.xml
server:
port: 7001
#Eureka配置
eureka:
instance:
hostname: eureka7001.com #Eureka服務器的實體名稱
client:
register-with-eureka: false #表示是否向eureka注冊中心注冊自己
fetch-registry: false # 如果為false,則表示自己為注冊中心
service-url: #監控頁面~
# 單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群 (關聯):
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
- 7002 application.xml
server:
port: 7002
#Eureka配置
eureka:
instance:
hostname: eureka7002.com #Eureka服務器的實體名稱
client:
register-with-eureka: false #表示是否向eureka注冊中心注冊自己
fetch-registry: false # 如果為false,則表示自己為注冊中心
service-url: #監控頁面~
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
- 7003 application.xml
server:
port: 7003
#Eureka配置
eureka:
instance:
hostname: eureka7003.com #Eureka服務器的實體名稱
client:
register-with-eureka: false #表示是否向eureka注冊中心注冊自己
fetch-registry: false # 如果為false,則表示自己為注冊中心
service-url: #監控頁面~
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
記得埠映射
C:\Windows\System32\drivers\etc\hosts

- 8001 application.xml
# eureka的配置 服務注冊到哪里
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: springcloud-provider-dept8001 #修改eureka上的默認描述資訊!
全部開啟 測驗 訪問 如下圖

Eureka :CAP原則 及 對比Zookeeper
CAP是什么?
- C (Consistency)強一致性
- A(Availability)可用性
- P(Partition tolerance)磁區容錯性
- CAP的三進二:CA、AP、CP
最多只能同時實作2個
作為服務注冊中心,Eureka比Zookeeper好在哪里?
著名的CAP理論指出,一個分布式系統不可能同時滿足C(一致性)、A(可用性)、P(容錯性),由于磁區容錯性P在分布式系統中是必須要保證的,因此我們只能在A和C之間進行權衡,
- Zookeeper保證的是CP;
- Eureka保證的是AP;
Zookeeper保證的是CP
當向注冊中心查詢服務串列時,我們可以容忍注冊中心回傳的是幾分鐘以前的注冊資訊,但不能接受服務直接down掉不可用,也就是說,服務注冊功能對可用性的要求要高于一致性,但是zk會出現這樣一種情況,當master節點因為網路故障與其他節點失去聯系時,剩余節點會重新進行leader選舉,問題在于,選舉leader的時間太長,30~120s,且選舉期間整個z水k集群都是不可用的,這就導致在選舉期間注冊服務癱瘓,在云部署的環境下,因為網路問題使得z水k集群失去master節點是較大概率會發生的事件,雖然服務最終能夠恢復,但是漫長的選舉時間導致的注冊長期不可用是不能容忍的,
Eureka保證的是AP
Eureka看明白了這一點,因此在設計時就優先保證可用性,Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的作業,剩余的節點依然可以提供注冊和查詢服務,而Eureka的客戶端在向某個Eureka注冊時,如果發現連接失敗,則會自動切換至其他節點,只要有一臺Eureka還在,就能保住注冊服務的可用性,只不過查到的資訊可能不是最新的,除此之外,Eureka還有一種自我保護機制,如果在15分鐘內超過85%的節點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現了網路故障,此時會出現以下幾種情況:
1.Eureka不再從注冊串列中移除因為長時間沒收到心跳而應該過期的服務
2.Eureka仍然能夠接受新服務的注冊和查詢請求,但是不會被同步到其他節點上(即保證當前節點依然可用)
3.當網路穩定時,當前實體新的注冊資訊會被同步到其他節點中
因此,Eureka可以很好的應對因網路故障導致部分節點失去聯系的情況,而不會像zookeeper那樣使整個注冊服務癱瘓
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/337628.html
標籤:其他
上一篇:BI與報表的區別
下一篇:HDFS寫資料流程
