溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Eureka的REST API及API擴(kuò)展是怎樣的

發(fā)布時(shí)間:2021-09-29 14:56:56 來(lái)源:億速云 閱讀:127 作者:柒染 欄目:編程語(yǔ)言

這篇文章給大家介紹Eureka的REST API及API擴(kuò)展是怎樣的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

Eureka REST API

Eureka 作為注冊(cè)中心,其本質(zhì)是存儲(chǔ)了每個(gè)客戶端的注冊(cè)信息,Ribbon 在轉(zhuǎn)發(fā)的時(shí)候會(huì)獲取注冊(cè)中心的服務(wù)列表,然后根據(jù)對(duì)應(yīng)的路由規(guī)則來(lái)選擇一個(gè)服務(wù)給 Feign 來(lái)進(jìn)行調(diào)用。如果我們不是 Spring Cloud 技術(shù)選型,也想用 Eureka,可以嗎?完全可以。

如果不是 Spring Cloud 技術(shù)棧,筆者推薦用 Zookeeper,這樣會(huì)方便些,當(dāng)然用 Eureka 也是可以的,這樣的話就會(huì)涉及如何注冊(cè)信息、如何獲取注冊(cè)信息等操作。其實(shí) Eureka 也考慮到了這點(diǎn),提供了很多 REST 接口來(lái)給我們調(diào)用。

我們舉一個(gè)比較有用的案例來(lái)說(shuō)明,比如對(duì) Nginx 動(dòng)態(tài)進(jìn)行 upstream 的配置。

推薦分布式架構(gòu)源碼

在架構(gòu)變成微服務(wù)之后,微服務(wù)是沒(méi)有依賴的,可以獨(dú)立部署,端口也可以隨機(jī)分配,反正會(huì)注冊(cè)到注冊(cè)中心里面,調(diào)用方也無(wú)須關(guān)心提供方的 IP 和 Port,這些都可以從注冊(cè)中心拿到。

但是有一個(gè)問(wèn)題:API 網(wǎng)關(guān)的部署能這樣嗎?API 網(wǎng)關(guān)大部分會(huì)用 Nginx 作為負(fù)載,那么 Nginx 就必須知道 API 網(wǎng)關(guān)有哪幾個(gè)節(jié)點(diǎn),這樣網(wǎng)關(guān)服務(wù)就不能隨便啟動(dòng)了,需要固定。

當(dāng)然網(wǎng)關(guān)是不會(huì)經(jīng)常變動(dòng)的,也不會(huì)經(jīng)常發(fā)布,這樣其實(shí)也沒(méi)什么大問(wèn)題,唯一不好的就是不能自動(dòng)擴(kuò)容了。

其實(shí)利用 Eureka 提供的 API 我們可以獲取某個(gè)服務(wù)的實(shí)例信息,也就是說(shuō)我們可以根據(jù) Eureka 中的數(shù)據(jù)來(lái)動(dòng)態(tài)配置 Nginx 的 upstream。

這樣就可以做到網(wǎng)關(guān)的自動(dòng)部署和擴(kuò)容了。網(wǎng)上也有很多的方案,結(jié)合 Lua 腳本來(lái)做,或者自己寫 Sheel 腳本都可以。

下面舉例說(shuō)明如何獲取 Eureka 中注冊(cè)的信息。具體的接口信息請(qǐng)查看官方文檔“https://github.com/Netflix/eureka/wiki/Eureka-REST-operations“。

獲取某個(gè)服務(wù)的注冊(cè)信息,可以直接 GET 請(qǐng)求:http://localhost:8761/eureka/apps/eureka-client-user-service。其中,eureka-client-user-service 是應(yīng)用名稱,也就是 spring.application.name。

在瀏覽器中,數(shù)據(jù)的顯示格式默認(rèn)是 XML 格式的,如圖 1 所示。

Eureka的REST API及API擴(kuò)展是怎樣的

如果想返回 Json數(shù)據(jù)的格式,可以用一些接口測(cè)試工具來(lái)請(qǐng)求,比如 Postman,在請(qǐng)求頭中添加下面兩行代碼即可。

Content-Type:application/json Accept:application/json

如果 Eureka 開(kāi)啟了認(rèn)證,記得添加認(rèn)證信息,用戶名和密碼必須是 Base64 編碼過(guò)的 Authorization:Basic 用戶名:密碼,其余的接口就不做過(guò)多講解了,大家可以自己去嘗試。Postman 直接支持了 Basic 認(rèn)證,將選項(xiàng)從 Headers 切換到 Authorization,選擇認(rèn)證方式為 Basic Auth 就可以填寫用戶信息了。

填寫完之后,直接發(fā)起請(qǐng)求就可以了。我們切換到 Headers 選項(xiàng)中,就可以看到請(qǐng)求頭中已經(jīng)多了一個(gè) Authorization 頭。

元數(shù)據(jù)使用

Eureka 的元數(shù)據(jù)有兩種類型,分別是框架定好了的標(biāo)準(zhǔn)元數(shù)據(jù)和用戶自定義元數(shù)據(jù)。標(biāo)準(zhǔn)元數(shù)據(jù)指的是主機(jī)名、IP 地址、端口號(hào)、狀態(tài)頁(yè)和健康檢查等信息,這些信息都會(huì)被發(fā)布在服務(wù)注冊(cè)表中,用于服務(wù)之間的調(diào)用。自定義元數(shù)據(jù)可以使用 eureka.instance.metadataMap 進(jìn)行配置。

自定義元數(shù)據(jù)說(shuō)得通俗點(diǎn)就是自定義配置,我們可以為每個(gè) Eureka Client 定義一些屬于自己的配置,這個(gè)配置不會(huì)影響 Eureka 的功能。

自定義元數(shù)據(jù)可以用來(lái)做一些擴(kuò)展信息,比如灰度發(fā)布之類的功能,可以用元數(shù)據(jù)來(lái)存儲(chǔ)灰度發(fā)布的狀態(tài)數(shù)據(jù),Ribbon 轉(zhuǎn)發(fā)的時(shí)候就可以根據(jù)服務(wù)的元數(shù)據(jù)來(lái)做一些處理。當(dāng)不需要灰度發(fā)布的時(shí)候可以調(diào)用 Eureka 提供的 REST API 將元數(shù)據(jù)清除掉。

下面我們來(lái)自定義一個(gè)簡(jiǎn)單的元數(shù)據(jù),在屬性文件中配置如下:

eureka.instance.metadataMap.biancheng=zhangsan

上述代碼定義了一個(gè) key 為 biancheng 的配置,value 是 zhangsan。重啟服務(wù),然后通過(guò) Eureka 提供的 REST API 來(lái)查看剛剛配置的元數(shù)據(jù)是否已經(jīng)存在于 Eureka 中,如圖 2 所示。

Eureka的REST API及API擴(kuò)展是怎樣的

EurekaClient 使用

當(dāng)我們的項(xiàng)目中集成了 Eureka 之后,可以通過(guò) EurekaClient 來(lái)獲取一些我們想要的數(shù)據(jù),比如剛剛上面講的元數(shù)據(jù)。我們就可以直接通過(guò) EurekaClient 來(lái)獲?。ùa如下所示),不用再去調(diào)用 Eureka 提供的 REST API。

@Autowiredprivate EurekaClient eurekaClient;@GetMapping("/article/infos")public Object serviceUrl() {return eurekaClient.getInstancesByVipAddress( "eureka-client-user-service", false);
}

通過(guò) PostMan 來(lái)調(diào)用接口看看有沒(méi)有返回我們想要的數(shù)據(jù)。這時(shí)我們會(huì)發(fā)現(xiàn),通過(guò) EurekaClient 獲取的數(shù)據(jù)跟我們自己去掉 API 獲取的數(shù)據(jù)是一樣的,從使用角度來(lái)說(shuō)前者比較方便。

除了使用 EurekaClient,還可以使用 DiscoveryClient(代碼如下所示),這個(gè)不是 Feign 自帶的,是 Spring Cloud 重新封裝的,類的路徑為 org.springframework.cloud.client.discovery.DiscoveryClient。

@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/article/infos")public Object serviceUrl() {return discoveryClient.getInstances("eureka-client-user-service");
}

健康檢查

默認(rèn)情況下,Eureka 客戶端是使用心跳和服務(wù)端通信來(lái)判斷客戶端是否存活,在某些場(chǎng)景下,比如 MongoDB 出現(xiàn)了異常,但你的應(yīng)用進(jìn)程還是存在的,這就意味著應(yīng)用可以繼續(xù)通過(guò)心跳上報(bào),保持應(yīng)用自己的信息在 Eureka 中不被剔除掉。

Spring Boot Actuator 提供了 /actuator/health 端點(diǎn),該端點(diǎn)可展示應(yīng)用程序的健康信息,當(dāng) MongoDB 異常時(shí),/actuator/health 端點(diǎn)的狀態(tài)會(huì)變成 DOWN,由于應(yīng)用本身確實(shí)處于存活狀態(tài),但是 MongoDB 的異常會(huì)影響某些功能,當(dāng)請(qǐng)求到達(dá)應(yīng)用之后會(huì)發(fā)生操作失敗的情況。

在這種情況下,我們希望可以將健康信息傳遞給 Eureka 服務(wù)端。這樣 Eureka 中就能及時(shí)將應(yīng)用的實(shí)例信息下線,隔離正常請(qǐng)求,防止出錯(cuò)。通過(guò)配置如下內(nèi)容開(kāi)啟健康檢查:

eureka.client.healthcheck.enabled=true

我們可以通過(guò)擴(kuò)展健康檢查的端點(diǎn)來(lái)模擬異常情況,定義一個(gè)擴(kuò)展端點(diǎn),將狀態(tài)設(shè)置為 DOWN,代碼如下所示。

@Componentpublic class CustomHealthIndicator extends AbstractHealthIndicator {@Overrideprotected void doHealthCheck(Builder builder) throws Exception {
        builder.down().withDetail("status", false);
    }
}

擴(kuò)展好后我們?cè)L問(wèn) /actuator/health 可以看到當(dāng)前的狀態(tài)是 DOWN,如圖 3 所示。

Eureka的REST API及API擴(kuò)展是怎樣的

Eureka 中的狀態(tài)是 UP,這種情況下請(qǐng)求還是能轉(zhuǎn)發(fā)到這個(gè)服務(wù)中,下面我們開(kāi)啟監(jiān)控檢查,再次查看 Eureka 中的狀態(tài),發(fā)現(xiàn)狀態(tài)變?yōu)?DOWN(1)。

服務(wù)上下線監(jiān)控

在某些特定的需求下,我們需要對(duì)服務(wù)的上下線進(jìn)行監(jiān)控,上線或下線都進(jìn)行郵件通知,Eureka 中提供了事件監(jiān)聽(tīng)的方式來(lái)擴(kuò)展。

目前支持的事件如下:

  • EurekaInstanceCanceledEvent 服務(wù)下線事件。

  • EurekaInstanceRegisteredEvent 服務(wù)注冊(cè)事件。

  • EurekaInstanceRenewedEvent 服務(wù)續(xù)約事件。

  • EurekaRegistryAvailableEvent Eureka 注冊(cè)中心啟動(dòng)事件。

  • EurekaServerStartedEvent Eureka Server 啟動(dòng)事件。


基于 Eureka 提供的事件機(jī)制,可以監(jiān)控服務(wù)的上下線過(guò)程,在過(guò)程發(fā)生中可以發(fā)送郵件來(lái)進(jìn)行通知。下面代碼只是演示了監(jiān)控的過(guò)程,并未發(fā)送郵件。

@Componentpublic class EurekaStateChangeListener {

    @EventListenerpublic void listen(EurekaInstanceCanceledEvent event) {
        System.err.println(event.getServerId() + "\t" + event.getAppName() + " 服務(wù)下線 ");
    }

    @EventListenerpublic void listen(EurekaInstanceRegisteredEvent event) {
        InstanceInfo instanceInfo = event.getInstanceInfo();
        System.err.println(instanceInfo.getAppName() + " 進(jìn)行注冊(cè) ");
    }

    @EventListenerpublic void listen(EurekaInstanceRenewedEvent event) {
        System.err.println(event.getServerId() + "\t" + event.getAppName() + " 服務(wù)進(jìn)行續(xù)約 ");
    }

    @EventListenerpublic void listen(EurekaRegistryAvailableEvent event) {
        System.err.println(" 注冊(cè)中心啟動(dòng) ");
    }

    @EventListenerpublic void listen(EurekaServerStartedEvent event) {
        System.err.println("Eureka Server啟動(dòng) ");
    }
}

注意:在 Eureka 集群環(huán)境下,每個(gè)節(jié)點(diǎn)都會(huì)觸發(fā)事件,這個(gè)時(shí)候需要控制下發(fā)送通知的行為,不控制的話每個(gè)節(jié)點(diǎn)都會(huì)發(fā)送通知。

關(guān)于Eureka的REST API及API擴(kuò)展是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI