• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • SpringCloud 學習筆記(2)- Eureka 服務注冊與發現

    標簽: SpringBoot

    文章目錄

    1、Eureka 基礎知識

    1.1、什么是服務治理?

    Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務治理。

    在傳統的 RPC 遠程調用框架中,管理每個服務與服務之間依賴關系比較復雜,管理比較復雜,所以需要使用服務治理,管理服務于服務之間依賴關系,可以實現服務調用負載均衡容錯等,實現服務發現與注冊

    1.2、什么是服務注冊與發現?

    Eureka 采用了 CS 的設計架構,Eureka Sever 作為服務注冊功能的服務器,它是服務注冊中心。而系統中的其他微服務,使用 Eureka 的客戶端連接到 Eureka Sever 并維持心跳連接。這樣系統的維護人員就可以通過 Eureka Server 來監控系統中各個微服務是否正常運行。

    在服務注冊與發現中,有一個注冊中心。當服務器啟動的時候,會把當前自己服務器的信息比如:服務地址通訊地址等以別名方式注冊到注冊中心上。另一方(消費者服務提供者),以該別名的方式去注冊中心上獲取到實際的服務通訊地址,然后再實現本地 NPC 調用 RPC 遠程調用框架。

    核心設計思想:在于注冊中心,因為使用注冊中心管理每個服務與服務之間的一個依賴關系(服務治理概念)。在任何 RPC 遠程框架中,都會有一個注冊中心(存放服務地址相關信息(接口地址))。

    在這里插入圖片描述

    1.3、Eureka 兩大組件

    Eureka Server 提供服務注冊服務

    各個微服務節點通過配置啟動后,會在 Eureka Server 中進行注冊,這樣 Eureka Server 中的服務注冊表中將會存儲所有可用服務節點信息,服務節點的信息可以在界面中直觀看到。

    Eureka Client 通過注冊中心進行訪問

    是一個 Java 客戶端,用于簡化與 Eureka Server 的交互,客戶端同時也具備一個內置的、使用輪詢(round-robin)負載算法的負載均衡器。在應用啟動后,將會向 Eureka Server 發送心跳(默認周期為 30 秒)。如果 Eureka Server 在多個心跳周期內沒有接收到某個節點的心跳,Eureka Server 將會從服務注冊表中把這個服務節點移除(默認 90 秒)。

    2、單機 Eureka 構建步驟

    2.1、建立 cloud-eureka-server7001 模塊

    查看父 pom

    <!-- 模塊說明:這里聲明多個子模塊 -->
    <modules>
        <module>cloud-provider-payment8001</module>
        <module>cloud-consumer-order80</module>
        <module>cloud-api-commons</module>
        <!-- 新加入的模塊 -->
        <module>cloud-eureka-server7001</module>
    </modules>
    

    2.2、更改 pom 文件

    以前老版本(2018)

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    

    現在新版本(2020.2)

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    

    更改 pom 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>springcloud-parent</artifactId>
            <groupId>com.springcloud-demo</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>cloud-eureka-server7001</artifactId>
    
        <dependencies>
    
            <!-- eureka-server -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
            
            <!-- 引入自己定義的 api 通用包 -->
            <dependency>
                <groupId>com.springcloud-demo</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>${project.version}</version>
            </dependency>
    
            <!-- web -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- 監控 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!-- 單元測試 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!-- 熱部署 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
        </dependencies>
    
    </project>
    

    2.3、寫 YML

    server:
      port: 7001
    
    spring:
      application:
        name: eureka-server
    eureka:
      instance:
        hostname: localhost  # eureka 服務端的實例名字
      client:
        register-with-eureka: false # 標識不向注冊中心注冊自己
        fetch-registry: false  # 表示自己就是注冊中心, 職責是維護服務實例, 并不需要去檢索服務
        service-url:
          # 設置與 eureka server 交互的地址查詢服務和注冊服務都需要依賴這個地址
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    

    2.4、主啟動類(新建)

    注意:@EnableEurekaServer

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaMain7001 {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaMain7001.class);
        }
    }
    

    2.5、測試

    http://localhost:7001/

    在這里插入圖片描述

    3、EurekaClient 端

    3.1、將 cloud-provider-payment8001 注冊進 Eureka Server 成為服務提供者 provider

    3.1.1、更改 pom 文件(cloud-provider-payment8001)

    以前老版本(2018)

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    

    現在新版本(2020.2)

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    

    更改 pom 文件

    <!-- eureka-client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    

    3.1.2、寫 YML(添加)

    eureka:
      client:
        # 表示是否將自己注冊進 Eureka Server, 默認為 true
        register-with-eureka: true
        # 是否從 Eureka Server 抓取已有的注冊信息, 默認為 true, 集群必須設置為 true 才能配合 Ribbon 實現負載均衡
        fetchRegistry: true
        service-url:
          defaultZone: http://localhost:7001/eureka
    

    3.1.3、主啟動(修改)

    注意:@EnableEurekaClient

    @SpringBootApplication
    @EnableEurekaClient
    public class PaymentMain8001 {
    
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8001.class);
        }
    }
    

    3.1.4、測試

    先要(重新)啟動 EurekaServer,不然會觸發保護機制

    http://localhost:7001/
    在這里插入圖片描述

    微服務注冊名配置說明

    在這里插入圖片描述

    3.1.5、自我保護機制

    在這里插入圖片描述

    3.2、將 cloud-consumer-order80 注冊進 Eureka Server 成為服務消費者 consumer

    3.2.1、更改 pom 文件(cloud-consumer-order80)

    <!-- eureka-client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    

    3.2.2、寫 YML(添加)

    eureka:
      client:
        # 表示是否將自己注冊進 Eureka Server, 默認為 true
        register-with-eureka: true
        # 是否從 Eureka Server 抓取已有的注冊信息, 默認為 true, 集群必須設置為 true 才能配合 Ribbon 實現負載均衡
        fetchRegistry: true
        service-url:
          defaultZone: http://localhost:7001/eureka
    

    3.2.3、主啟動(修改)

    注意:@EnableEurekaClient

    @SpringBootApplication
    @EnableEurekaClient
    public class OrderMain {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderMain.class);
        }
    }
    

    3.2.4、測試

    • 先要(重新)啟動 Eureka Server,7001 服務
    • 再啟動服務提供者 provider,8001 服務

    http://localhost:7001/
    在這里插入圖片描述
    在這里插入圖片描述

    4、集群 Eureka 構建步驟

    4.1、Eureka 集群原理說明

    在這里插入圖片描述

    問題:微服務 RPC 遠程服務調用最核心的是什么?

    高可用,試想你的注冊中心只有一個,它如果出故障了會導致整個為服務環境不可用。

    解決辦法

    搭建 Eureka 注冊中心集群,實現負載均衡 + 故障容錯。

    4.2、Eureka Server 集群環境構建步驟

    4.2.1、參考 cloud-eureka-server7001,新建 cloud-eureka-server7002

    4.2.2、更改 pom 文件(cloud-eureka-server7002)

    4.2.3、修改映射配置

    • 找到 C:\Windows\System32\drivers\etc 路徑下的 hosts 文件
      在這里插入圖片描述
    • 修改映射配置添加進 hosts 文件
      • 127.0.0.1 eureka7001.com
      • 127.0.0.1 eureka7002.com
        在這里插入圖片描述

    4.2.4、修改 YML(以前單機)

    1. 7001
    server:
      port: 7001
    
    spring:
      application:
        name: eureka-server
    eureka:
      instance:
        hostname: eureka7001.com  # eureka 服務端的實例名字
      client:
        register-with-eureka: false # 標識不向注冊中心注冊自己
        fetch-registry: false  # 表示自己就是注冊中心, 職責是維護服務實例, 并不需要去檢索服務
        service-url:
          # 設置與 eureka server 交互的地址查詢服務和注冊服務都需要依賴這個地址
          defaultZone: http://eureka7002.com:7002/eureka/
    
    1. 7002
    server:
      port: 7002
    
    spring:
      application:
        name: eureka-server
    eureka:
      instance:
        hostname: eureka7002.com  # eureka 服務端的實例名字
      client:
        register-with-eureka: false # 標識不向注冊中心注冊自己
        fetch-registry: false  # 表示自己就是注冊中心, 職責是維護服務實例, 并不需要去檢索服務
        service-url:
          # 設置與 eureka server 交互的地址查詢服務和注冊服務都需要依賴這個地址
          defaultZone: http://eureka7001.com:7001/eureka/
    

    4.2.5、主啟動

    主啟動(復制 cloud-eureka-server7001 的主啟動類到 7002 即可)

    4.2.6、將支付服務 8001 微服務發布到上面 2 臺 Eureka 集群配置中

    修改 YML

    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  # 集群版
    

    4.2.7、將訂單服務 80 微服務發布到上面 2 臺 Eureka 集群配置中

    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  # 集群版
    

    4.2.8、測試

    1. 先要啟動 Eureka Server,7001/7002 服務
    2. 再要啟動服務提供者 provider,8001 服務
    3. 再要啟動消費者,80 服務

    http://eureka7001.com:7001/
    在這里插入圖片描述

    http://eureka7002.com:7002/
    在這里插入圖片描述

    http://localhost/consumer/listPayment
    在這里插入圖片描述

    4.3、支付服務提供者 8001 集群環境構建

    4.3.1、參考 cloud-provider-payment8001,新建 cloud-provider-payment8002

    4.3.2、更改 pom 文件(cloud-provider-payment8002)

    4.3.3、修改 YML

    server:
      port: 8002
    

    4.3.4、主啟動

    主啟動(復制 cloud-provider-payment8001 的主啟動類到 8002 即可)

    4.3.5、修改 8001/8002 的 Controller

    在這里插入圖片描述

    4.3.6、測試

    在這里插入圖片描述

    在這里插入圖片描述

    4.3.7、負載均衡

    訂單服務訪問地址不能寫死
    在這里插入圖片描述

    使用 @LoadBalanced 注解賦予 RestTemplate 負載均衡的能力
    在這里插入圖片描述

    4.3.8、測試

    1. 先要啟動 Eureka Server,7001/7002 服務
    2. 再要啟動服務提供者 provider,8001 服務
    3. 再要啟動消費者,80 服務
    4. 用 Postman 訪問 http://localhost/consumer/listPayment 測試

    測試結果

    • 負載均衡效果達到
    • 8001/8002 端口服務交替執行
    • Ribbon 和 Eureka 整合后 Consumer 可以直接調用服務而不用再關心地址和端口號,且該服務還有負載功能了

    5、actuator 微服務信息完善

    5.1、主機名稱:服務名稱修改(不暴露主機名稱)

    1. cloud-provider-payment8001
      在這里插入圖片描述
    2. cloud-provider-payment8002
      在這里插入圖片描述

    結果

    在這里插入圖片描述

    5.2、訪問信息有 IP 信息提示

    1. cloud-provider-payment8001
      在這里插入圖片描述
      1. cloud-provider-payment8002
        在這里插入圖片描述

    結果

    在這里插入圖片描述

    6、服務發現 Discovery

    對于注冊進 Eureka 里面的微服務,可以通過服務發現來獲得該服務的信息

    1. 修改 cloud-provider-payment8001/8002 的 controller,添加如下代碼
    /**
     * import org.springframework.cloud.client.discovery.DiscoveryClient;
     */
    @Resource
    private DiscoveryClient discoveryClient;
    
    @GetMapping("/discovery")
    public Object discovery() {
        List<String> services = discoveryClient.getServices();
        for (String service : services) {
            log.info("************Application : {}", service);
        }
    
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.info(instance.getServiceId() + "\t"
                    + instance.getHost() + "\t"
                    + instance.getPort() + "\t"
                    + instance.getUri());
        }
    
        return this.discoveryClient;
    }
    
    1. 8001 主啟動類 @EnableDiscoveryClient

    在這里插入圖片描述

    測試

    先要啟動 EurekaServer,7001/7002 服務
    再啟動 8001 主啟動類,需要稍等一會

    http://localhost:8001/discovery
    在這里插入圖片描述

    7、Eureka 自我保護

    7.1、概述

    保護模式主要用于一組客戶端和 Eureka Server 之間存在網絡分區場景下的保護。一旦進入保護模式,Eureka Server 將會嘗試保護其服務注冊表中的信息,不再刪除服務注冊表中的數據,也就是不會注銷任何微服務。

    如果在 Eureka Server 的首頁看到以下這段提示,則說明 Eureka 進入了保護模式:
    在這里插入圖片描述

    7.2、導致原因

    一句話:某時刻某一個微服務不可用了,Eureka 不會立刻清理,依舊會對該微服務的信息進行保存。

    屬于 CAP 里面的 AP 分支。

    7.2.1、為什么會產生 Eureka 自我保護機制?

    為了防止 Eureka Client 可以正常運行,但是與 Eureka Server 網絡不通情況下,Eureka Server 不會立刻將 Eureka Client 服務剔除。

    7.2.2、什么是自我保護模式?

    默認情況下,如果 Eureka Server 在一定時間內沒有接收到某個微服務實例的心跳,Eureka Server 將會注銷該實例(默認90秒)。

    但是當網絡分區故障發生(延時、卡頓、擁擠)時,微服務與 Eureka Server 之間無法正常通信,以上行為可能變得非常危險了 —— 因為微務本身其實是健康的,此時本不應該注銷這個微服務。

    Eureka 通過 “自我保護模式” 來解決這個問題 —— 當 Eureka Server 節點在時間內丟失過多客戶端時(可能發生了網絡分區故障),那么這個節點就會進入自我保護模式。

    在自我保護模式中,Eureka Server 會保護服務注冊表中的信息,不再注銷任何服務實例。

    它的設計哲學就是寧可保留錯誤的服務注冊信息,也不盲目注銷任何可能健康的服務實例。

    綜上,自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留)也不盲目注銷任何健康的微服務。

    使用自我保護模式,可以讓Eureka集群更加的健壯、穩定。

    7.3、怎么禁止自我保護?(一般生產環境中不會禁止自我保護)

    在這里插入圖片描述

    版權聲明:本文為weixin_44462664原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_44462664/article/details/110867601

    智能推薦

    SpringCloud——服務的注冊與發現Eureka

    一、spring cloud簡介          Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線)。分布式系統的協調導致了樣板模式, 使用Spring Cloud開發人員可以快速地支持實現這些模式的服務和應用程序。他們將在任何分布式環境中運行良好,包括開發...

    springcloud(三)--服務注冊與發現Eureka

    如題,本篇我們來引入SpringCloud中服務注冊與發現組件--Eureka,然后將SIM服務提供者向Eureka服務器進行注冊。  一、Eureka 是什么 Eureka是Netflix開發的服務發現框架,本身是一個基于REST的服務,主要用于定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它集成在其子項目spring-c...

    SpringCloud(一) eureka服務注冊與發現

    一、 Eureka介紹 Eureka是一個基于REST(Representational State Transfer)的服務,主要用于AWS cloud, 提供服務定位(locating services)、負載均衡(load balancing)、故障轉移(failover of middle-tier servers)。我們把它叫做Eureka Server. Eureka也提供了基于Jav...

    SpringCloud(二):服務注冊與發現——Eureka

    服務注冊與發現——Eureka 是什么? Eureka架構圖 Eureka兩個組件 Server Client 構建Eureka Server服務 構建Eureka Client 在provider中模擬發現服務 actutor微服務信息完善 Eureka的自我保護 Eureka集群配置 是什么? 是Netflix的一個子模塊,也是核心模塊之一,基于REST的服務 用于云端...

    springcloud eureka服務注冊與發現

    本節示例只提供服務注冊,消費服務在后面的章節中 Eureka的原理就不介紹了,直接寫代碼。 編寫Eureka Service 新建一個spring boot Maven項目,添加如下依賴 啟動類添加@EnableEurekaServer注解,聲明是一個Eureka Server。 配置文件 eureka.client.registerWithEureka 表示是否將自己注冊到Eureka Serv...

    猜你喜歡

    SpringCloud:服務注冊與發現(Eureka)

    1、Eureka簡介 Eureka是一個服務注冊與發現組件,主要有兩部分組成:注冊中心(Eureka-Server)和服務提供端(Eureka-Client),Eureka-Server通過一個注冊表維護了所有向Eureka-Server注冊的Eureka-Client的主機地址和端口等信息,同時Eureka-Client可以向Eureka-Server獲取該注冊表,并默認每30s向注冊中心發送一...

    springcloud Eureka 服務注冊與發現

    1、Eureka是什么 Eureka是Netflix的一個子模塊,也是核心模塊之一。 Eureka是一個基于REST的服務,用于定位服務,以實現云端中間層服務發現和故障轉移。 服務注冊與發現對于微服務架構來說是非常重要的,有了服務發現與注冊,只需要使用服務的標識符,就可以訪問到服務,而不需要修改服務調用的配置文件了。 功能類似于dubbo的注冊中心,比如Zookeeper。 2、Eureka基本架...

    SpringCloud_Eureka服務注冊與發現

    文章目錄 基礎知識 服務治理 服務注冊于發現 組件 Eureka Server Eureka CLient 單機Eureka構建步驟 Eureka Server構建 Eureka Client構建 集群Eureka構建 修改Eureka Server 集群的yaml 修改Eureka Client 微服務模塊的yaml 如果微服務模塊為集群,通過在eureka上注冊過的微服務名稱調用 使用@Loa...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    精品国产乱码久久久久久蜜桃不卡