天天看點

SpringCloud建構微服務之Eureka叢集

什麼是叢集?

在講解如何搭建eureka叢集前,先給大家普及一下叢集的概念,有些小夥伴可能還不知道什麼是叢集。

說到叢集可能就有人會想到分布式,可能有很多人對分布式和叢集這兩個概念有點混淆:

  • 分布式:将一套系統拆分成不同子系統部署在不同伺服器上
  • 叢集:部署多個相同的子系統在不同的伺服器上

分布式的每一個子系統,完成的是不同的業務,一台服務挂了,那麼這個業務功能就無法通路了,甚至可能會影響到其他業務。而叢集是多個子系統完成的是一個業務,正因為這樣,其中一台服務挂了,其他服務節點可以頂上來,進而保證了服務的健壯性。

是以說,叢集可以了解為:你中有我,我中有你,手拉手肩并肩,一起保證服務的健壯性

Eureka叢集原理



SpringCloud建構微服務之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

。如下圖所示:

SpringCloud建構微服務之Eureka叢集

現在叢集的雛形已經有了,下面我們來一步步實作。

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/

SpringCloud建構微服務之Eureka叢集

可以看到

Eureka7001

上挂着

eureka7002

eureka7003

,并且使用者服務也成功注冊到該注冊中心

接着通路

Eureka7002

:http://eureka7002:7002/

SpringCloud建構微服務之Eureka叢集

可以看到

Eureka7002

上挂着

eureka7001

eureka7003

,并且使用者服務也成功注冊到該注冊中心

接着通路

Eureka7003

:http://eureka7003:7003/

SpringCloud建構微服務之Eureka叢集

可以看到

Eureka7003

上挂着

eureka7001

eureka7002

,并且使用者服務也成功注冊到該注冊中心

繼續閱讀