SpringCloud系列教程 | 第二篇:注冊(cè)中心Eureka
Springboot: 2.1.6.RELEASE
SpringCloud: Greenwich.SR1
如無(wú)特殊說(shuō)明延欠,本系列教程全采用以上版本
Eureka是Netflix開(kāi)源的一款提供服務(wù)注冊(cè)和發(fā)現(xiàn)的產(chǎn)品搂蜓,它提供了完整的Service Registry和Service Discovery實(shí)現(xiàn)环形。也是springcloud體系中最重要最核心的組件之一逾柿。
管理各種服務(wù)功能包括服務(wù)的注冊(cè)梦皮、發(fā)現(xiàn)、熔斷破托、負(fù)載吮炕、降級(jí)等,比如dubbo admin后臺(tái)的各種功能醉锄。
有了注冊(cè)中心乏悄,調(diào)用關(guān)系的變化,畫(huà)幾個(gè)簡(jiǎn)圖來(lái)看一下恳不。
服務(wù)A調(diào)用服務(wù)B
有了注冊(cè)中心之后檩小,任何一個(gè)服務(wù)都不在是直連的,都需要通過(guò)注冊(cè)中心去調(diào)用烟勋。
如果是一個(gè)連續(xù)調(diào)用:
服務(wù)A調(diào)用服務(wù)B规求,服務(wù)B調(diào)用服務(wù)C
這里如果加上注冊(cè)中心筐付,整個(gè)調(diào)用流程就會(huì)分為兩步,服務(wù)A先從注冊(cè)中心請(qǐng)求服務(wù)B颓哮,服務(wù)B再?gòu)淖?cè)中心請(qǐng)求服務(wù)C
上面的示例只是描述了兩三個(gè)服務(wù)之間的互相調(diào)用家妆,可能加上注冊(cè)中心還會(huì)稍顯繁瑣,如果一條調(diào)用鏈上面有幾十個(gè)服務(wù)(這個(gè)絲毫不是開(kāi)玩笑哦冕茅,正常的業(yè)務(wù)流程中很可能出現(xiàn)這種復(fù)雜的調(diào)用過(guò)程),在工作中我就遇到過(guò)超過(guò)20個(gè)服務(wù)的互相調(diào)用蛹找,這種復(fù)雜業(yè)務(wù)場(chǎng)景的互相調(diào)用姨伤,如果不使用注冊(cè)中心,畫(huà)出來(lái)的圖會(huì)連成一個(gè)網(wǎng)狀結(jié)構(gòu)庸疾,單從圖上面已經(jīng)很難找出服務(wù)的上下游關(guān)系了乍楚。其中如果一個(gè)服務(wù)有改動(dòng),就會(huì)牽扯到上下游多臺(tái)機(jī)器的重啟届慈,整個(gè)架構(gòu)設(shè)計(jì)完全耦合在一起徒溪,每次改動(dòng)所需要的工作量完全超出想象。通過(guò)注冊(cè)中心去注冊(cè)服務(wù)金顿,完全不在需要關(guān)心上下游機(jī)器的ip地址臊泌,由幾臺(tái)服務(wù)器組成,是否重啟才會(huì)生效揍拆,注冊(cè)中心已經(jīng)幫我們把服務(wù)的注冊(cè)和發(fā)現(xiàn)做好了渠概,我們只需要知道注冊(cè)中心在哪里,對(duì)應(yīng)的服務(wù)名是什么就ok啦~~
由于各種服務(wù)都注冊(cè)到了服務(wù)中心嫂拴,就有了去做很多高級(jí)功能條件播揪。比如幾臺(tái)服務(wù)提供相同服務(wù)來(lái)做均衡負(fù)載;監(jiān)控服務(wù)器調(diào)用成功率來(lái)做熔斷筒狠,移除服務(wù)列表中的故障點(diǎn)猪狈;監(jiān)控服務(wù)調(diào)用時(shí)間來(lái)對(duì)不同的服務(wù)器設(shè)置不同的權(quán)重等等。
在說(shuō)Eureka之前我們先了解一下Netflix這家公司:
以下介紹來(lái)自于百度百科:
Netflix(Nasdaq NFLX) 成立于1997年辩恼,是一家在線影片租賃提供商雇庙,主要提供Netflix超大數(shù)量的DVD并免費(fèi)遞送,總部位于美國(guó)加利福尼亞州洛斯蓋圖运挫。
Netflix已經(jīng)連續(xù)五次被評(píng)為顧客最滿(mǎn)意的網(wǎng)站状共。可以通過(guò)PC谁帕、TV及iPad峡继、iPhone收看電影、電視節(jié)目匈挖,可通過(guò)Wii碾牌,Xbox360康愤,PS3等設(shè)備連接TV。Netflix大獎(jiǎng)賽從2006年10月份開(kāi)始舶吗,Netflix公開(kāi)了大約1億個(gè)1-5的匿名影片評(píng)級(jí)征冷,數(shù)據(jù)集僅包含了影片名稱(chēng)。評(píng)價(jià)星級(jí)和評(píng)級(jí)日期誓琼,沒(méi)有任何文本評(píng)價(jià)的內(nèi)容检激。比賽要求參賽者預(yù)測(cè)Netflix的客戶(hù)分別喜歡什么影片,要把預(yù)測(cè)的效率提高10%以上腹侣。
總而言之叔收,這是一家全球最大的(可能要排除國(guó)內(nèi)的,具體不清楚)流媒體公司傲隶,最開(kāi)始見(jiàn)這個(gè)單子是在各種美劇或者電影的開(kāi)頭饺律,順手百度了一下,Netflix拍攝的代表性的美劇有《紙牌屋》跺株、《毒梟》复濒、《怪奇物語(yǔ)》。springcloud的微服務(wù)就是基于Netflix這家公司的開(kāi)源產(chǎn)品來(lái)做的乒省。
Netflix的開(kāi)源框架組件已經(jīng)在Netflix的大規(guī)模分布式微服務(wù)環(huán)境中經(jīng)過(guò)多年的生產(chǎn)實(shí)戰(zhàn)驗(yàn)證巧颈,正逐步被社區(qū)接受為構(gòu)造微服務(wù)框架的標(biāo)準(zhǔn)組件。Spring Cloud開(kāi)源產(chǎn)品作儿,主要是基于對(duì)Netflix開(kāi)源組件的進(jìn)一步封裝洛二,方便Spring開(kāi)發(fā)人員構(gòu)建微服務(wù)基礎(chǔ)框架。對(duì)于一些打算構(gòu)建微服務(wù)框架體系的公司來(lái)說(shuō)攻锰,充分利用或參考借鑒Netflix的開(kāi)源微服務(wù)組件(或Spring Cloud)晾嘶,在此基礎(chǔ)上進(jìn)行必要的企業(yè)定制,無(wú)疑是通向微服務(wù)架構(gòu)的捷徑娶吞。
按照官方介紹:
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ù)來(lái)進(jìn)行中間層服務(wù)器的負(fù)載均衡和故障轉(zhuǎn)移。
Spring Cloud 封裝了 Netflix 公司開(kāi)發(fā)的 Eureka 模塊來(lái)實(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 的客戶(hù)端連接到 Eureka Server,并維持心跳連接陶耍。這樣系統(tǒng)的維護(hù)人員就可以通過(guò) Eureka Server 來(lái)監(jiān)控系統(tǒng)中各個(gè)微服務(wù)是否正常運(yùn)行奋蔚。Spring Cloud 的一些其他模塊(比如Zuul)就可以通過(guò) Eureka Server 來(lái)發(fā)現(xiàn)系統(tǒng)中的其他微服務(wù),并執(zhí)行相關(guān)的邏輯。
Eureka由兩個(gè)組件組成:Eureka服務(wù)器和Eureka客戶(hù)端泊碑。Eureka服務(wù)器用作服務(wù)注冊(cè)服務(wù)器坤按。Eureka客戶(hù)端是一個(gè)java客戶(hù)端,用來(lái)簡(jiǎn)化與服務(wù)器的交互馒过、作為輪詢(xún)負(fù)載均衡器臭脓,并提供服務(wù)的故障切換支持。Netflix在其生產(chǎn)環(huán)境中使用的是另外的客戶(hù)端腹忽,它提供基于流量来累、資源利用率以及出錯(cuò)狀態(tài)的加權(quán)負(fù)載均衡。
用官方的一張圖來(lái)認(rèn)識(shí)一下:
上圖簡(jiǎn)要描述了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ù)
終于到了重頭戲求冷,開(kāi)始擼代碼~~~
關(guān)于創(chuàng)建springcloud項(xiàng)目,目前有兩種比較方便的方案窍霞,核心都是一樣的匠题,大家自行選擇自己使用方便的。
方式一:
打開(kāi)spring的官方鏈接:
在Group中填入自己的組織但金,一般填寫(xiě)公司的域名的到寫(xiě)韭山,例如com.jd或者com
.baidu,這里我直接寫(xiě)com.springcloud冷溃。
在Artifact中填寫(xiě)工程的名稱(chēng)钱磅,這里我直接寫(xiě)Eureka。
package選擇jar似枕,java選擇8盖淡,至此,基礎(chǔ)選擇已經(jīng)全都選完凿歼,接下來(lái)要開(kāi)始選擇我們使用的springcloud的組件了褪迟,也就是重頭——Eureka組件。
在Dependencies中找到Spring Cloud Discovery答憔,選擇Eureka Serve味赃,結(jié)果如下圖:
最后點(diǎn)擊下方的綠色長(zhǎng)條按鈕?Generate the project?進(jìn)行下載,等待下載完成后虐拓,直接將壓縮包解壓導(dǎo)入我們的編輯工具idea里即可心俗。
方式二:
基于idea創(chuàng)建,打開(kāi)idea侯嘀,首先f(wàn)ile->new->project另凌,選中spring Initializr谱轨,這時(shí)可以看到右側(cè)讓我們選擇一個(gè)初始化的服務(wù)url,默認(rèn)的就是上面的官方鏈接吠谢,https://start.spring.io/
點(diǎn)擊next下一步土童,填寫(xiě)和上面一樣的Group、Artifact工坊、java版本献汗、package方式等信息,繼續(xù)next下一步王污,選擇依賴(lài)罢吃,和前面的方法的一樣,在Dependencies中找到Spring Cloud Discovery昭齐,選擇Eureka Serve尿招,點(diǎn)擊next,選擇項(xiàng)目名稱(chēng)和存儲(chǔ)路徑阱驾,點(diǎn)擊finish就谜,靜靜等一會(huì),第一個(gè)項(xiàng)目Eureka就新鮮出爐了~~~
我一般選擇第一種方式創(chuàng)建springcloud項(xiàng)目里覆,這種方式不依賴(lài)IDE工具丧荐。
maven項(xiàng)目,首先看一下pom.xml:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springcloud</groupId>
<artifactId>Eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</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>
</project>
parent:?父級(jí)依賴(lài)項(xiàng)目喧枷,這里能看到依賴(lài)的父級(jí)的springboot的版本是2.1.6.RELEASE虹统。
properties:?當(dāng)前配置文件一些配置,可以看到Java的版本是1.8隧甚,springcloud的版本是Greenwich.SR1车荔。
dependencies:?當(dāng)前項(xiàng)目依賴(lài)的組件,這里能看出來(lái)依賴(lài)兩個(gè)組件呻逆,一個(gè)是Eureka夸赫,還有一個(gè)是test測(cè)試框架。
*dependencyManagement:?這里是聲明依賴(lài)咖城,并不實(shí)現(xiàn)引入茬腿,如果不在子項(xiàng)目中聲明依賴(lài),是不會(huì)從父項(xiàng)目中繼承下來(lái)的宜雀;只有在子項(xiàng)目中寫(xiě)了該依賴(lài)項(xiàng)切平,并且沒(méi)有指定具體版本,才會(huì)從父項(xiàng)目中繼承該項(xiàng)辐董,并且version和scope都讀取自父pom;另外如果子項(xiàng)目中指定了版本號(hào)悴品,那么會(huì)使用子項(xiàng)目中指定的jar版本。
build:?在build中聲明了當(dāng)前使用的插件,spring-boot-maven-plugin苔严,主要功能:能夠?qū)pring Boot應(yīng)用打包為可執(zhí)行的jar或war文件定枷,然后以通常的方式運(yùn)行Spring Boot應(yīng)用。
默認(rèn)的配置文件是在resource下面的application.properties届氢,在springboot的項(xiàng)目中欠窒,目前支持兩種配置文件的形式,還有一種是yaml退子,我這里使用的所有配置全為yaml形式岖妄。
server:
? port: 8761
spring:
? application:
? ? name: eureka-serve
eureka:
? server:
? ? enable-self-preservation: false
? client:
? ? register-with-eureka: false
? ? service-url:
? ? ? defaultZone: http://localhost:8761/eureka/
enable-self-preservation:?防止由于Eureka的機(jī)制導(dǎo)致Client被錯(cuò)誤顯示在線,僅在開(kāi)發(fā)環(huán)境使用寂祥,生產(chǎn)環(huán)境需緩存此信息荐虐,防止因網(wǎng)絡(luò)波動(dòng)導(dǎo)致服務(wù)頻繁上下線。
register-with-eureka:?不像注冊(cè)中心注冊(cè)自己
register-with-eureka:?此eureka server的應(yīng)用注冊(cè)地址
啟動(dòng)EurekaApplication.java
package com.springcloud.Eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
增加注解@EnableEurekaServer丸凭,在這個(gè)main函數(shù)上福扬,直接右鍵debug就可以啟動(dòng)了,啟動(dòng)成功如下圖所示:
現(xiàn)在單機(jī)的注冊(cè)中心已經(jīng)成功啟動(dòng)惜犀, 引申出來(lái)一個(gè)問(wèn)題忧换,注冊(cè)中心是所有的服務(wù)提供者注冊(cè)服務(wù)的地方,如果只有一臺(tái)機(jī)器向拆,一旦因?yàn)槟承┰颍l(fā)宕機(jī)酪耳,會(huì)造成整體服務(wù)不可用浓恳,所以,這種中心服務(wù)在生產(chǎn)環(huán)境必須是集群化部署碗暗,如果對(duì)高可用颈将、容災(zāi)和備份有更高的要求,還可以分機(jī)房部署言疗,分地區(qū)部署晴圾。
增加idea啟動(dòng)配置,點(diǎn)擊右上角的Edit Configurations噪奄,如下圖:
在打開(kāi)的窗口中新建一個(gè)springboot的啟動(dòng)方式死姚,命名為Eureka1,增加啟動(dòng)參數(shù)Program arguments:–server.port=8080勤篮,點(diǎn)擊apply保存都毒,如下圖:
使用新創(chuàng)建的啟動(dòng)配置啟動(dòng)服務(wù),現(xiàn)在可以看到正常啟動(dòng)碰缔。接下來(lái)就是修改配置文件账劲,使兩個(gè)獨(dú)立的服務(wù)變?yōu)榧骸?/p>
server:
? port: 8761
spring:
? application:
? ? name: eureka-serve
eureka:
? server:
? ? enable-self-preservation: false
? client:
? ? register-with-eureka: false
? ? service-url:
? ? ? defaultZone: http://localhost:8761/eureka/,http://localhost:8080/eureka/
只需要在defaultZone上新增一個(gè)地址我們新服務(wù)的地址http://localhost:8080/eureka/,即可由單機(jī)立馬變成雙機(jī)。
現(xiàn)在分別使用兩個(gè)啟動(dòng)配置啟動(dòng)Eureka瀑焦,可以看到如下圖所示:
紅框中的內(nèi)容表示我們現(xiàn)在已經(jīng)有兩個(gè)eureka服務(wù)了腌且。
上面講了雙機(jī)的配置方案,同理榛瓮,多機(jī)的配置就是在defaultZone后面增加其他機(jī)器的服務(wù)地址铺董。
轉(zhuǎn)自:https://geekdigging.blog.csdn.net/article/details/94365300