你有沒(méi)有考慮過(guò)Eureka Client
與Eureka Server
是通過(guò)什么方式進(jìn)行通訊的魔吐?
為什么Client
啟動(dòng)成功后Server
就會(huì)被注冊(cè)到Server
的服務(wù)列表內(nèi)缠黍?
為什么我們?cè)谡jP(guān)閉Client
后Server
會(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)境:
- 啟動(dòng)
Eureka Server
鲫忍,源碼查看SpringCloud組件:搭建Eureka服務(wù)注冊(cè)中心- 啟動(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-PROVIDER
為appID
逾雄,hengboy-spring-cloud-eureka-provider:20000:v1.0
為instanceID
。
執(zhí)行完成后可以打開(kāi)Eureka Server
管理平臺(tái)查看服務(wù)實(shí)例列表
查看服務(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)同步也有不成功的情況存在钥平。
源碼位置
- SpringBoot配套源碼地址:訪問(wèn)碼云查看源碼、訪問(wèn)GitHub查看源碼
- SpringCloud配套源碼地址(
本章源碼在這
):訪問(wèn)碼云查看源碼姊途,訪問(wèn)GitHub查看源碼