Spring-Cloud服務(wù)發(fā)現(xiàn)Eureka的使用教程

Eureka是Netflix開源的一款提供服務(wù)注冊(cè)和發(fā)現(xiàn)的產(chǎn)品梯嗽,它提供了完整的Service Registry和Service Discovery實(shí)現(xiàn)。也是springcloud體系中最重要最核心的組件之一乳蓄。

背景介紹

服務(wù)中心

服務(wù)中心又稱注冊(cè)中心,管理各種服務(wù)功能包括服務(wù)的注冊(cè)卵皂、發(fā)現(xiàn)肾胯、熔斷、負(fù)載旬蟋、降級(jí)等油昂,比如dubbo admin后臺(tái)的各種功能。

有了服務(wù)中心調(diào)用關(guān)系會(huì)有什么變化倾贰,畫幾個(gè)簡圖來幫忙理解

項(xiàng)目A調(diào)用項(xiàng)目B

正常調(diào)用項(xiàng)目A請(qǐng)求項(xiàng)目B

有了服務(wù)中心之后冕碟,任何一個(gè)服務(wù)都不能直接去掉用,都需要通過服務(wù)中心來調(diào)用

項(xiàng)目A調(diào)用項(xiàng)目B匆浙,項(xiàng)目B在調(diào)用項(xiàng)目C

這時(shí)候調(diào)用的步驟就會(huì)為兩步:第一步安寺,項(xiàng)目A首先從服務(wù)中心請(qǐng)求項(xiàng)目B服務(wù)器,然后項(xiàng)目B在從服務(wù)中心請(qǐng)求項(xiàng)目C服務(wù)吞彤。

上面的項(xiàng)目只是兩三個(gè)相互之間的簡單調(diào)用我衬,但是如果項(xiàng)目超過20個(gè)30個(gè)呢,在15年底的時(shí)候我司分布式的項(xiàng)目就達(dá)到了二十幾個(gè)饰恕,畫一張圖來描述幾十個(gè)項(xiàng)目之間的相互調(diào)用關(guān)系全是線條挠羔,任何其中的一個(gè)項(xiàng)目改動(dòng),就會(huì)牽連好幾個(gè)項(xiàng)目跟著重啟埋嵌,巨麻煩而且容易出錯(cuò)破加。通過服務(wù)中心來獲取服務(wù)你不需要關(guān)注你調(diào)用的項(xiàng)目IP地址,由幾臺(tái)服務(wù)器組成雹嗦,每次直接去服務(wù)中心獲取可以使用的服務(wù)去調(diào)用既可范舀。

由于各種服務(wù)都注冊(cè)到了服務(wù)中心合是,就有了去做很多高級(jí)功能條件。比如幾臺(tái)服務(wù)提供相同服務(wù)來做均衡負(fù)載锭环;監(jiān)控服務(wù)器調(diào)用成功率來做熔斷聪全,移除服務(wù)列表中的故障點(diǎn);監(jiān)控服務(wù)調(diào)用時(shí)間來對(duì)不同的服務(wù)器設(shè)置不同的權(quán)重等等辅辩。

說Eureka之前我先八卦一下Netflix

Netflix

以下介紹來自于百度百科:

Netflix是一家美國公司难礼,在美國、加拿大提供互聯(lián)網(wǎng)隨選流媒體播放玫锋,定制DVD蛾茉、藍(lán)光光碟在線出租業(yè)務(wù)。該公司成立于1997年撩鹿,總部位于加利福尼亞州洛斯蓋圖谦炬,1999年開始訂閱服務(wù)。2009年节沦,該公司可提供多達(dá)10萬部DVD電影键思,并有1千萬的訂戶。2007年2月25日散劫,Netflix宣布已經(jīng)售出第10億份DVD稚机。HIS一份報(bào)告中表示,2011年Netflix網(wǎng)絡(luò)電影銷量占據(jù)美國用戶在線電影總銷量的45%获搏。

我第一次看到這個(gè)單詞的時(shí)候赖条,是在各種美劇或者電影的開頭,Netflix拍攝的代表性的美劇有《紙牌屋》常熙、《毒梟》纬乍、《怪奇物語》。后來研究springcloud的時(shí)候發(fā)現(xiàn)了Netflix公司裸卫,就在想它們是不是同一家公司仿贬,經(jīng)過核對(duì)github上面郵件后綴判定確實(shí)是同一家公司,其實(shí)springcloud的微服務(wù)就基于Netflix公司的開源產(chǎn)品來做的墓贿。

Netflix的開源框架組件已經(jīng)在Netflix的大規(guī)模分布式微服務(wù)環(huán)境中經(jīng)過多年的生產(chǎn)實(shí)戰(zhàn)驗(yàn)證茧泪,正逐步被社區(qū)接受為構(gòu)造微服務(wù)框架的標(biāo)準(zhǔn)組件。Spring Cloud開源產(chǎn)品聋袋,主要是基于對(duì)Netflix開源組件的進(jìn)一步封裝队伟,方便Spring開發(fā)人員構(gòu)建微服務(wù)基礎(chǔ)框架。對(duì)于一些打算構(gòu)建微服務(wù)框架體系的公司來說幽勒,充分利用或參考借鑒Netflix的開源微服務(wù)組件(或Spring Cloud)嗜侮,在此基礎(chǔ)上進(jìn)行必要的企業(yè)定制,無疑是通向微服務(wù)架構(gòu)的捷徑。

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.

Eureka 是一個(gè)基于 REST 的服務(wù)锈颗,主要在 AWS 云中使用, 定位服務(wù)來進(jìn)行中間層服務(wù)器的負(fù)載均衡和故障轉(zhuǎn)移顷霹。

Spring Cloud 封裝了 Netflix 公司開發(fā)的 Eureka 模塊來實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)。Eureka 采用了 C-S 的設(shè)計(jì)架構(gòu)击吱。Eureka Server 作為服務(wù)注冊(cè)功能的服務(wù)器淋淀,它是服務(wù)注冊(cè)中心。而系統(tǒng)中的其他微服務(wù)姨拥,使用 Eureka 的客戶端連接到 Eureka Server绅喉,并維持心跳連接。這樣系統(tǒng)的維護(hù)人員就可以通過 Eureka Server 來監(jiān)控系統(tǒng)中各個(gè)微服務(wù)是否正常運(yùn)行叫乌。Spring Cloud 的一些其他模塊(比如Zuul)就可以通過 Eureka Server 來發(fā)現(xiàn)系統(tǒng)中的其他微服務(wù),并執(zhí)行相關(guān)的邏輯徽缚。

Eureka由兩個(gè)組件組成:Eureka服務(wù)器和Eureka客戶端憨奸。Eureka服務(wù)器用作服務(wù)注冊(cè)服務(wù)器。Eureka客戶端是一個(gè)java客戶端凿试,用來簡化與服務(wù)器的交互排宰、作為輪詢負(fù)載均衡器,并提供服務(wù)的故障切換支持那婉。Netflix在其生產(chǎn)環(huán)境中使用的是另外的客戶端板甘,它提供基于流量、資源利用率以及出錯(cuò)狀態(tài)的加權(quán)負(fù)載均衡详炬。

用一張圖來認(rèn)識(shí)以下:

image

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

1、Eureka Server

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

2呛谜、Service Provider

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

3、Service Consumer

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

創(chuàng)建Eureka項(xiàng)目

1.idea創(chuàng)建Eureka


1

2

3

4

2.Maven創(chuàng)建Eureka

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.BUILD-SNAPSHOT</spring-cloud.version>
    </properties>

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

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

單節(jié)點(diǎn)Eureka部署使用

spring cloud已經(jīng)幫我實(shí)現(xiàn)了服務(wù)注冊(cè)中心猫妙,我們只需要很簡單的幾個(gè)步驟就可以完成。

1聚凹、pom中添加依賴

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

2割坠、添加啟動(dòng)代碼中添加@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaApplication.class, args);
    }
}

3、配置文件

在默認(rèn)設(shè)置下妒牙,該服務(wù)注冊(cè)中心也會(huì)將自己作為客戶端來嘗試注冊(cè)它自己彼哼,所以我們需要禁用它的客戶端注冊(cè)行為,在application.properties添加以下配置:

spring.application.name=spring-cloud-eureka

server.port=8000
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

  • eureka.client.register-with-eureka :表示是否將自己注冊(cè)到Eureka Server单旁,默認(rèn)為true沪羔。
  • eureka.client.fetch-registry :表示是否從Eureka Server獲取注冊(cè)信息,默認(rèn)為true。
  • eureka.client.serviceUrl.defaultZone :設(shè)置與Eureka Server交互的地址蔫饰,查詢服務(wù)和注冊(cè)服務(wù)都需要依賴這個(gè)地址琅豆。默認(rèn)是http://localhost:8761/eureka ;多個(gè)地址可使用 , 分隔篓吁。

啟動(dòng)工程后茫因,訪問:http://localhost:8000/,可以看到下面的頁面杖剪,其中還沒有發(fā)現(xiàn)任何服務(wù)


集群
注冊(cè)中心這么關(guān)鍵的服務(wù)冻押,如果是單點(diǎn)話,遇到故障就是毀滅性的盛嘿。在一個(gè)分布式系統(tǒng)中洛巢,服務(wù)注冊(cè)中心是最重要的基礎(chǔ)部分,理應(yīng)隨時(shí)處于可以提供服務(wù)的狀態(tài)次兆。為了維持其可用性稿茉,使用集群是很好的解決方案。Eureka通過互相注冊(cè)的方式來實(shí)現(xiàn)高可用的部署芥炭,所以我們只需要將Eureke Server配置其他可用的serviceUrl就能實(shí)現(xiàn)高可用部署漓库。

雙節(jié)點(diǎn)Eureka部署使用

首次我們嘗試一下雙節(jié)點(diǎn)的注冊(cè)中心的搭建。

1园蝠、創(chuàng)建application-peer1.properties渺蒿,作為peer1服務(wù)中心的配置,并將serviceUrl指向peer2

spring.application.name=spring-cloud-eureka
server.port=8000
eureka.instance.hostname=peer1

eureka.client.serviceUrl.defaultZone=http://peer2:8001/eureka/

2彪薛、創(chuàng)建application-peer2.properties茂装,作為peer2服務(wù)中心的配置,并將serviceUrl指向peer1

spring.application.name=spring-cloud-eureka
server.port=8001
eureka.instance.hostname=peer2

eureka.client.serviceUrl.defaultZone=http://peer1:8000/eureka/

3陪汽、host轉(zhuǎn)換

在hosts文件中加入如下配置

127.0.0.1 peer1  
127.0.0.1 peer2  

4训唱、打包啟動(dòng)
依次執(zhí)行下面命令

#打包
mvn clean package
# 分別以peer1和peeer2 配置信息啟動(dòng)eureka
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

依次啟動(dòng)完成后,瀏覽器輸入:http://localhost:8000/ 效果圖如下:

image

根據(jù)圖可以看出peer1的注冊(cè)中心DS Replicas已經(jīng)有了peer2的相關(guān)配置信息挚冤,并且出現(xiàn)在available-replicas中况增。我們手動(dòng)停止peer2來觀察,發(fā)現(xiàn)peer2就會(huì)移動(dòng)到unavailable-replicas一欄中训挡,表示peer2不可用澳骤。

到此雙節(jié)點(diǎn)的配置已經(jīng)完成。

多節(jié)點(diǎn)Eureka部署使用

在生產(chǎn)中我們可能需要三臺(tái)或者大于三臺(tái)的注冊(cè)中心來保證服務(wù)的穩(wěn)定性澜薄,配置的原理其實(shí)都一樣为肮,將注冊(cè)中心分別指向其它的注冊(cè)中心。這里只介紹三臺(tái)集群的配置情況肤京,其實(shí)和雙節(jié)點(diǎn)的注冊(cè)中心類似颊艳,每臺(tái)注冊(cè)中心分別又指向其它兩個(gè)節(jié)點(diǎn)即可茅特,使用application.yml來配置。

application.yml配置詳情如下:

---
spring:
  application:
    name: spring-cloud-eureka
  profiles: peer1
server:
  port: 8000
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2:8001/eureka/,http://peer3:8002/eureka/
---
spring:
  application:
    name: spring-cloud-eureka
  profiles: peer2
server:
  port: 8001
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1:8000/eureka/,http://peer3:8002/eureka/
---
spring:
  application:
    name: spring-cloud-eureka
  profiles: peer3
server:
  port: 8002
eureka:
  instance:
    hostname: peer3
  client:
    serviceUrl:
      defaultZone: http://peer1:8000/eureka/,http://peer2:8001/eureka/

分別以peer1棋枕、peer2白修、peer3的配置參數(shù)啟動(dòng)eureka注冊(cè)中心。

java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3

依次啟動(dòng)完成后重斑,瀏覽器輸入:http://localhost:8000/ 效果圖如下:

可以在peer1中看到了peer2兵睛、peer3的相關(guān)信息。至此eureka集群也已經(jīng)完成了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窥浪,一起剝皮案震驚了整個(gè)濱河市祖很,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漾脂,老刑警劉巖假颇,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異符相,居然都是意外死亡拆融,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門啊终,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人傲须,你說我怎么就攤上這事蓝牲。” “怎么了泰讽?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵例衍,是天一觀的道長。 經(jīng)常有香客問我已卸,道長佛玄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上残邀,老公的妹妹穿的比我還像新娘琐驴。我一直安慰自己,他們只是感情好时捌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般霞赫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肥矢,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天端衰,我揣著相機(jī)與錄音,去河邊找鬼。 笑死旅东,一個(gè)胖子當(dāng)著我的面吹牛灭抑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播玉锌,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼名挥,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了主守?” 一聲冷哼從身側(cè)響起禀倔,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎参淫,沒想到半個(gè)月后救湖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涎才,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鞋既,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耍铜。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邑闺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棕兼,到底是詐尸還是另有隱情陡舅,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布伴挚,位于F島的核電站靶衍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏茎芋。R本人自食惡果不足惜颅眶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望田弥。 院中可真熱鬧涛酗,春花似錦、人聲如沸皱蹦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪哺。三九已至沈自,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辜妓,已是汗流浹背枯途。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工忌怎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酪夷。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓榴啸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晚岭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸥印,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349