SpringCloud學習系列之一 ----- 搭建一個高可用的註冊中心(Eureka)

来源:https://www.cnblogs.com/xuwujing/archive/2019/01/14/10269570.html
-Advertisement-
Play Games

本篇主要介紹的是SpringCloud相關知識、微服務架構以及搭建一個高可用的服務註冊與發現的服務模塊(Eureka)。 ...


前言

本篇主要介紹的是SpringCloud相關知識、微服務架構以及搭建一個高可用的服務註冊與發現的服務模塊(Eureka)。

SpringCloud介紹

Spring Cloud是在Spring Boot的基礎上構建的,用於簡化分散式系統構建的工具集,為開發人員提供快速建立分散式系統中的一些常見的模式。

例如:

配置管理(configuration management),服務發現(service
discovery),斷路器(circuit breakers),智能路由( intelligent routing),微代理(micro-proxy),控制匯流排(control bus),一次性令牌( one-time okens),全局鎖(global locks),領導選舉(leadership election),分散式會話(distributed sessions),集群狀態(cluster state)等等。

微服務架構是什麼

微服務架構風格是一種將單個應用程式開發為一套小型服務的方法,每個小型服務都在自己的流程中運行,並與輕量級機制(通常是HTTP資源API)進行通信。這些服務圍繞業務功能構建,可通過全自動部署機制獨立部署。這些服務至少集中管理,可以用不同的編程語言編寫,並使用不同的數據存儲技術。

SpringCloud Eureka

Eureka 介紹

Eureka是Netflix開源的一款提供服務註冊和發現的產品,它提供了完整的Service Registry和Service Discovery實現。也是springcloud體系中最重要最核心的組件之一。

Eureka主要由兩個組件組成:Eureka伺服器和Eureka客戶端。
Eureka伺服器用作服務註冊伺服器。
Eureka客戶端是一個java客戶端,用來簡化與伺服器的交互、作為輪詢負載均衡器,並提供服務的故障切換支持。

開發準備

開發環境

  • JDK:1.8
  • SpringBoot:2.1.1.RELEASE
  • SpringCloud:Finchley

註:不一定非要用上述的版本,可以根據情況進行相應的調整。需要註意的是SpringBoot2.x以後,jdk的版本必須是1.8以上!

確認了開發環境之後,我們再來添加相關的pom依賴。

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

註: 基於SpringBoot1.x以上SpringCloud是Dalston版本的eureka 依賴是 <artifactId>spring-cloud-starter-eureka</artifactId>,少了個 netflix 。SpringCloud的版本命名方式是通過倫敦的地方來命名的,版本順序是根據首字母的順序來的。

SpringCloud Eureka Hello World

我們先來實現Eureka的Hello World版,其實也就是實現簡單的服務註冊和發現功能。

服務端

首先建立一個服務端的工程,添加如上的依賴之後,在application.properties添加如下的配置:

配置信息:

spring.application.name=springcloud-eureka-client
server.port=8000
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

配置說明:

  • spring.application.name: 這個是指定服務名稱。
  • server.port:服務指定的埠。
  • eureka.client.register-with-eureka:表示是否將自己註冊到Eureka Server,預設是true。
  • eureka.client.fetch-registry:表示是否從Eureka Server獲取註冊信息,預設為true。
  • eureka.client.serviceUrl.defaultZone: 這個是設置與Eureka Server交互的地址,客戶端的查詢服務和註冊服務都需要依賴這個地址。

完成配置信息的添加後,我們再來看代碼如何實現。
在服務端這邊只需要在SpringBoot啟動類添加@EnableEurekaServer註解就可以了,該註解表示此服務是一個服務註冊中心服務。

代碼示例:

    @EnableEurekaServer
    @SpringBootApplication
    public class App {
      public static void main(String[] args) {
          SpringApplication.run(App.class, args);
          System.out.println("註冊中心服務啟動...");
      }
    }

客戶端

這裡我們在新建一個客戶端的項目,添加如上的依賴之後,在application.properties添加如下的配置:

配置信息:

spring.application.name=springcloud-eureka-client
server.port=9001
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

配置說明:

  • spring.application.name: 這個是客戶端的服務名稱。如果有多個服務使用同一個名稱但是訪問地址不同,結合ribbon 使用,則可以實現負載均衡功能。
  • server.port:服務指定的埠。
  • eureka.client.serviceUrl.defaultZone: 註冊中心服務端的地址。

服務端這邊的實現也很簡單,只需在啟動類上添加@EnableDiscoveryClient該註解即可,使用該註解表示該項目就具有了服務註冊的功能。

代碼示例:

    @SpringBootApplication
    @EnableDiscoveryClient
    public class App {
    
        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
            System.out.println("客戶端服務啟動...");
        }
    }

功能測試

完成如上的工程開發之後,我們依次啟動服務端和客戶端程式,然後在瀏覽器界面輸入:http://localhost:8000/,即可查看註冊中心的信息。

訪問界面地址:

在這裡插入圖片描述

通過上述示例圖中,可以看到Eureka啟動成功了,並且有一個服務進行註冊了。

成功的實現了服務註冊功能之後,我們來測試下Eureka服務的保護機制。
這裡我們先關閉客戶端,查看界面信息,發現沒什麼改變,等待大約15分鐘左右之後,再到Eureka界面查看信息,發現出現了一長串紅字描述,描述的語句如下:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

翻譯之後的意思:

緊急!EUREKA可能錯誤地聲稱實例已經啟動,而實際上並沒有。續訂小於閾值,因此實例不會為了安全而過期。

界面示例圖:

在這裡插入圖片描述

這裡就順便說下Eureka的自我保護機制。

自我保護模式正是一種針對網路異常波動的安全保護措施,使用自我保護模式能使Eureka集群更加的健壯、穩定的運行。

自我保護機制的工作機制是如果在15分鐘內超過85%的客戶端節點都沒有正常的心跳,那麼Eureka就認為客戶端與註冊中心出現了網路故障,Eureka Server自動進入自我保護機制,此時會出現以下幾種情況:

  1. Eureka Server不再從註冊列表中移除因為長時間沒收到心跳而應該過期的服務。
  2. Eureka Server仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上,保證當前節點依然可用。
  3. 當網路穩定時,當前Eureka Server新的註冊信息會被同步到其它節點中。

因此Eureka Server可以很好的應對因網路故障導致部分節點失聯的情況,而不會像ZK那樣如果有一半不可用的情況會導致整個集群不可用而變成癱瘓。

自我保護機制的相關配置如下:

服務端的配置:

  • eureka.server.enable-self-preservation: 該配置可以移除這種自我保護機制,防止失效的服務也被一直訪問 (Spring Cloud預設該配置是 true)。
  • eureka.server.eviction-interval-timer-in-ms:該配置可以修改檢查失效服務的時間,每隔10s檢查失效服務,並移除列表 (Spring Cloud預設該配置是 60s)

客戶端的配置:

  • eureka.instance.lease-renewal-interval-in-seconds: 該配置指示eureka客戶端需要向eureka伺服器發送心跳的頻率 (Spring Cloud預設該配置是 30s)。
  • eureka.instance.lease-expiration-duration-in-seconds: 該配置指示eureka伺服器在接收到最後一個心跳之後等待的時間,然後才能從列表中刪除此實例 (Spring Cloud預設該配置是 90s)。

這裡順便說下Eureka的的心跳機制。

Eureka Client需要每30秒給Eureka Server發一次心跳,同時更新Server上最新的註冊信息到本地,如果Server多次沒有收到來自客戶端的心跳,那麼在90秒內會被Server上剔除。

高可用的註冊中心

上述的服務註冊中心示例是單點的,如果在生產環境中就顯得不適合,顯然這並不適合應用於線上生產環境。作為分散式系統最重要的註冊服務功能,為了使其高可用,使用集群是最普遍的方式。Eureka可以通過互相註冊的方式來實現高可用的部署。

Eureka實現相互註冊的方式很簡單,只需要將各個服務端的地址相互進行配置即可。
那麼我們再來新建兩個服務端的工程,其中配置信息如下:

server2配置信息:

spring.application.name=springcloud-eureka-server
server.port=8002
eureka.instance.hostname = server2
eureka.client.serviceUrl.defaultZone=http://server3:8003/eureka/

server3配置信息:

spring.application.name=springcloud-eureka-server
server.port=8003
eureka.instance.hostname = server3
eureka.client.serviceUrl.defaultZone=http://server2:8002/eureka/

上述的配置在之前已經說過了,這裡就不在過多描述了。這裡的服務端配置和之前項目的服務端配置略有不同,允許自己進行註冊了。並且這裡的eureka.instance.hostname相當於是對服務地址起一個別名,也可以不配置,預設將會使用IP進行查找。eureka.client.serviceUrl.defaultZone這裡配置的是另一個服務端的地址,如果是多個就通過 ","逗號隔開。

因為這裡使用了別名進行區分服務,所以需要在hosts文件添加如下配置,用於做映射。

127.0.0.1     server2
127.0.0.1     server3

hosts文件地址:

Windows 系統地址:C:\Windows\System32\drivers\etc\hosts

Linux系統地址: /etc/hosts

配置完成之後,啟動這兩個服務,然後在瀏覽器輸入:
http://server2:8002/

http://server3:8003/
即可查看信息.

高可用註冊中心示例圖:

在這裡插入圖片描述

這裡我們把之前的客戶端程式的配置改下,改成指定這個高可用註冊中心的地址,然後在關閉其中一個服務,查看是否能夠正常的使用。

示例圖:

在這裡插入圖片描述

可以看到其中一個服務可以正常運行和使用!

其他

項目地址

基於SpringBoot2.x、SpringCloud的Finchley版本開發的地址:https://github.com/xuwujing/springcloud-study

基於SpringBoot1.x、SpringCloud 的Dalston版本開發的地址: https://github.com/xuwujing/springcloud-study-old

如果感覺項目不錯,希望能給個star,謝謝!

音樂推薦

挺有節奏感的一首純音樂!

原創不易,如果感覺不錯,希望給個推薦!您的支持是我寫作的最大動力!
版權聲明:
作者:虛無境
博客園出處:http://www.cnblogs.com/xuwujing
CSDN出處:http://blog.csdn.net/qazwsxpcm    
個人博客出處:http://www.panchengming.com


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、環境 eclipse mar jdk 1.7 apache-maven-3.3.3 註意: 1> eclipse mar 已集成maven插件,我們只需要配置成自己的maven即可,類似eclipse集成tomcat 2> maven3.3+版本需要的jdk1.7以上的版本 二、本地安裝和配置m ...
  • 在設計介面時,有很多因素要考慮,如介面的業務定位,介面的安全性,介面的可擴展性、介面的穩定性、介面的跨域性、介面的協議規則、介面的路徑規則、介面單一原則、 介面過濾和介面組合等諸多因素,本篇文章將簡要分析這些因素。 一 規範性建議 1.職責原則 在設計介面時,必須明確介面的職責,即介面類型,介面應解 ...
  • 迭代器模式是Java和.NET編程環境中非常常用的設計模式。這種模式用於順序訪問集合對象的元素,不需要知道集合對象的底層表示 ...
  • JDK(Java SE Development Kit),Java標準開發包,它提供了編譯、運行Java程式所需的各種工具和資源,包括Java編譯器、Java運行時環境,以及常用的Java類庫等。 ...
  • 題意 "題目鏈接" Sol 直接掛隊爺的題解了 分塊題好難調啊qwq cpp include define LL long long using namespace std; const int MAXN = 1e6 + 10; const LL INF = 6e18; template inlin ...
  • 1. if 條件語句   語法:   示例:   if 語句支持嵌套:    多條件判斷 if elif else   當有多個條件時,總是用 if 判斷,不是那麼方便。為了偷懶,我們引入了 elif ...
  • 基本數據類型和string之間的轉換 (1) 基本類型轉string 使用 fmt.Sprintf(“%參數”, 表達式) a. 通用: 參數含義 %v 值的預設格式表示 %+v 類似%v,但輸出結構體時會添加欄位名 %#v 值的Go語法表示 %T 值的類型的Go語法表示 %% 百分號 b. 布爾值 ...
  • Django 系列博客(十一) 前言 本篇博客介紹使用 ORM 來進行多表的操作,當然重點在查詢方面。 創建表 實例: 作者模型:一個作者有姓名和年齡。 作者詳細模型:把作者的詳情放到詳情表,包含生日,手機號,家庭住址等信息。作者詳情模型和作者模型之間是一對一的關係(one to one)。 出版商 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...