日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Eureka服务注册中心---SpringCloud

發布時間:2023/12/3 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Eureka服务注册中心---SpringCloud 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Eureka服務注冊中心

5.1 什么是Eureka

  • Netflix在涉及Eureka時,遵循的就是API原則.
  • Eureka是Netflix的有個子模塊,也是核心模塊之一。Eureka是基于REST的服務,用于定位服務,以實現云端中間件層服務發現和故障轉移,服務注冊與發現對于微服務來說是非常重要的,有了服務注冊與發現,只需要使用服務的標識符,就可以訪問到服務,而不需要修改服務調用的配置文件了,功能類似于Dubbo的注冊中心,比如Zookeeper.

原理

  • Eureka基本的架構
    • Springcloud 封裝了Netflix公司開發的Eureka模塊來實現服務注冊與發現 (對比Zookeeper).
    • Eureka采用了C-S的架構設計,EurekaServer作為服務注冊功能的服務器,他是服務注冊中心.
    • 而系統中的其他微服務,使用Eureka的客戶端連接到EurekaServer并維持心跳連接。這樣系統的維護人員就可以通過EurekaServer來監控系統中各個微服務是否正常運行,Springcloud 的一些其他模塊 (比如Zuul) 就可以通過EurekaServer來發現系統中的其他微服務,并執行相關的邏輯.

  • 和Dubbo架構對比.

  • Eureka 包含兩個組件:Eureka ServerEureka Client.

  • Eureka Server 提供服務注冊,各個節點啟動后,回在EurekaServer中進行注冊,這樣Eureka Server中的服務注冊表中將會儲存所有課用服務節點的信息,服務節點的信息可以在界面中直觀的看到.

  • Eureka Client 是一個Java客戶端,用于簡化EurekaServer的交互,客戶端同時也具備一個內置的,使用輪詢負載算法的負載均衡器。在應用啟動后,將會向EurekaServer發送心跳 (默認周期為30秒) 。如果Eureka Server在多個心跳周期內沒有接收到某個節點的心跳,EurekaServer將會從服務注冊表中把這個服務節點移除掉 (默認周期為90s).

  • 三大角色

    • Eureka Server:提供服務的注冊與發現
    • Service Provider:服務生產方,將自身服務注冊到Eureka中,從而使服務消費方能狗找到
    • Service Consumer:服務消費方,從Eureka中獲取注冊服務列表,從而找到消費服務
  • 目前工程狀況

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-L2Cf7adP-1610696585775)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20210114232936013.png)]

eureka-server

  • springcloud-eureka-7001 模塊建立

  • pom.xml 配置

    <!--導包~--> <dependencies><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --><!--導入Eureka Server依賴--><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:# Eureka服務端的實例名字hostname: 127.0.0.1client:# 表示是否向 Eureka 注冊中心注冊自己(這個模塊本身是服務器,所以不需要)register-with-eureka: false# fetch-registry如果為false,則表示自己為注冊中心,客戶端的化為 turefetch-registry: false# Eureka監控頁面~service-url:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • 源碼中Eureka的默認端口以及訪問路徑:

  • 主啟動類

    /*** @Auther: csp1999* @Date: 2020/05/18/10:26* @Description: 啟動之后,訪問 http://127.0.0.1:7001/*/ @SpringBootApplication // @EnableEurekaServer 服務端的啟動類,可以接受別人注冊進來~ @EnableEurekaServer public class EurekaServer_7001 {public static void main(String[] args) {SpringApplication.run(EurekaServer_7001.class,args);} }
  • 啟動成功后訪問 http://localhost:7001/ 得到以下頁面

  • eureka-client

    調整之前創建的springlouc-provider-dept-8001

  • 導入Eureca依賴

    <!--Eureka依賴--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka --> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId><version>1.4.6.RELEASE</version> </dependency>
  • application中新增Eureca配置

    # Eureka配置:配置服務注冊中心地址 eureka:client:service-url:defaultZone: http://localhost:7001/eureka/
  • 為主啟動類添加@EnableEurekaClient注解

    /*** @Auther: csp1999* @Date: 2020/05/17/22:09* @Description: 啟動類*/ @SpringBootApplication // @EnableEurekaClient 開啟Eureka客戶端注解,在服務啟動后自動向注冊中心注冊服務 @EnableEurekaClient public class DeptProvider_8001 {public static void main(String[] args) {SpringApplication.run(DeptProvider_8001.class,args);} }
  • 先啟動7001服務端后啟動8001客戶端進行測試,然后訪問監控頁http://localhost:7001/ 產看結果如圖,成功

  • 修改Eureka上的默認描述信息

    # Eureka配置:配置服務注冊中心地址 eureka:client:service-url:defaultZone: http://localhost:7001/eureka/instance:instance-id: springcloud-provider-dept-8001 #修改Eureka上的默認描述信息

    結果如圖:

    如果此時停掉springcloud-provider-dept-8001 等30s后 監控會開啟保護機制:

  • 配置關于服務加載的監控信息

  • 熱部署配置

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gdmsQkHa-1610696585777)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20210115003227472.png)]

    完善監控信息(actuator)

    pom.xml中添加依賴

    <!--actuator完善監控信息--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>

    application.yml中添加配置

    # info配置 info: # 項目的名稱app.name: haust-springcloud # 公司的名稱company.name: 河南科技大學西苑校區軟件學院

    此時刷新監控頁,點擊進入跳轉新頁面顯示如下內容:

    自我保護機制:好死不如賴活著

    一句話總結就是:某時刻某一個微服務不可用,eureka不會立即清理,依舊會對該微服務的信息進行保存!

    • 默認情況下,當eureka server在一定時間內沒有收到實例的心跳,便會把該實例從注冊表中刪除(默認是90秒),但是,如果短時間內丟失大量的實例心跳,便會觸發eureka server的自我保護機制,比如在開發測試時,需要頻繁地重啟微服務實例,但是我們很少會把eureka server一起重啟(因為在開發過程中不會修改eureka注冊中心),當一分鐘內收到的心跳數大量減少時,會觸發該保護機制??梢栽趀ureka管理界面看到Renews threshold和Renews(last min),當后者(最后一分鐘收到的心跳數)小于前者(心跳閾值)的時候,觸發保護機制,會出現紅色的警告:EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEGING EXPIRED JUST TO BE SAFE.從警告中可以看到,eureka認為雖然收不到實例的心跳,但它認為實例還是健康的,eureka會保護這些實例,不會把它們從注冊表中刪掉。
    • 該保護機制的目的是避免網絡連接故障,在發生網絡故障時,微服務和注冊中心之間無法正常通信,但服務本身是健康的,不應該注銷該服務,如果eureka因網絡故障而把微服務誤刪了,那即使網絡恢復了,該微服務也不會重新注冊到eureka server了,因為只有在微服務啟動的時候才會發起注冊請求,后面只會發送心跳和服務列表請求,這樣的話,該實例雖然是運行著,但永遠不會被其它服務所感知。所以,eureka server在短時間內丟失過多的客戶端心跳時,會進入自我保護模式,該模式下,eureka會保護注冊表中的信息,不在注銷任何微服務,當網絡故障恢復后,eureka會自動退出保護模式。自我保護模式可以讓集群更加健壯。
    • 但是我們在開發測試階段,需要頻繁地重啟發布,如果觸發了保護機制,則舊的服務實例沒有被刪除,這時請求有可能跑到舊的實例中,而該實例已經關閉了,這就導致請求錯誤,影響開發測試。所以,在開發測試階段,我們可以把自我保護模式關閉,只需在eureka server配置文件中加上如下配置即可:eureka.server.enable-self-preservation=false【不推薦關閉自我保護機制】

    詳細內容可以參考下這篇博客內容:https://blog.csdn.net/wudiyong22/article/details/80827594

    注冊進來的微服務,獲取一些消息(團隊開發會用到)

    DeptController.java新增方法

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gdDAPdyk-1610696585779)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20210115004810922.png)]

    /*** DiscoveryClient 可以用來獲取一些配置的信息,得到具體的微服務!*/ @Autowired private DiscoveryClient client;/*** 獲取一些注冊進來的微服務的信息~,** @return*/ @GetMapping("/dept/discovery") public Object discovery() {// 獲取微服務列表的清單List<String> services = client.getServices();System.out.println("discovery=>services:" + services);// 得到一個具體的微服務信息,通過具體的微服務id,applicaioinName;List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");for (ServiceInstance instance : instances) {System.out.println(instance.getHost() + "\t" + // 主機名稱instance.getPort() + "\t" + // 端口號instance.getUri() + "\t" + // uriinstance.getServiceId() // 服務id);}return this.client; }

    主啟動類中加入@EnableDiscoveryClient 注解

    @SpringBootApplication // @EnableEurekaClient 開啟Eureka客戶端注解,在服務啟動后自動向注冊中心注冊服務 @EnableEurekaClient // @EnableEurekaClient 開啟服務發現客戶端的注解,可以用來獲取一些配置的信息,得到具體的微服務 @EnableDiscoveryClient public class DeptProvider_8001 {... }

    結果如圖:

    集群環境配置

    1.初始化

    新建springcloud-eureka-7002、springcloud-eureka-7003 模塊

    1.為pom.xml添加依賴 (與springcloud-eureka-7001相同)

    <!--導包~--> <dependencies><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --><!--導入Eureka Server依賴--><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>

    2.application.yml配置(與springcloud-eureka-7001相同)

    server:port: 7003# Eureka配置 eureka:instance:hostname: localhost # Eureka服務端的實例名字client:register-with-eureka: false # 表示是否向 Eureka 注冊中心注冊自己(這個模塊本身是服務器,所以不需要)fetch-registry: false # fetch-registry如果為false,則表示自己為注冊中心service-url: # 監控頁面~# 重寫Eureka的默認端口以及訪問路徑 --->http://localhost:7001/eureka/defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

    3.主啟動類(與springcloud-eureka-7001相同)

    /*** @Auther: csp1999* @Date: 2020/05/18/10:26* @Description: 啟動之后,訪問 http://127.0.0.1:7003/*/ @SpringBootApplication // @EnableEurekaServer 服務端的啟動類,可以接受別人注冊進來~ public class EurekaServer_7003 {public static void main(String[] args) {SpringApplication.run(EurekaServer_7003.class,args);} }

    2.集群成員相互關聯

    配置一些自定義本機名字,找到本機hosts文件并打開

    在hosts文件最后加上,要訪問的本機名稱,默認是localhost

    修改application.yml的配置,如圖為springcloud-eureka-7001配置,springcloud-eureka-7002/springcloud-eureka-7003同樣分別修改為其對應的名稱即可

    在集群中使springcloud-eureka-7001關聯springcloud-eureka-7002、springcloud-eureka-7003

    完整的springcloud-eureka-7001下的application.yml如下

    server:port: 7001#Eureka配置 eureka:instance:hostname: eureka7001.com #Eureka服務端的實例名字client:register-with-eureka: false #表示是否向 Eureka 注冊中心注冊自己(這個模塊本身是服務器,所以不需要)fetch-registry: false #fetch-registry如果為false,則表示自己為注冊中心service-url: #監控頁面~#重寫Eureka的默認端口以及訪問路徑 --->http://localhost:7001/eureka/# 單機: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/# 集群(關聯):7001關聯7002、7003defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

    同時在集群中使springcloud-eureka-7002關聯springcloud-eureka-7001、springcloud-eureka-7003

    完整的springcloud-eureka-7002下的application.yml如下

    server:port: 7002#Eureka配置 eureka:instance:hostname: eureka7002.com #Eureka服務端的實例名字client:register-with-eureka: false #表示是否向 Eureka 注冊中心注冊自己(這個模塊本身是服務器,所以不需要)fetch-registry: false #fetch-registry如果為false,則表示自己為注冊中心service-url: #監控頁面~#重寫Eureka的默認端口以及訪問路徑 --->http://localhost:7001/eureka/# 單機: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/# 集群(關聯):7002關聯7001、7003defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/

    springcloud-eureka-7003配置方式同理可得.

    通過springcloud-provider-dept-8001下的yml配置文件,修改Eureka配置:配置服務注冊中心地址

    # Eureka配置:配置服務注冊中心地址 eureka:client:service-url:# 注冊中心地址7001-7003defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/instance:instance-id: springcloud-provider-dept-8001 #修改Eureka上的默認描述信息

    這樣模擬集群就搭建號了,就可以把一個項目掛載到三個服務器上了

    對比和Zookeeper

    1. 回顧CAP原則

    RDBMS (MySQL\Oracle\sqlServer) ===> ACID

    NoSQL (Redis\MongoDB) ===> CAP

    ACID

    • A (Atomicity) 原子性
    • C (Consistency) 一致性
    • I (Isolation) 隔離性
    • D (Durability) 持久性

    CAP

    • C (Consistency) 強一致性
    • A (Availability) 可用性
    • P (Partition tolerance) 分區容錯性

    CAP的三進二:CA、AP、CP

    CAP理論的核心

    • 一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求
    • 根據CAP原理,將NoSQL數據庫分成了滿足CA原則,滿足CP原則和滿足AP原則三大類
      • CA:單點集群,滿足一致性,可用性的系統,通??蓴U展性較差
      • CP:滿足一致性,分區容錯的系統,通常性能不是特別高
      • AP:滿足可用性,分區容錯的系統,通??赡軐σ恢滦砸蟮鸵恍?/li>

    Eureka VS Zookeeper

    著名的CAP理論指出,一個分布式系統不可能同時滿足C (一致性) 、A (可用性) 、P (容錯性),由于分區容錯性P再分布式系統中是必須要保證的,因此我們只能再A和C之間進行權衡。

    • Zookeeper 保證的是 CP —> 滿足一致性,分區容錯的系統,通常性能不是特別高
    • Eureka 保證的是 AP —> 滿足可用性,分區容錯的系統,通??赡軐σ恢滦砸蟮鸵恍?/li>

    Zookeeper保證的是CP

    當向注冊中心查詢服務列表時,我們可以容忍注冊中心返回的是幾分鐘以前的注冊信息,但不能接收服務直接down掉不可用。也就是說,服務注冊功能對可用性的要求要高于一致性。但zookeeper會出現這樣一種情況,當master節點因為網絡故障與其他節點失去聯系時,剩余節點會重新進行leader選舉。問題在于,選舉leader的時間太長,30-120s,且選舉期間整個zookeeper集群是不可用的,這就導致在選舉期間注冊服務癱瘓。在云部署的環境下,因為網絡問題使得zookeeper集群失去master節點是較大概率發生的事件,雖然服務最終能夠恢復,但是,漫長的選舉時間導致注冊長期不可用,是不可容忍的。

    Eureka保證的是AP

    Eureka看明白了這一點,因此在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工作,剩余的節點依然可以提供注冊和查詢服務。而Eureka的客戶端在向某個Eureka注冊時,如果發現連接失敗,則會自動切換至其他節點,只要有一臺Eureka還在,就能保住注冊服務的可用性,只不過查到的信息可能不是最新的,除此之外,Eureka還有之中自我保護機制,如果在15分鐘內超過85%的節點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現了網絡故障,此時會出現以下幾種情況:

    • Eureka不在從注冊列表中移除因為長時間沒收到心跳而應該過期的服務
    • Eureka仍然能夠接受新服務的注冊和查詢請求,但是不會被同步到其他節點上 (即保證當前節點依然可用)
    • 當網絡穩定時,當前實例新的注冊信息會被同步到其他節點中

    因此,Eureka可以很好的應對因網絡故障導致部分節點失去聯系的情況,而不會像zookeeper那樣使整個注冊服務癱瘓

    總結

    以上是生活随笔為你收集整理的Eureka服务注册中心---SpringCloud的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。