SpringCloud Eureka-服務注冊與發現01
1.Eureka介紹
1.1學習Eureka前的說明
目前主流的服務注冊&發現的組件是 Nacos,但是 Eureka 作為老牌經典的服務注冊&發現技識訓是有必要學習一下,原因:
(1)一些早期的分布式微服務專案使用的是 Eureka,在作業中完全有可能遇到這種情況,
(2)后期的服務注冊&發現組件/技術,都參考了 Eureka 設計和理念,學習了 Eureka 后, 我們上手 Nacos 容易很多,而且可以理解得更深刻,
1.2當前架構問題分析
在企業級專案中,服務消費訪問請求會存在高并發現象,如果只有一個會員中心-提供服務,可用性很差——如果該模塊宕機,那么整個分布式應用就不能使用了,所以,會員中心提供服務往往是一個集群,有多個會員中心-提供服務模塊,
這時又會出現兩個問題:
- 因為是分布式架構(不同的服務模塊在不同的主機上),服務消費方怎么去發現多個可以使用的提供服務(服務發現問題)?
- 還有,當服務消費方法發現可以使用的多個服務后,怎么從多個服務中選擇其中的一個?(服務注冊、負載均衡問題——選擇策略)
使用Eureka就可以解決上述問題,
1.3引入Eureka專案架構分析
圖示是分布式架構,每個模塊都在不同的主機上
- 會員中心-提供服務模塊,在專案中,會做成集群,提供高可用性(某個提供服務模塊宕機,其他服務模塊可以繼續提供服務)
- Eureka Server 有必要的話,也可以做成集群(同理,防止宕機,提供高可用性)
- Eureka 包含兩個組件∶Eureka Server 和 Eureka Client(EurekaClient 在服務消費&服務提供方都要引入)
- Eureka Server 提供注冊服務,各個微服務節點(圖例的服務消費&服務提供方)通過配置啟動后,會在 Eureka Server 中進行注冊,這樣 EurekaServer 中的服務注冊表中將會存盤所有可用服務節點的資訊,服務節點的資訊可以在 Eureka 提供的界面中直觀看到,
- Eureka Client 通過注冊中心進行訪問,是一個 Java 客戶端,用于簡化 Eureka Server 的互動,客戶端同時也具備一個內置的、使用輪詢(round-robin))負載演算法的負載均衡器,在所有 Eurek Client 應用啟動后,將會向 Eureka Server 發送心跳(默認周期為 30 秒),目的是告訴 Eureka Server 自己所在的微服務模塊可以正常作業 ,如果 Eureka Server 在多個心跳周期內(默認 90 秒)沒有接收到某個節點的心跳,EurekaServer 將會從服務注冊表中把這個服務節點移除,
1.4服務治理介紹
服務治理即服務管理:當專案中有多個服務的時候,怎么去管理這些服務,
Eureka 實作服務治理:
在傳統的 rpc (remote procedure call)遠程呼叫框架中,每個服務與服務之間的依賴關系比較復雜,管理也比較困難,所以需要管理服務之間的依賴關系,服務治理實作服務呼叫、負載均衡、容錯等功能,實作服務發現與注冊,
二說分布式開發
1.5服務注冊和發現
- Eureka 采用 CS[Client-Server] 設計架構,Eureka Server 作為服務注冊功能的服務器,成為服務注冊中心,
- 系統中的其他微服務,使用 Eureka 的客戶端連接到 Eureka Server 并維持心跳連接,通過 Eureka Server 來監控系統中各個微服務是否正常運行,
- 當每個服務器啟動的時候,會把當前自己服務器的資訊,比如服務地址、通訊地址等,以別名方式注冊到服務注冊中心(Eureka Server),
- 服務消費者或者服務提供者,以服務別名的方式去注冊中心獲取實際的服務提供者的通訊地址,然后通過 RPC 呼叫服務,
2.創建單機版Eureka Server-注冊中心
2.1需求說明
演示創建單機版的Eureka Server,集群版的后面再使用,
2.2實作步驟
2.2.1創建Module&完成配置
(1)創建 e-commerce-eureka-server-9001 微服務模塊 [作為注冊中心]
選中父專案并右鍵--New--Module--Maven--直接點擊next--根據下圖配置--Finish
(2)修改本模塊的pom.xml,加入依賴
<!--引入相關依賴,版本都使用父專案宣告的版本-->
<dependencies>
<!--引入Eureka Server場景啟動器,使用版本仲裁-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--web-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--actuator-starter 是 springboot程式的監控系統,可以實作系統的健康監測
可以通過http://localhost:9001/actuator看到相關的連接和資訊-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--test-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--通用模塊的jar包-e_commerce_center_common-api-->
<dependency>
<groupId>com.li.springcloud</groupId>
<artifactId>e_commerce_center_common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
(3)創建application.yml,配置服務埠
server:
port: 9001
#配置Eureka-server
eureka:
instance:
hostname: localhost #服務實體名
client: #如果Eureka是一個集群,那么相互兩個Eureka之間也可以當做對方為客戶端
#配置是否向注冊中心注冊自己
register-with-eureka: false
#表示自己就是注冊中心,作用是維護注冊的服務實體,不需要去檢索服務
fetch-registry: false
service-url: #設定于 Eureka server 的互動模塊,查詢服務和注冊服務都需要依賴這個地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
(4)創建主啟動類 EurekaApplication.java
package com.li.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author 李
* @version 1.0
*/
@EnableEurekaServer //表示該程式作為EurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
2.2.2完成測驗
啟動主程式,在瀏覽器訪問設定的ip+埠,已經能夠看到Eureka的監控頁面:
2.3將其他微服務模塊注冊到Eureka
2.3.1注冊member-service-provider-10000
將member-service-provider-10000作為EurekaClient,注冊到注冊中心(e-commerce-eureka-server-9001),成為服務提供者
(1)在本模塊的pom.xml中引入EurekaClient依賴
<!--引入EurekaClient場景啟動器starter-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)修改本模塊的application.yml,添加如下配置:
#配置Eureka-Client
eureka:
client:
register-with-eureka: true #將自己注冊到EurekaServer
#表示從EurekaServer抓取注冊資訊
fetch-registry: true
service-url:
#表示將自己注冊到哪個EurekaServer
defaultZone: http://localhost:9001/eureka
instance:
# 消費端地址
ip-address: localhost
#以IP地址的方式向eureka進行注冊,域名變ip
prefer-ip-address: true
(3)在本模塊的主啟動類添加注解@EnableEurekaClient,將該程式標識為EurekaClient
(4)完成測驗:
先啟動EurekaServer(e-commerce-eureka-server-9001),再啟動EurekaServer(member-service-provider-10000),然后在瀏覽器中訪問EurekaServer的監控頁面,可以看到注冊中心已經檢測到一個Eureka實體:
2.3.2注冊member-service-consumer-80
將member-service-consumer-80也作為EurekaClient注冊到注冊中心(e-commerce-eureka-server-9001),并且可以拉取注冊中心提供的服務資訊,
步驟、代碼和2.3.1一致:
(1)修改本模塊的pom.xml,添加EurekaClient的依賴
(2)在本模塊的application.yml中進行EurekaClient的配置
(3)在本模塊的主啟動類添加注解@EnableEurekaClient,將該程式標識為EurekaClient
(4)先啟動EurekaServer,再啟動本模塊,然后在瀏覽器中訪問EurekaServer的監控頁面,可以看到注冊中心已經檢測到本模塊的EurekaClient實體:
如果上面的Status顯示的是電腦名、localhost而不是ip地址,解決方案:
配置Eureka時Status顯示的是電腦名而不是localhost及ipAddr顯示為本機ip的問題
2.4Eureka注冊中心的維護機制
2.5Eureka自我保護模式
在默認情況下,Eureka會啟動自我保護模式(如圖紅字)
2.5.1自我保護模式是什么
Eureka自我保護機制
默認情況下,Eureka Client定時向Eureka Server端發送心跳包,如果Eureka Server在一定時間內沒有收到某個微服務實體的心跳,Eureka Server將會注銷該實體(默認90s)
但是當網路磁區故障發生(延時、卡頓、擁擠)時,微服務與Eureka Server之間無法正常通信,以上的注銷行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該注銷這個微服務的,
Eureka 通過“自我保護模式”來解決這個問題——當EurekaServer節點在短時間內丟失過多客戶端時,Eureka Server 就會進入自我保護模式,開啟自我保護模式之后,不會剔除微服務,因為客戶端還能發送心跳,可能只是網路延遲問題,
綜上,自我保護是一種應對網路例外的安全保護措施,它的架構哲學是寧可同時保留所有微服務(健康的、不健康的微服務都會保留),也不盲目注銷任何健康的微服務,
一句話:開啟自我保護模式后,如果某時刻某一個微服務不可用了,Eureka不會立刻清理,依舊會對該服務的資訊進行保存,
- 自我保護屬于CAP里面的AP分支,即:保證可用性、磁區容錯性,
CAP原則:分布式系統中,C:一致性;A:可用性;P:磁區容錯性,CAP理論詳解
驗證下 Eureka 的自我保護機制:
-
啟動 member-service-provider-10000 和 e-commerce-eureka-server-9001
-
讓 member-service-provider-10000 正確的注冊
-
然后關閉 member-service-provider-10000,觀察注冊的 member-service-provider-10000 服務是否還在
注意不能通過idea直接關閉,詳見:自我保護機制開啟了但是服務還是"被刪掉了"
2.5.2如何禁用自我保護模式(不推薦)
在生產環境中一般不禁用自我保護模式
在Eureka Server端的組態檔中:
#配置Eureka-server
eureka:
server:
enable-self-preservation: false #禁用自我保護模式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549265.html
標籤:Java
