javascript
java获取eureka_Spring Cloud服务发现:Eureka客户端
服務發現是基于微服務架構的關鍵原則之一。嘗試配置每個客戶端或某種形式的約定可能非常困難,可以非常脆弱。Netflix服務發現服務器和客戶端是Eureka。可以將服務器配置和部署為高可用性,每個服務器將注冊服務的狀態復制到其他服務器。
如何包含Eureka客戶端
要在您的項目中包含Eureka客戶端,請使用組org.springframework.cloud和工件IDspring-cloud-starter-eureka的啟動器。有關使用當前的Spring Cloud發布列表設置構建系統的詳細信息,請參閱Spring Cloud項目頁面。
注冊Eureka
當客戶端注冊Eureka時,它提供關于自身的元數據,例如主機和端口,健康指示符URL,主頁等。Eureka從屬于服務的每個實例接收心跳消息。如果心跳失敗超過可配置的時間表,則通常將該實例從注冊表中刪除。
示例eureka客戶端:
(即完全正常的Spring Boot應用程序)。在這個例子中,我們明確地使用@EnableEurekaClient,但只有Eureka可用,你也可以使用@EnableDiscoveryClient。需要配置才能找到Eureka服務器。例:
application.yml
其中“defaultZone”是一個魔術字符串后備值,為任何不表示首選項的客戶端提供服務URL(即它是有用的默認值)。
從Environment獲取的默認應用程序名稱(服務ID),虛擬主機和非安全端口分別為${spring.application.name},${spring.application.name}和${server.port}。
@EnableEurekaClient將應用程序同時進入一個Eureka“實例”(即注冊自己)和一個“客戶端”(即它可以查詢注冊表以查找其他服務)。實例行為由eureka.instance.*配置鍵驅動,但是如果您確保您的應用程序具有spring.application.name(這是Eureka服務ID或VIP的默認值),那么默認值將是正常的。
使用Eureka服務器進行身份驗證
如果其中一個eureka.client.serviceUrl.defaultZone網址中包含一個憑據(如http://user:password@localhost:8761/eureka)),HTTP基本身份驗證將自動添加到您的eureka客戶端。對于更復雜的需求,您可以創建DiscoveryClientOptionalArgs類型的@Bean,并將ClientFilter實例注入到其中,所有這些都將應用于從客戶端到服務器的調用。
狀態頁和健康指標
Eureka實例的狀態頁面和運行狀況指示器分別默認為“/ info”和“/ health”,它們是Spring Boot執行器應用程序中有用端點的默認位置。如果您使用非默認上下文路徑或servlet路徑(例如server.servletPath=/foo)或管理端點路徑(例如management.contextPath=/admin),則需要更改這些,即使是執行器應用程序。例:
application.yml
這些鏈接顯示在客戶端使用的元數據中,并在某些情況下用于決定是否將請求發送到應用程序,因此如果它們是準確的,這是有幫助的。
注冊安全應用程序
如果您的應用程序想通過HTTPS聯系,則可以分別在EurekaInstanceConfig,即eureka.instance.[nonSecurePortEnabled,securePortEnabled]=[false,true]中設置兩個標志。這將使Eureka發布實例信息顯示安全通信的明確偏好。Spring CloudDiscoveryClient將始終為以這種方式配置的服務返回一個https://…;URI,并且Eureka(本機)實例信息將具有安全的健康檢查URL。
由于Eureka內部的工作方式,它仍然會發布狀態和主頁的非安全網址,除非您也明確地覆蓋。您可以使用占位符來配置eureka實例URL,例如
application.yml
(請注意,${eureka.hostname}是僅在稍后版本的Eureka中可用的本地占位符,您也可以使用Spring占位符實現同樣的功能,例如使用${eureka.instance.hostName}。
Eureka的健康檢查
默認情況下,Eureka使用客戶端心跳來確定客戶端是否啟動。除非另有規定,否則發現客戶端將不會根據Spring Boot執行器傳播應用程序的當前運行狀況檢查狀態。這意味著成功注冊后Eureka將永遠宣布申請處于“UP”狀態。通過啟用Eureka運行狀況檢查可以改變此行為,從而將應用程序狀態傳播到Eureka。因此,每個其他應用程序將不會在“UP”之外的狀態下將流量發送到應用程序。
application.yml
如果您需要更多的控制健康檢查,您可以考慮實施自己的com.netflix.appinfo.HealthCheckHandler。
Eureka實例和客戶端的元數據
值得花點時間了解Eureka元數據的工作原理,以便您可以在平臺上使用它。有主機名,IP地址,端口號,狀態頁和運行狀況檢查等標準元數據。這些發布在服務注冊表中,由客戶使用,以直接的方式聯系服務。額外的元數據可以添加到eureka.instance.metadataMap中的實例注冊中,并且這將在遠程客戶端中可訪問,但一般不會更改客戶端的行為,除非意識到元數據的含義。下面描述了幾個特殊情況,其中Spring Cloud已經為元數據映射指定了含義。
在Cloudfoundry上使用Eureka
Cloudfoundry有一個全局路由器,所以同一個應用程序的所有實例都具有相同的主機名(在具有相似架構的其他PaaS解決方案中也是如此)。這不一定是使用Eureka的障礙,但如果您使用路由器(建議,甚至是強制性的,具體取決于您的平臺的設置方式),則需要明確設置主機名和端口號(安全或非安全),以便他們使用路由器。您可能還需要使用實例元數據,以便您可以區分客戶端上的實例(例如,在自定義負載平衡器中)。默認情況下,eureka.instance.instanceId為vcap.application.instance_id。例如:
application.yml
根據Cloudfoundry實例中安全規則的設置方式,您可以注冊并使用主機VM的IP地址進行直接的服務到服務調用。此功能尚未在Pivotal Web Services(PWS)上提供。
在AWS上使用Eureka
如果應用程序計劃將部署到AWS云,那么Eureka實例必須被配置為AWS意識到,這可以通過定制來完成EurekaInstanceConfigBean方式如下:
更改Eureka實例ID
香草Netflix Eureka實例注冊了與其主機名相同的ID(即每個主機只有一個服務)。Spring Cloud Eureka提供了一個明智的默認,如下所示:${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}}。例如myhost:myappname:8080。
使用Spring Cloud,您可以通過在eureka.instance.instanceId中提供唯一的標識符來覆蓋此。例如:
application.yml
使用這個元數據和在localhost上部署的多個服務實例,隨機值將在那里進行,以使實例是唯一的。在Cloudfoundry中,vcap.application.instance_id將在Spring Boot應用程序中自動填充,因此不需要隨機值。
使用EurekaClient
一旦您擁有@EnableDiscoveryClient(或@EnableEurekaClient)的應用程序,您就可以使用它來從Eureka服務器發現服務實例。一種方法是使用本機com.netflix.discovery.EurekaClient(而不是Spring云DiscoveryClient),例如
本機Netflix EurekaClient的替代方案
您不必使用原始的NetflixEurekaClient,通常在某種包裝器后面使用它更為方便。Spring Cloud支持Feign(REST客戶端構建器),還支持Spring
RestTemplate
使用邏輯Eureka服務標識符(VIP)而不是物理URL。
要使用固定的物理服務器列表配置Ribbon,您可以將.ribbon.listOfServers設置為逗號分隔的物理地址(或主機名)列表,其中是客戶端的ID。
您還可以使用org.springframework.cloud.client.discovery.DiscoveryClient,它為Netflix不具體的發現客戶端提供簡單的API,例如
為什么注冊服務這么慢?
作為一個實例也包括定期心跳到注冊表(通過客戶端的serviceUrl),默認持續時間為30秒。在實例,服務器和客戶端在其本地緩存中都具有相同的元數據(因此可能需要3個心跳)之前,客戶端才能發現服務。您可以使用eureka.instance.leaseRenewalIntervalInSeconds更改期限,這將加快客戶端連接到其他服務的過程。在生產中,最好堅持使用默認值,因為服務器內部有一些計算可以對租賃更新期進行假設。
區
如果您已將Eureka客戶端部署到多個區域,您可能希望這些客戶端在使用另一個區域中的服務之前,利用同一區域內的服務。為此,您需要正確配置您的Eureka客戶端。
首先,您需要確保將Eureka服務器部署到每個區域,并且它們是彼此的對等體。有關詳細信息,請參閱區域和區域部分。
接下來,您需要告知Eureka您的服務所在的區域。您可以使用metadataMap屬性來執行此操作。例如,如果service 1部署到zone 1和zone 2,則需要在service 1中設置以下Eureka屬性
1區服務1
eureka.instance.metadataMap.zone = zone1
eureka.client.preferSameZoneEureka = true
第2區的服務1
eureka.instance.metadataMap.zone = zone2
eureka.client.preferSameZoneEureka = true
總結
以上是生活随笔為你收集整理的java获取eureka_Spring Cloud服务发现:Eureka客户端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中 queryparam_@Pa
- 下一篇: java封装的快捷_Fast-boot: