真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

什么是DiveintoEureka

這篇文章將為大家詳細(xì)講解有關(guān)什么是Dive into  Eureka,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

站在用戶的角度思考問題,與客戶深入溝通,找到云霄網(wǎng)站設(shè)計與云霄網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋云霄地區(qū)。

1. What is Eureka?

其官方文檔中對自己的定義是:

Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers. We call this service, the Eureka Server. Eureka also comes with a Java-based client component,the Eureka Client, which makes interactions with the service much easier. The client also has a built-in load balancer that does basic round-robin load balancing.

簡單來說Eureka就是Netflix開源的一款提供服務(wù)注冊和發(fā)現(xiàn)的產(chǎn)品,并且提供了相應(yīng)的Java客戶端。

2. Why Eureka?

那么為什么我們在項目中使用了Eureka呢?我大致總結(jié)了一下,有以下幾方面的原因:

  • 它提供了完整的Service Registry和Service Discovery實(shí)現(xiàn)

    • 首先是提供了完整的實(shí)現(xiàn),并且也經(jīng)受住了Netflix自己的生產(chǎn)環(huán)境考驗(yàn),相對使用起來會比較省心。

  • 和Spring Cloud無縫集成

    • 我們的項目本身就使用了Spring Cloud和Spring Boot,同時Spring Cloud還有一套非常完善的開源代碼來整合Eureka,所以使用起來非常方便。

    • 另外,Eureka還支持在我們應(yīng)用自身的容器中啟動,也就是說我們的應(yīng)用啟動完之后,既充當(dāng)了Eureka的角色,同時也是服務(wù)的提供者。這樣就極大的提高了服務(wù)的可用性。

  • Open Source

    • 最后一點(diǎn)是開源,由于代碼是開源的,所以非常便于我們了解它的實(shí)現(xiàn)原理和排查問題。

3. Dive into Eureka

相信大家看到這里,已經(jīng)對Eureka有了一個初步的認(rèn)識,接下來我們就來深入了解下它吧~

3.1 Overview

3.1.1 Basic Architecture

什么是Dive into  Eureka

上圖簡要描述了Eureka的基本架構(gòu),由3個角色組成:

  1. Eureka Server

    • 提供服務(wù)注冊和發(fā)現(xiàn)

  2. Service Provider

    • 服務(wù)提供方

    • 將自身服務(wù)注冊到Eureka,從而使服務(wù)消費(fèi)方能夠找到

  3. Service Consumer

    • 服務(wù)消費(fèi)方

    • 從Eureka獲取注冊服務(wù)列表,從而能夠消費(fèi)服務(wù)

需要注意的是,上圖中的3個角色都是邏輯角色。在實(shí)際運(yùn)行中,這幾個角色甚至可以是同一個實(shí)例,比如在我們項目中,Eureka Server和Service Provider就是同一個JVM進(jìn)程。

3.1.2 More in depth

architecture-detail

上圖更進(jìn)一步的展示了3個角色之間的交互。

  1. Service Provider會向Eureka Server做Register(服務(wù)注冊)、Renew(服務(wù)續(xù)約)、Cancel(服務(wù)下線)等操作。

  2. Eureka Server之間會做注冊服務(wù)的同步,從而保證狀態(tài)一致

  3. Service Consumer會向Eureka Server獲取注冊服務(wù)列表,并消費(fèi)服務(wù)

3.2 Demo

為了給大家一個更直觀的印象,我們可以通過一個簡單的demo來實(shí)際運(yùn)行一下,從而對Eureka有更好的了解。

3.2.1 Git Repository

Git倉庫:git@github.com:nobodyiam/spring-cloud-in-action.git

這個項目使用了Spring Cloud相關(guān)類庫,包括:

  • Spring Cloud Config

  • Spring Cloud Eureka (Netflix)

3.2.2 準(zhǔn)備工作

Demo項目使用了Spring Cloud Config做配置,所以第一步先在本地啟動Config Server。

由于項目基于Spring Boot開發(fā),所以直接運(yùn)行com.nobodyiam.spring.cloud.in.action.config.ConfigServerApplication即可。

3.2.3 Eureka Server Demo

Eureka Server的Demo模塊名是:eureka-server。

3.2.3.1 Maven依賴

eureka-server是一個基于Spring Boot的Web應(yīng)用,我們首先需要做的就是在pom中引入Spring Cloud Eureka Server的依賴。


    org.springframework.cloud
    spring-cloud-starter-eureka-server
    1.1.0.RC2
3.2.3.2 啟用Eureka Server

啟用Eureka Server非常簡單,只需要加上@EnableEurekaServer即可。

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

做完以上配置后,啟動應(yīng)用,Eureka Server就開始工作了!

啟動完,打開http://localhost:8761就能看到啟動成功的畫面了。

什么是Dive into  Eureka

3.2.4 Service Provider and Service Consumer Demo

Service Provider的Demo模塊名是:reservation-service。

Service Consumer的Demo模塊名是:reservation-client

3.2.4.1 Maven依賴

reservation-servicereservation-client都是基于Spring Boot的Web應(yīng)用,我們首先需要做的就是在pom中引入Spring Cloud Eureka的依賴。


    org.springframework.cloud
    spring-cloud-starter-eureka
    1.1.0.RC2
3.2.4.2 啟動Service Provider

啟用Service Provider非常簡單,只需要加上@EnableDiscoveryClient即可。

@EnableDiscoveryClient
@SpringBootApplication
public class ReservationServiceApplication {
  public static void main(String[] args) {
    new SpringApplicationBuilder(ReservationServiceApplication.class)
            .run(args);
  }
}

做完以上配置后,啟動應(yīng)用,Server Provider就開始工作了!

啟動完,打開http://localhost:8761就能看到服務(wù)已經(jīng)注冊到Eureka Server了。

eureka-server-with-service-provider

3.2.4.3 啟動Service Consumer

啟動Service Consumer其實(shí)和Service Provider一樣,因?yàn)楸举|(zhì)上Eureka提供的客戶端是不區(qū)分Provider和Consumer的,一般情況下,Provider同時也會是Consumer。

@EnableDiscoveryClient
@SpringBootApplication
public class ReservationClientApplication {
  @Bean
  CommandLineRunner runner(DiscoveryClient dc) {
    return args -> {
      dc.getInstances("reservation-service")
              .forEach(si -> System.out.println(String.format(
                      "Found %s %s:%s", si.getServiceId(), si.getHost(), si.getPort())));
    };
  }
  public static void main(String[] args) {
    SpringApplication.run(ReservationClientApplication.class, args);
  }
}

上述代碼中通過dc.getInstances("reservation-service")就能獲取到當(dāng)前所有注冊的reservation-service服務(wù)。

3.3 Eureka Server實(shí)現(xiàn)細(xì)節(jié)

看了前面的demo,我們已經(jīng)初步領(lǐng)略到了Spring Cloud和Eureka的強(qiáng)大之處,通過短短幾行配置就實(shí)現(xiàn)了服務(wù)注冊和發(fā)現(xiàn)!

相信大家一定想了解Eureka是如何實(shí)現(xiàn)的吧,所以接下來我們繼續(xù)Dive!首先來看下Eureka Server的幾個對外接口實(shí)現(xiàn)。

3.3.1 Register

首先來看Register(服務(wù)注冊),這個接口會在Service Provider啟動時被調(diào)用來實(shí)現(xiàn)服務(wù)注冊。同時,當(dāng)Service Provider的服務(wù)狀態(tài)發(fā)生變化時(如自身檢測認(rèn)為Down的時候),也會調(diào)用來更新服務(wù)狀態(tài)。

接口實(shí)現(xiàn)比較簡單,如下圖所示。

  1. ApplicationResource類接收Http服務(wù)請求,調(diào)用PeerAwareInstanceRegistryImplregister方法

  2. PeerAwareInstanceRegistryImpl完成服務(wù)注冊后,調(diào)用replicateToPeers向其它Eureka Server節(jié)點(diǎn)(Peer)做狀態(tài)同步

什么是Dive into  Eureka

注冊的服務(wù)列表保存在一個嵌套的hash map中:

  • 第一層hash map的key是app name,也就是應(yīng)用名字

  • 第二層hash map的key是instance name,也就是實(shí)例名字

以3.2.4.2中的截圖為例,RESERVATION-SERVICE就是app name,jason-mbp.lan:reservation-service:8000就是instance name。

Hash map定義如下:

private final ConcurrentHashMap>> registry =
new ConcurrentHashMap>>();
3.3.2 Renew

Renew(服務(wù)續(xù)約)操作由Service Provider定期調(diào)用,類似于heartbeat。主要是用來告訴Eureka Server Service Provider還活著,避免服務(wù)被剔除掉。接口實(shí)現(xiàn)如下圖所示。

可以看到,接口實(shí)現(xiàn)方式和register基本一致:首先更新自身狀態(tài),再同步到其它Peer。

什么是Dive into  Eureka

3.3.4 Fetch Registries

Fetch Registries由Service Consumer調(diào)用,用來獲取Eureka Server上注冊的服務(wù)。

為了提高性能,服務(wù)列表在Eureka Server會緩存一份,同時每30秒更新一次。

什么是Dive into  Eureka

3.3.6 How Peer Replicates

在前面的Register、Renew、Cancel接口實(shí)現(xiàn)中,我們看到了都會有replicateToPeers操作,這個就是用來做Peer之間的狀態(tài)同步。

通過這種方式,Service Provider只需要通知到任意一個Eureka Server后就能保證狀態(tài)會在所有的Eureka Server中得到更新。

具體實(shí)現(xiàn)方式其實(shí)很簡單,就是接收到Service Provider請求的Eureka Server,把請求再次轉(zhuǎn)發(fā)到其它的Eureka Server,調(diào)用同樣的接口,傳入同樣的參數(shù),除了會在header中標(biāo)記isReplication=true,從而避免重復(fù)的replicate。

3.3.7 How Peer Nodes are Discovered

那大家可能會有疑問,Eureka Server是怎么知道有多少Peer的呢?

Eureka Server在啟動后會調(diào)用EurekaClientConfig.getEurekaServerServiceUrls來獲取所有的Peer節(jié)點(diǎn),并且會定期更新。定期更新頻率可以通過eureka.server.peerEurekaNodesUpdateIntervalMs配置。

這個方法的默認(rèn)實(shí)現(xiàn)是從配置文件讀取,所以如果Eureka Server節(jié)點(diǎn)相對固定的話,可以通過在配置文件中配置來實(shí)現(xiàn)。

如果希望能更靈活的控制Eureka Server節(jié)點(diǎn),比如動態(tài)擴(kuò)容/縮容,那么可以override getEurekaServerServiceUrls方法,提供自己的實(shí)現(xiàn),比如我們的項目中會通過數(shù)據(jù)庫讀取Eureka Server列表。

具體實(shí)現(xiàn)如下圖所示:

什么是Dive into  Eureka

3.4 Service Provider實(shí)現(xiàn)細(xì)節(jié)

現(xiàn)在來看下Service Provider的實(shí)現(xiàn)細(xì)節(jié),主要就是Register、Renew、Cancel這3個操作。

3.4.1 Register

Service Provider要對外提供服務(wù),一個很重要的步驟就是把自己注冊到Eureka Server上。

這部分的實(shí)現(xiàn)比較簡單,只需要在啟動時和實(shí)例狀態(tài)變化時調(diào)用Eureka Server的接口注冊即可。需要注意的是,需要確保配置eureka.client.registerWithEureka=true。

什么是Dive into  Eureka

3.4.3 Cancel

在Service Provider服務(wù)shut down的時候,需要及時通知Eureka Server把自己剔除,從而避免客戶端調(diào)用已經(jīng)下線的服務(wù)。

邏輯本身比較簡單,通過對方法標(biāo)記@PreDestroy,從而在服務(wù)shut down的時候會被觸發(fā)。

什么是Dive into  Eureka

3.5 Service Consumer實(shí)現(xiàn)細(xì)節(jié)

Service Consumer這塊的實(shí)現(xiàn)相對就簡單一些,因?yàn)樗簧婕暗綇腅ureka Server獲取服務(wù)列表和更新服務(wù)列表。

3.5.1 Fetch Service Registries

Service Consumer在啟動時會從Eureka Server獲取所有服務(wù)列表,并在本地緩存。需要注意的是,需要確保配置eureka.client.shouldFetchRegistry=true。

什么是Dive into  Eureka

3.5.3 How Eureka Servers are Discovered

Service Consumer和Service Provider一樣,也有一個如何知道Eureka Server地址的問題。

其實(shí)由于Service Consumer和Service Provider本質(zhì)上使用的是同一個Eureka客戶端,所以這部分邏輯是一樣的,這里就不再贅述了。

關(guān)于什么是Dive into  Eureka就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


文章標(biāo)題:什么是DiveintoEureka
本文路徑:http://weahome.cn/article/pohjgd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部