• <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學習筆記【二】:Eureka服務注冊與發現

    標簽: SpringCloud  分布式  java  大數據  zookeeper

    Eureka2.0已經停更,但是學習它的思想還是有必要的,項目地址:https://github.com/Netflix/eureka

    本篇要點

    • 學習服務注冊與發現的概念。
    • 學習Eureka基礎中的兩大組件Server和Client的概念。
    • 嘗試Eureka單機和集群版的案例demo。

    Eureka基礎知識

    什么是服務治理

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

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

    什么是服務注冊與發現

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

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

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

    Eureka的兩個組件

    Eureka Server提供服務的注冊服務

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

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

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

    單機版Eureka構建步驟

    創建服務中心模塊

    了解了Eureka的系統架構圖之后,我們應該非常清楚,最簡單的實現也需要三個角色:服務消費者,服務提供者,注冊中心EurekaServer。已知我們已經擁有了兩個角色:

    • cloud-provider-payment8001 服務提供
    • cloud-consumer-order80 服務消費

    我們還需創建一個服務中心模塊:cloud-eureka-server7001。

    引入依賴

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

    配置yml

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

    在啟動類上表明@EnableEurekaServer

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

    進行測試

    訪問localhost:7001/,出現如下界面,表示Eureka已經配置完成。但此時你會發現,第二欄出現了No instances available,因為此時還沒有將兩個客戶端加入。

    注冊客戶端

    服務端已經配置,接下來就是配置注冊客戶端的操作。在操作之前,我們應該能夠聯想,既然表明服務注冊中心用的是:@EnableEurekaServer,那么是不是表明客戶端也有類似的注解呢?是不是也要引入類似的依賴呢?確實,是這樣的。我們以cloud-provider-payment8001服務為例,先試著將該服務注冊進注冊中心。

    引入依賴

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

    配置yml

    在yml中增加一下內容:

    eureka:
      client:
        #表示是否將自己注冊進EurekaServer默認為true。
        register-with-eureka: true
        #是否從EurekaServer抓取已有的注冊信息,默認為true。單節點無所謂,集群必須設置為true才能配合ribbon使用負載均衡
        fetchRegistry: true
        service-url:
          #單機版
          defaultZone: http://localhost:7001/eureka
    

    在啟動類上表明@EnableEurekaClient

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

    繼續測試

    我們先啟動EurekaServer7001Application,再啟動Payment8001Application,接著訪問:localhost:7001/,我們可以看到Application為CLOUD-PAYMENT-SERVICE的服務已經注冊進來。

    而這里的Application的名稱就是我們在yml中配置的spring.application.name=cloud-payment-service

    ok,我們可以照著上述步驟,將另外一個客戶端也注冊進來,這里就不贅述了。

    開啟保護機制

    啟動服務并注冊完成后,如果停掉服務,30s后,Eureka會開啟保護機制:

    Eureka執行步驟理解

    1. 先啟動eureka注冊中心。
    2. 啟動服務提供者(我們這里的服務提供者就是payment支付服務)。
    3. 服務提供者在啟動后會把自身的信息(如服務地址,以別名方式注冊到)注冊到eureka中。
    4. 消費者(我們這里是order服務)在需要調用接口的時候,使用服務別名去注冊中心獲取到實際的RPC遠程調用地址。
    5. 消費者獲取到調用地址后,底層實際是利用HttpClient技術實現遠程調用的。
    6. 消費者獲得服務地址后會緩存在本地的JVM內存中,默認每隔30秒更新移除服務調用地址。

    服務注冊實際上就是將服務信息注冊到注冊中心中,服務發現實際上就是從注冊中心中獲取到服務的信息,本質上就是key-value形式信息的存入與讀取。

    key就是服務的名字,value就是服務調用的地址。

    集群原理說明

    搭建Eureka注冊中心集群,實現負載均衡和故障容錯,也就是Eureka server和provider都是多個的,這防止一個注冊中心故障,所有都GG。

    而集群的搭建原理在于:每個Eureka注冊中心之間相互注冊,相互同步心跳。

    集群版Eureka構建步驟

    創建第二個注冊中心

    此時從父pom中查看一下module的結構:

      <modules>
        <module>cloud-provider-payment8001</module>
        <module>cloud-consumer-order80</module>
        <module>cloud-api-commons</module>
        <module>cloud-eureka-server7001</module>
        <module>cloud-eureka-server7002</module>
      </modules>
    

    修改映射配置

    C:\Windows\System32\drivers\etc目錄下的hosts文件添加以下映射:

    127.0.0.1 eureka7001.com
    127.0.0.1 eureka7002.com
    

    修改yml配置

    server:
      port: 7001
    
    eureka:
      instance:
        hostname: eureka7001.com #eureka服務端的實例名稱
      client:
        register-with-eureka: false     #false表示不向注冊中心注冊自己。
        fetch-registry: false     #false表示自己端就是注冊中心,我的職責就是維護服務實例,并不需要去檢索服務
        service-url:
          #集群指向其它eureka
          defaultZone: http://eureka7002.com:7002/eureka/
          
    ######################### 7001 < - > 7002 #############################
    
    server:
      port: 7002
    
    eureka:
      instance:
        hostname: eureka7002.com #eureka服務端的實例名稱
      client:
        register-with-eureka: false     #false表示不向注冊中心注冊自己。
        fetch-registry: false     #false表示自己端就是注冊中心,我的職責就是維護服務實例,并不需要去檢索服務
        service-url:
          #集群指向其它eureka
          defaultZone: http://eureka7001.com:7001/eureka/
    

    測試集群是否成功配置

    訪問localhost:7001/localhost:7002/,發現兩個中心都成功啟動。當然,我們已經配置了路徑映射,訪問eureka7001.com:7001/eureka7002.com:7002/的效果是一樣的。

    修改客戶端的yml配置

    單機版的時候穩定指向http://localhost:7001/eureka,集群狀態下需要改變eureka.client.service-url.defaultZone的值:

    eureka:
      client:
        #表示是否將自己注冊進EurekaServer默認為true。
        register-with-eureka: true
        #是否從EurekaServer抓取已有的注冊信息,默認為true。單節點無所謂,集群必須設置為true才能配合ribbon使用負載均衡
        fetchRegistry: true
        service-url:
    #      #單機版
    #      defaultZone: http://localhost:7001/eureka
          # 集群版
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
    

    測試

    此時兩個注冊中心都注冊了兩個客戶端服務,代表已經配置完成。

    負載均衡配置

    我們訪問注冊中心,可以發現CLOUD-PAYMENT-SERVICE對應兩臺提供服務者:

    修改URL地址

        private static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
    

    賦予RestTemplate負載均衡的能力

    @Configuration
    public class ApplicationContextConfig {
    
        @Bean
        @LoadBalanced //賦予RestTemplate負載均衡的能力
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    

    接著多次訪問:http://localhost/consumer/payment/1,會輪換者調用不同服務者的接口。

    源碼下載

    本系列文章為《尚硅谷SpringCloud教程》的學習筆記【版本稍微有些不同,后續遇到bug再做相關說明】,主要做一個長期的記錄,為以后學習的同學提供示例,代碼同步更新到Gitee:https://gitee.com/tqbx/spring-cloud-learning,并且以標簽的形式詳細區分每個步驟,這個系列文章也會同步更新。

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

    智能推薦

    SpringCloud學習之路-Eureka(服務注冊與發現)

    1.使用IDEA搭建Maven主工程 首先創建一個主Maven工程,在其pom文件引入依賴,spring Boot版本為2.0.3.RELEASE,Spring Cloud版本為Finchley.RELEASE。這個pom文件作為父pom文件,起到依賴版本控制的作用,其他module工程繼承該pom。 注意:父pom的打包方式為pom,modules里是子項目名   2.創建服務注冊中心...

    SpringCloud學習-(2)服務的注冊與發現(Eureka)

    前面SpringBoot已經介紹了SpringBoot相關使用,如果對SpringBoot不了解可以先看一下。 1.SpringCloud介紹 SpringCloud 為開發人員提供了快速構建分布式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分布式會話等等,運行環境簡單。SpringCloud是基于SpringBoot的。 2.創建服務注冊中心 在這里...

    SpringCloud學習教程一( 服務的注冊與發現 Eureka)

    本文是根據方志明的springCloud學習教程進行個人細化,記錄個人學習的教程可能會做一些小的修改讓文章更便于理解, 原著參考案例全部采用Spring Boot 1.5.x ,Spring Cloud版本為Dalston.RELEASE 一、spring cloud簡介 spring cloud 為開發人員提供了快速構建分布式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、事件總線...

    Springcloud學習之路------------Eureka服務注冊與發現

    建立eureka服務端 一、建model 如:cloud-eureka-server7001 二、改pom 添加依賴eureka-server 表示這是一個eureka服務端 三、改配置 集群板eureka: 就是把defaultZone 指向其他eureka的hostname ,如果有多個則用逗號隔開。 單機版eureka: 就是指向自己的hostname 四、主啟動 在主啟動上加入@Enabl...

    SpringCloud學習筆記(三)Eureka注冊與發現

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

    猜你喜歡

    SpringCloud學習筆記【五】:Zookeeper代替Eureka實現服務注冊與發現

    文章目錄 Zookeeper的服務注冊與發現 安裝Zookeeper環境 創建Zk服務提供者模塊 引入依賴 配置yml 添加注解@EnableDiscoveryClient 編寫Controller 測試,發現jar包沖突 解決jar包沖突 zookeeper版本 日志框架多綁定 繼續測試 Zookeeper注冊的服務是臨時節點 創建Zk服務消費者模塊 源碼下載 Zookeeper的服務注冊與發現...

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

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

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

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

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

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