使用其他(非java)語言開發Eureka客戶端


前言

公司需要調研Eureka在非JAVA應用中的使用,我在Eureka的官方github上找到了一份wiki,是官方提供的Eureka一些REST操作API,其他語言可以使用這些API來實現對Eureka Server的操作從而實現一個非jvm語言的Eureka Client。

這篇博文主要是對Eureka官方的提供的REST操作的WIKI做了翻譯,並沒有提供具體的實際案例代碼。
不過今天(2017-9-20)我在閱讀《Spring Cloud與Docker微服務架構實戰》書中看到了有這部分的使用說明,其中4.9節介紹了詳細使用過程。如果有需要的話可以參考一下。
另外如果感興趣可以看看書中8.11節“使用Sidecar整合非JVM微服務”這部分,關於這部分的內容本人博客也有兩篇相關博文:
Spring Cloud Netflix多語言/非java語言支持之Sidecar
使用Sidecar將Node.js引入Spring Cloud

版本說明

Eureka REST operations
翻譯的版本為David Liu 在2016年2月26編輯的版本。
英文原文地址:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

正文翻譯

下面是可用於非JAVA應用的Eureka REST操作。

appID是應用程序的名稱,instanceID是與服務實例相關聯的唯一id。在AWS雲中,instanceID是服務實例的實例id,在其他數據中心(非AWS環境),它是服務實例的主機名。

對下面的JSON/XML格式而言,內容的類型必須是application/xmlapplication/json


操作 HTTP action 描述
注冊新的應用實例 POST /eureka/v2/apps/appID 接受JSON/XML格式請求,返回204響應碼表示成功
取消注冊(de-register)應用實例 DELETE /eureka/v2/apps/appID/instanceID 返回響應碼200表示成功
發送應用實例心跳 PUT /eureka/v2/apps/appID/instanceID 返回響應碼200表示成功,404表示instanceID不存在
查詢所有實例 GET /eureka/v2/apps 返回響應碼200表示成功,響應內容格式JSON/XML
為所有appID實例做查詢(Query for all appID instances) GET /eureka/v2/apps/appID 返回響應碼200表示成功,響應內容格式JSON/XML
為特定的appID/instanceID做查詢 GET /eureka/v2/apps/appID/instanceID 返回響應碼200表示成功,響應內容格式JSON/XML
為特定的instanceID做查詢 GET /eureka/v2/instances/instanceID 返回響應碼200表示成功,響應內容格式JSON/XML
停止服務實例(Take instance out of service) PUT /eureka/v2/apps/appID/instanceID/status?value=OUT_OF_SERVICE 返回響應碼200表示成功,500失敗。
將實例恢復到服務(移除覆蓋) DELETE /eureka/v2/apps/appID/instanceID/status?value=UP (value=UP是可選的,它被建議用於fallback狀態,由於取消了覆蓋) 返回響應碼200表示成功,500失敗。
更新元數據 PUT /eureka/v2/apps/appID/instanceID/metadata?key=value 返回響應碼200表示成功,500失敗。
查詢特定vip address 下的所有實例 GET /eureka/v2/vips/vipAddress 返回響應碼200表示成功,響應內容格式:JSON/XML,返回404表示vipAddress不存在
查詢特定secure vip address下所有實例 GET /eureka/v2/svips/svipAddress 返回響應碼200表示成功,響應內容格式:JSON/XML,返回404表示svipAddress不存在

服務注冊

在進行注冊時,你需要提交符合該XSD的XML(或JSON):

<?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 -->
                <!-- ec2中的主機名應該是公告的dns名稱,在ec2內,公共dns名稱將
始終對其私有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 -->
                <!-- 可選, 如果你想更改租約的時間。 - 默認情況下90 秒。(該值會在下面會進行說明。) -->
                <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' -->
        <!-- 使用'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' -->
        <!-- 使用'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" href="http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/index.html?AESDG-chapter-instancedata.html" 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>

evictionDurationInSecs
默認情況下Eureka Server會每隔60秒檢測失效的服務,失效的服務是超過一定時間沒有發送心跳進行續約的服務。
這里的evictionDurationInSecs用來定義服務租約的超時時間。

該值定義在org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean#leaseExpirationDurationInSeconds
表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超時時間,在這個時間內若沒收到下一次心跳,則將移除該instance,默認為90秒

  • 如果該值太大,則很可能將流量轉發過去的時候,該instance已經不存活了。
  • 如果該值設置太小了,則instance則很可能因為臨時的網絡抖動而被摘除掉。
  • 該值至少應該大於leaseRenewalIntervalInSeconds

服務續約

示例 : PUT /eureka/v2/apps/MYAPP/i-6589ef6

Response:
Status: 
200 (on success)
404 (eureka doesn't know about you, Register yourself first)
500 (failure)

服務關閉/服務下線

(If Eureka doesn’t get heartbeats from the service node within the evictionDurationInSecs, then the node will get automatically de-registered )
如果Eureka在服務租約超時時間內沒有從服務節點獲得心跳續約,那么服務節點將自動取消注冊。

示例 : DELETE /eureka/v2/apps/MYAPP/i-6589ef6

Response:
Status:
200 (on success)
500 (failure)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM