什麼是叢集?
在講解如何搭建eureka叢集前,先給大家普及一下叢集的概念,有些小夥伴可能還不知道什麼是叢集。
說到叢集可能就有人會想到分布式,可能有很多人對分布式和叢集這兩個概念有點混淆:
- 分布式:将一套系統拆分成不同子系統部署在不同伺服器上
- 叢集:部署多個相同的子系統在不同的伺服器上
分布式的每一個子系統,完成的是不同的業務,一台服務挂了,那麼這個業務功能就無法通路了,甚至可能會影響到其他業務。而叢集是多個子系統完成的是一個業務,正因為這樣,其中一台服務挂了,其他服務節點可以頂上來,進而保證了服務的健壯性。
是以說,叢集可以了解為:你中有我,我中有你,手拉手肩并肩,一起保證服務的健壯性
Eureka叢集原理

基本原理
上圖是來自eureka的官方架構圖,這是基于叢集配置的eureka;
- 處于不同節點的eureka通過Replicate進行資料同步
- Application Service為服務提供者
- Application Client為服務消費者
- Make Remote Call完成一次服務調用
服務啟動後向Eureka注冊,Eureka Server會将注冊資訊向其他Eureka Server進行同步,當服務消費者要調用服務提供者,則向服務注冊中心擷取服務提供者位址,然後會将服務提供者位址緩存在本地,下次再調用時,則直接從本地緩存中取,完成一次調用。
當服務注冊中心Eureka Server檢測到服務提供者因為當機、網絡原因不可用時,則在服務注冊中心将服務置為DOWN狀态,并把目前服務提供者狀态向訂閱者釋出,訂閱過的服務消費者更新本地緩存。
服務提供者在啟動後,周期性(預設30秒)向Eureka Server發送心跳,以證明目前服務是可用狀态。Eureka Server在一定的時間(預設90秒)未收到用戶端的心跳,則認為服務當機,登出該執行個體。
Eureka叢集搭建
在搭建eureka叢集前,咱們先來回顧一下,單個eureka服務的時候,是如何來配置的
server:
port: 7001
eureka:
instance:
hostname: eureka7001 #eureka服務端的執行個體名稱
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址。(單機)
從上面的配置檔案可以看出,
eureka7001
就是一個eureka服務,所有服務都是往這台服務上注冊。那麼我們如何去搭建一個 Eureka 叢集呢?假設現在有三個
Eureka
服務:
eureka7001
、
eureka7002
和
eureka7003
。
為了展現出叢集的你中有我,我中有你,不難想象,
eureka7001
中應該挂上
eureka7002
和
eureka7003
;
eureka7002
中應該挂上
eureka7001
和
eureka7003
;
eureka7003
中應該挂上
eureka7001
和
eureka7002
。如下圖所示:
現在叢集的雛形已經有了,下面我們來一步步實作。
Eureka7001改造
修改defaultZone配置。
server:
port: 7001
eureka:
instance:
hostname: eureka7001 #eureka服務端的執行個體名稱
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址。(單機)
defaultZone: http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址。(叢集)
搭建Eureka7002
将Eureka7001拷貝一份,修改其配置檔案即可
server:
port: 7002
eureka:
instance:
hostname: eureka7002 #eureka服務端的執行個體名稱
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址。(單機)
defaultZone: http://eureka7001:7001/eureka/,http://eureka7003:7003/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址。(叢集)
搭建Eureka7003
步驟同上
server:
port: 7003
eureka:
instance:
hostname: eureka7003 #eureka服務端的執行個體名稱
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址。(單機)
defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址。(叢集)
host映射
從前面的配置檔案可以看到,為了區分不同的服務,
hostname
不再是
localhost
了,是以我們還要修改一下
host
檔案,此處環境為Mac,Windows下如何修改host檔案自行百度
打開指令行,輸入
sudo vi /private/etc/hosts
修改host檔案。注意:執行此指令需要輸入使用者密碼
将一下内容添加到host檔案中,儲存即可:
127.0.0.1 eureka7001
127.0.0.1 eureka7002
127.0.0.1 eureka7003
使用者服務提供者改造
因為現在是叢集模式,所有我們需要将服務分别注冊到三個eureka中,同樣是修改
defaultZone
配置
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis-config.xml # mybatis配置檔案所在路徑
type-aliases-package: com.chaytech.model.* # 所有Entity别名類所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射檔案
spring:
application:
name: user-provider
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 目前資料源操作類型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包
url: jdbc:mysql://127.0.0.1:3306/spring_cloud_db01 # 資料庫名稱
username: root
password: root
dbcp2:
min-idle: 5 # 資料庫連接配接池的最小維持連接配接數
initial-size: 5 # 初始化連接配接數
max-total: 5 # 最大連接配接數
max-wait-millis: 200 # 等待連接配接擷取的最大逾時時間
eureka:
client: #用戶端注冊進eureka服務清單内
service-url:
#defaultZone: http://localhost:7001/eureka (單機)
defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/ #(叢集)
info:
app.name: user-provider
build.artifactId: $project.artifactId$
build.version: $project.version$
測試
通過前面的步驟已經将eureka叢集搭建好了,下面我們來測試一下:
依次啟動
Eureka7001、Eureka7002、Eureka7003、UserProvider8001
等服務
通路
Eureka7001
:http://eureka7001:7001/
可以看到
Eureka7001
上挂着
eureka7002
和
eureka7003
,并且使用者服務也成功注冊到該注冊中心
接着通路
Eureka7002
:http://eureka7002:7002/
可以看到
Eureka7002
上挂着
eureka7001
和
eureka7003
,并且使用者服務也成功注冊到該注冊中心
接着通路
Eureka7003
:http://eureka7003:7003/
可以看到
Eureka7003
上挂着
eureka7001
和
eureka7002
,并且使用者服務也成功注冊到該注冊中心