主頁 > 後端開發 > day04-SpringCloud Eureka-服務注冊與發現01

day04-SpringCloud Eureka-服務注冊與發現01

2023-04-07 07:25:48 後端開發

SpringCloud Eureka-服務注冊與發現01

1.Eureka介紹

1.1學習Eureka前的說明

目前主流的服務注冊&發現的組件是 Nacos,但是 Eureka 作為老牌經典的服務注冊&發現技識訓是有必要學習一下,原因:

(1)一些早期的分布式微服務專案使用的是 Eureka,在作業中完全有可能遇到這種情況,

(2)后期的服務注冊&發現組件/技術,都參考了 Eureka 設計和理念,學習了 Eureka 后, 我們上手 Nacos 容易很多,而且可以理解得更深刻,

1.2當前架構問題分析

image-20230405200415420

在企業級專案中,服務消費訪問請求會存在高并發現象,如果只有一個會員中心-提供服務,可用性很差——如果該模塊宕機,那么整個分布式應用就不能使用了,所以,會員中心提供服務往往是一個集群,有多個會員中心-提供服務模塊,

這時又會出現兩個問題:

  1. 因為是分布式架構(不同的服務模塊在不同的主機上),服務消費方怎么去發現多個可以使用的提供服務(服務發現問題)?
  2. 還有,當服務消費方法發現可以使用的多個服務后,怎么從多個服務中選擇其中的一個?(服務注冊、負載均衡問題——選擇策略)

使用Eureka就可以解決上述問題,

1.3引入Eureka專案架構分析

image-20230405200235500

圖示是分布式架構,每個模塊都在不同的主機上

  1. 會員中心-提供服務模塊,在專案中,會做成集群,提供高可用性(某個提供服務模塊宕機,其他服務模塊可以繼續提供服務)
  2. Eureka Server 有必要的話,也可以做成集群(同理,防止宕機,提供高可用性)
  3. Eureka 包含兩個組件∶Eureka Server 和 Eureka Client(EurekaClient 在服務消費&服務提供方都要引入)
  4. Eureka Server 提供注冊服務,各個微服務節點(圖例的服務消費&服務提供方)通過配置啟動后,會在 Eureka Server 中進行注冊,這樣 EurekaServer 中的服務注冊表中將會存盤所有可用服務節點的資訊,服務節點的資訊可以在 Eureka 提供的界面中直觀看到,
  5. 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服務注冊和發現

  1. Eureka 采用 CS[Client-Server] 設計架構,Eureka Server 作為服務注冊功能的服務器,成為服務注冊中心,
  2. 系統中的其他微服務,使用 Eureka 的客戶端連接到 Eureka Server 并維持心跳連接,通過 Eureka Server 來監控系統中各個微服務是否正常運行,
  3. 當每個服務器啟動的時候,會把當前自己服務器的資訊,比如服務地址、通訊地址等,以別名方式注冊到服務注冊中心(Eureka Server),
  4. 服務消費者或者服務提供者,以服務別名的方式去注冊中心獲取實際的服務提供者的通訊地址,然后通過 RPC 呼叫服務,

2.創建單機版Eureka Server-注冊中心

2.1需求說明

演示創建單機版的Eureka Server,集群版的后面再使用,

image-20230405212427879

2.2實作步驟

2.2.1創建Module&完成配置

(1)創建 e-commerce-eureka-server-9001 微服務模塊 [作為注冊中心]

選中父專案并右鍵--New--Module--Maven--直接點擊next--根據下圖配置--Finish

image-20230405214537879

(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的監控頁面:

image-20230406174125199

2.3將其他微服務模塊注冊到Eureka

2.3.1注冊member-service-provider-10000

將member-service-provider-10000作為EurekaClient,注冊到注冊中心(e-commerce-eureka-server-9001),成為服務提供者

image-20230406174832427

(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

image-20230406180742196

(4)完成測驗:

先啟動EurekaServer(e-commerce-eureka-server-9001),再啟動EurekaServer(member-service-provider-10000),然后在瀏覽器中訪問EurekaServer的監控頁面,可以看到注冊中心已經檢測到一個Eureka實體:

image-20230406181728269

2.3.2注冊member-service-consumer-80

將member-service-consumer-80也作為EurekaClient注冊到注冊中心(e-commerce-eureka-server-9001),并且可以拉取注冊中心提供的服務資訊,

image-20230406182018260

步驟、代碼和2.3.1一致:

(1)修改本模塊的pom.xml,添加EurekaClient的依賴

(2)在本模塊的application.yml中進行EurekaClient的配置

(3)在本模塊的主啟動類添加注解@EnableEurekaClient,將該程式標識為EurekaClient

(4)先啟動EurekaServer,再啟動本模塊,然后在瀏覽器中訪問EurekaServer的監控頁面,可以看到注冊中心已經檢測到本模塊的EurekaClient實體:

image-20230406182727107

如果上面的Status顯示的是電腦名、localhost而不是ip地址,解決方案:

配置Eureka時Status顯示的是電腦名而不是localhost及ipAddr顯示為本機ip的問題

2.4Eureka注冊中心的維護機制

image-20230406183853968

2.5Eureka自我保護模式

在默認情況下,Eureka會啟動自我保護模式(如圖紅字)

image-20230406192441110

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 的自我保護機制:

  1. 啟動 member-service-provider-10000 和 e-commerce-eureka-server-9001

  2. 讓 member-service-provider-10000 正確的注冊

  3. 然后關閉 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

上一篇:# Java筆記(12) 靜態代理

下一篇:Java筆記(13) 簡單的Lambda運算式

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more