SpringCloud組件:Eureka服務(wù)注冊(cè)中心內(nèi)置的REST節(jié)點(diǎn)列表

你有沒(méi)有考慮過(guò)Eureka ClientEureka Server是通過(guò)什么方式進(jìn)行通訊的魔吐?
為什么Client啟動(dòng)成功后Server就會(huì)被注冊(cè)到Server的服務(wù)列表內(nèi)缠黍?
為什么我們?cè)谡jP(guān)閉ClientServer會(huì)有所感知苟翻?

既然這么多問(wèn)題枕荞,帶著這些問(wèn)題來(lái)進(jìn)行本章的學(xué)習(xí)吧。

本章目標(biāo)

熟悉Eureka Server內(nèi)部提供的REST服務(wù)維護(hù)請(qǐng)求節(jié)點(diǎn)围苫。

構(gòu)建項(xiàng)目

我們本章知識(shí)點(diǎn)不需要涉及到代碼的編寫(xiě)退盯,所以我們只需要運(yùn)行之前章節(jié)SpringCloud組件:搭建Eureka服務(wù)注冊(cè)中心的源碼即可彼乌。

REST節(jié)點(diǎn)一覽

Eureka Server內(nèi)部通過(guò)JAX-RS(Java API for RESTful Web Services)規(guī)范提供了一系列的管理服務(wù)節(jié)點(diǎn)的請(qǐng)求節(jié)點(diǎn),這樣也保證了在非JVM環(huán)境運(yùn)行的程序可以通過(guò)HTTP REST方式進(jìn)行管理維護(hù)指定服務(wù)節(jié)點(diǎn)渊迁,所以只要遵循Eureka協(xié)議的服務(wù)節(jié)點(diǎn)都可以進(jìn)行注冊(cè)Eureka Server慰照。

Eureka提供的REST請(qǐng)求可以支持XML以及JSON形式通信,默認(rèn)采用XML方式琉朽,REST列表如表所示:

請(qǐng)求名稱(chēng) 請(qǐng)求方式 HTTP地址 請(qǐng)求描述
注冊(cè)新服務(wù) POST /eureka/apps/{appID} 傳遞JSON或者XML格式參數(shù)內(nèi)容毒租,HTTP code為204時(shí)表示成功
取消注冊(cè)服務(wù) DELETE /eureka/apps/{appID}/{instanceID} HTTP code為200時(shí)表示成功
發(fā)送服務(wù)心跳 PUT /eureka/apps/{appID}/{instanceID} HTTP code為200時(shí)表示成功
查詢(xún)所有服務(wù) GET /eureka/apps HTTP code為200時(shí)表示成功,返回XML/JSON數(shù)據(jù)內(nèi)容
查詢(xún)指定appID的服務(wù)列表 GET /eureka/apps/{appID} HTTP code為200時(shí)表示成功箱叁,返回XML/JSON數(shù)據(jù)內(nèi)容
查詢(xún)指定appID&instanceID GET /eureka/apps/{appID}/{instanceID} 獲取指定appID以及InstanceId的服務(wù)信息墅垮,HTTP code為200時(shí)表示成功惕医,返回XML/JSON數(shù)據(jù)內(nèi)容
查詢(xún)指定instanceID服務(wù)列表 GET /eureka/apps/instances/{instanceID} 獲取指定instanceID的服務(wù)列表,HTTP code為200時(shí)表示成功算色,返回XML/JSON數(shù)據(jù)內(nèi)容
變更服務(wù)狀態(tài) PUT /eureka/apps/{appID}/{instanceID}/status?value=DOWN 服務(wù)上線抬伺、服務(wù)下線等狀態(tài)變動(dòng),HTTP code為200時(shí)表示成功
變更元數(shù)據(jù) PUT /eureka/apps/{appID}/{instanceID}/metadata?key=value HTTP code為200時(shí)表示成功
查詢(xún)指定IP下的服務(wù)列表 GET /eureka/vips/{vipAddress} HTTP code為200時(shí)表示成功
查詢(xún)指定安全I(xiàn)P下的服務(wù)列表 GET /eureka/svips/{svipAddress} HTTP code為200時(shí)表示成功

在上面列表中參數(shù)解釋

  • {appID}:服務(wù)名稱(chēng)灾梦,對(duì)應(yīng)spring.application.name參數(shù)值
  • {instanceID}:實(shí)例名稱(chēng)峡钓,如果已經(jīng)自定義instanceId則對(duì)應(yīng)eureka.instance.instance-id參數(shù)值

服務(wù)注冊(cè)

Eureka Client啟動(dòng)成功后會(huì)發(fā)送POST方式的請(qǐng)求到/eureka/apps/{appID},發(fā)送注冊(cè)請(qǐng)求時(shí)的主體內(nèi)容在官網(wǎng)也有介紹若河,如果我們根據(jù)指定的主體內(nèi)容發(fā)送請(qǐng)求到Eureka Server時(shí)也是可以將服務(wù)注冊(cè)成功的能岩,主體內(nèi)容要以XML/JSON格式的XSD傳遞:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xsd:element name="instance">
        <xsd:complexType>
            <xsd:all>
                <!-- hostName in ec2 should be the public dns name, within ec2 public dns name will
                     always resolve to its private IP -->
                <xsd:element name="hostName" type="xsd:string" />
                <xsd:element name="app" type="xsd:string" />
                <xsd:element name="ipAddr" type="xsd:string" />
                <xsd:element name="vipAddress" type="xsd:string" />
                <xsd:element name="secureVipAddress" type="xsd:string" />
                <xsd:element name="status" type="statusType" />
                <xsd:element name="port" type="xsd:positiveInteger" minOccurs="0" />
                <xsd:element name="securePort" type="xsd:positiveInteger" />
                <xsd:element name="homePageUrl" type="xsd:string" />
                <xsd:element name="statusPageUrl" type="xsd:string" />
                <xsd:element name="healthCheckUrl" type="xsd:string" />
               <xsd:element ref="dataCenterInfo" minOccurs="1" maxOccurs="1" />
                <!-- optional -->
                <xsd:element ref="leaseInfo" minOccurs="0"/>
                <!-- optional app specific metadata -->
                <xsd:element name="metadata" type="appMetadataType" minOccurs="0" />
            </xsd:all>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="dataCenterInfo">
        <xsd:complexType>
             <xsd:all>
                 <xsd:element name="name" type="dcNameType" />
                 <!-- metadata is only required if name is Amazon -->
                 <xsd:element name="metadata" type="amazonMetdataType" minOccurs="0"/>
             </xsd:all>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="leaseInfo">
        <xsd:complexType>
            <xsd:all>
                <!-- (optional) if you want to change the length of lease - default if 90 secs -->
                <xsd:element name="evictionDurationInSecs" minOccurs="0"  type="xsd:positiveInteger"/>
            </xsd:all>
        </xsd:complexType>
    </xsd:element>

    <xsd:simpleType name="dcNameType">
        <!-- Restricting the values to a set of value using 'enumeration' -->
        <xsd:restriction base = "xsd:string">
            <xsd:enumeration value = "MyOwn"/>
            <xsd:enumeration value = "Amazon"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="statusType">
        <!-- Restricting the values to a set of value using 'enumeration' -->
        <xsd:restriction base = "xsd:string">
            <xsd:enumeration value = "UP"/>
            <xsd:enumeration value = "DOWN"/>
            <xsd:enumeration value = "STARTING"/>
            <xsd:enumeration value = "OUT_OF_SERVICE"/>
            <xsd:enumeration value = "UNKNOWN"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="amazonMetdataType">
        <!-- From <a class="jive-link-external-small"  target="_blank">http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/index.html?AESDG-chapter-instancedata.html</a> -->
        <xsd:all>
            <xsd:element name="ami-launch-index" type="xsd:string" />
            <xsd:element name="local-hostname" type="xsd:string" />
            <xsd:element name="availability-zone" type="xsd:string" />
            <xsd:element name="instance-id" type="xsd:string" />
            <xsd:element name="public-ipv4" type="xsd:string" />
            <xsd:element name="public-hostname" type="xsd:string" />
            <xsd:element name="ami-manifest-path" type="xsd:string" />
            <xsd:element name="local-ipv4" type="xsd:string" />
            <xsd:element name="hostname" type="xsd:string"/>       
            <xsd:element name="ami-id" type="xsd:string" />
            <xsd:element name="instance-type" type="xsd:string" />
        </xsd:all>
    </xsd:complexType>

    <xsd:complexType name="appMetadataType">
        <xsd:sequence>
            <!-- this is optional application specific name, value metadata -->
            <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

我們本章先來(lái)使用之前章節(jié)SpringCloud組件:將微服務(wù)提供者注冊(cè)到Eureka服務(wù)中心源碼進(jìn)行自動(dòng)注冊(cè)服務(wù),在之后的章節(jié)內(nèi)我們?cè)賮?lái)細(xì)講具體怎么通過(guò)符合以上XSD主體內(nèi)容的XML/JSON手動(dòng)注冊(cè)萧福。

在下面我們來(lái)看下通過(guò)REST來(lái)維護(hù)服務(wù)實(shí)例拉鹃,在這之前我們需要通過(guò)以下步驟進(jìn)行啟動(dòng)服務(wù),為后續(xù)REST請(qǐng)求維護(hù)服務(wù)實(shí)例提供環(huán)境:

  1. 啟動(dòng)Eureka Server鲫忍,源碼查看SpringCloud組件:搭建Eureka服務(wù)注冊(cè)中心
  2. 啟動(dòng)Eureka Client膏燕,源碼查看SpringCloud組件:將微服務(wù)提供者注冊(cè)到Eureka服務(wù)中心

服務(wù)狀態(tài)變更

我們可以直接修改服務(wù)實(shí)例的運(yùn)行狀態(tài),比如服務(wù)關(guān)閉饲窿,會(huì)從UP轉(zhuǎn)換為DOWN煌寇,我們通過(guò)curl命令來(lái)測(cè)試服務(wù)的狀態(tài)變更焕蹄,如下所示:

curl -v -X PUT http://localhost:10000/eureka/apps/HENGBOY-SPRING-CLOUD-EUREKA-PROVIDER/hengboy-spring-cloud-eureka-provider:20000:v1.0/status\?value\=DOWN

其中參數(shù)HENGBOY-SPRING-CLOUD-EUREKA-PROVIDERappID逾雄,hengboy-spring-cloud-eureka-provider:20000:v1.0instanceID
執(zhí)行完成后可以打開(kāi)Eureka Server管理平臺(tái)查看服務(wù)實(shí)例列表查看服務(wù)狀態(tài)腻脏,如下圖所示:

服務(wù)狀態(tài)變更

服務(wù)的狀態(tài)已經(jīng)由原本的UP改為了DOWN鸦泳。

服務(wù)基本信息獲取

Eureka提供獲取指定appID以及instanceID的詳細(xì)信息,可以詳細(xì)的返回服務(wù)實(shí)例的配置內(nèi)容永品,獲取信息的命令如下:

curl http://localhost:10000/eureka/apps/HENGBOY-SPRING-CLOUD-EUREKA-PROVIDER/hengboy-spring-cloud-eureka-provider:20000:v1.0

執(zhí)行命令返回值的格式化如下所示:

<instance>
  <instanceId>hengboy-spring-cloud-eureka-provider:20000:v1.0</instanceId>
  <hostName>192.168.1.75</hostName>
  <app>HENGBOY-SPRING-CLOUD-EUREKA-PROVIDER</app>
  <ipAddr>192.168.1.75</ipAddr>
  <status>UP</status>
  <overriddenstatus>UNKNOWN</overriddenstatus>
  <port enabled="true">20000</port>
  <securePort enabled="false">443</securePort>
  <countryId>1</countryId>
  <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
    <name>MyOwn</name>
  </dataCenterInfo>
  <leaseInfo>
    <renewalIntervalInSecs>30</renewalIntervalInSecs>
    <durationInSecs>90</durationInSecs>
    <registrationTimestamp>1539223540390</registrationTimestamp>
    <lastRenewalTimestamp>1539229835439</lastRenewalTimestamp>
    <evictionTimestamp>0</evictionTimestamp>
    <serviceUpTimestamp>1539223539774</serviceUpTimestamp>
  </leaseInfo>
  <metadata>
    <management.port>20000</management.port>
    <jmx.port>54581</jmx.port>
  </metadata>
  <homePageUrl>http://192.168.1.75:20000/</homePageUrl>
  <statusPageUrl>http://192.168.1.75:20000/actuator/info</statusPageUrl>
  <healthCheckUrl>http://192.168.1.75:20000/actuator/health</healthCheckUrl>
  <vipAddress>hengboy-spring-cloud-eureka-provider</vipAddress>
  <secureVipAddress>hengboy-spring-cloud-eureka-provider</secureVipAddress>
  <isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
  <lastUpdatedTimestamp>1539223540390</lastUpdatedTimestamp>
  <lastDirtyTimestamp>1539223539732</lastDirtyTimestamp>
  <actionType>ADDED</actionType>
</instance>

返回值的比較詳細(xì)做鹰,如需選擇使用。

服務(wù)剔除

當(dāng)然我們同樣可以主動(dòng)將服務(wù)從Eureka剔除鼎姐,剔除后會(huì)直接從服務(wù)實(shí)例列表中刪除钾麸,可執(zhí)行如下命令:

curl -v -X DELETE localhost:10000/eureka/apps/HENGBOY-SPRING-CLOUD-EUREKA-PROVIDER/hengboy-spring-cloud-eureka-provider:20000:v1.0

注意:由于Eureka Client一直在運(yùn)行,刪除后也會(huì)自動(dòng)通過(guò)注冊(cè)服務(wù)REST注冊(cè)實(shí)例炕桨。

總結(jié)

本章講解了怎么通過(guò)主動(dòng)以及自動(dòng)同步的方式將Eureka Client注冊(cè)到服務(wù)注冊(cè)中心集群環(huán)境中饭尝,為了保證完整性,還是建議手動(dòng)進(jìn)行配置献宫,自動(dòng)同步也有不成功的情況存在钥平。

源碼位置

作者個(gè)人 博客
使用開(kāi)源框架 ApiBoot 助你成為Api接口服務(wù)架構(gòu)師

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涉瘾,一起剝皮案震驚了整個(gè)濱河市知态,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌立叛,老刑警劉巖负敏,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秘蛇,居然都是意外死亡原在,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)彤叉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)庶柿,“玉大人,你說(shuō)我怎么就攤上這事秽浇「÷” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵柬焕,是天一觀的道長(zhǎng)审残。 經(jīng)常有香客問(wèn)我,道長(zhǎng)斑举,這世上最難降的妖魔是什么搅轿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮富玷,結(jié)果婚禮上璧坟,老公的妹妹穿的比我還像新娘。我一直安慰自己赎懦,他們只是感情好雀鹃,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著励两,像睡著了一般黎茎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上当悔,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天傅瞻,我揣著相機(jī)與錄音,去河邊找鬼盲憎。 笑死嗅骄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的焙畔。 我是一名探鬼主播掸读,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了儿惫?” 一聲冷哼從身側(cè)響起澡罚,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肾请,沒(méi)想到半個(gè)月后留搔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铛铁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年隔显,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饵逐。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡括眠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倍权,到底是詐尸還是另有隱情掷豺,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布薄声,位于F島的核電站当船,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏默辨。R本人自食惡果不足惜德频,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缩幸。 院中可真熱鬧壹置,春花似錦、人聲如沸桌粉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铃肯。三九已至,卻和暖如春传蹈,著一層夾襖步出監(jiān)牢的瞬間押逼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工惦界, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挑格,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓沾歪,卻偏偏與公主長(zhǎng)得像漂彤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容