摘要:這些發布在服務注冊表中,客戶端使用它們以直接的方式聯系服務,可以將額外元數據添加到中的實例注冊中,并且可以在遠程客戶端中訪問此元數據。
服務發現:Eureka客戶端
服務發現是基于微服務架構的關鍵原理之一,嘗試手動配置每個客戶端或某種形式的約定可能很難做到并且可能很脆弱,Eureka是Netflix Service Discovery服務器和客戶端,服務器可以被配置和部署為高可用性,每個服務器將注冊服務的狀態復制到其他服務器。
如何包含Eureka客戶端要在項目中包含Eureka Client,請使用組ID為org.springframework.cloud和工件ID為spring-cloud-starter-netflix-eureka-client的啟動器。
注冊Eureka當客戶端向Eureka注冊時,它會提供有關自身的元數據 — 例如主機、端口、健康指示器URL、主頁和其他詳細信息,Eureka從屬于服務的每個實例接收心跳消息,如果心跳故障超過可配置的時間表,則通常會從注冊表中刪除該實例。
以下示例顯示了最小的Eureka客戶端應用程序:
@SpringBootApplication @RestController public class Application { @RequestMapping("/") public String home() { return "Hello world"; } public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
請注意,前面的示例顯示了一個普通的Spring Boot應用程序,通過在類路徑上使用spring-cloud-starter-netflix-eureka-client,你的應用程序會自動向Eureka Server注冊,找到Eureka服務器需要進行配置,如以下示例所示:
application.yml
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
在前面的示例中,“defaultZone”是一個神奇的字符串回退值,它為任何不表示首選項的客戶端提供服務URL(換句話說,它是一個有用的默認值)。
默認應用程序名稱(即服務ID)、虛擬主機和非安全端口(取自Environment)分別是${spring.application.name}、${spring.application.name}和${server.port}。
在類路徑上使用spring-cloud-starter-netflix-eureka-client使應用程序成為Eureka“實例”(即,它自己注冊)和“客戶端”(它可以查詢注冊表以查找其他服務),實例行為由eureka.instance.*配置鍵驅動,但如果你確保應用程序具有spring.application.name的值(這是Eureka服務ID或VIP的默認值),則默認值很好。
有關可配置選項的更多詳細信息,請參閱EurekaInstanceConfigBean和EurekaClientConfigBean。
要禁用Eureka Discovery Client,可以將eureka.client.enabled設置為false。
使用Eureka Server進行身份驗證如果其中一個eureka.client.serviceUrl.defaultZone URL中嵌入了憑據,則會自動將HTTP基本身份驗證添加到你的eureka客戶端(curl樣式,如下所示:http://user:password@localhost:8761/eureka)。對于更復雜的需求,你可以創建一個類型為DiscoveryClientOptionalArgs的@Bean并將ClientFilter實例注入其中,所有這些都應用于從客戶端到服務器的調用。
由于Eureka的限制,無法支持每個服務器基本身份驗證憑據,因此僅使用找到的第一個集合。狀態頁面和健康指示器
Eureka實例的狀態頁面和健康指示器分別默認為/info和/health,它們是Spring Boot Actuator應用程序中有用端點的默認位置,如果使用非默認上下文路徑或servlet路徑(例如server.servletPath=/custom),則需要更改這些,即使對于Actuator應用程序也是如此,以下示例顯示了兩個設置的默認值:
application.yml
eureka: instance: statusPageUrlPath: ${server.servletPath}/info healthCheckUrlPath: ${server.servletPath}/health
這些鏈接顯示在客戶端使用的元數據中,并在某些情況下用于決定是否向你的應用程序發送請求,因此如果它們準確,則會很有幫助。
在Dalston中,還需要在更改管理上下文路徑時設置狀態和健康檢查URL,從Edgware開始刪除此要求。注冊安全應用程序
如果你的應用程序想通過HTTPS聯系,你可以在EurekaInstanceConfig中設置兩個標志:
eureka.instance.[nonSecurePortEnabled]=[false]
eureka.instance.[securePortEnabled]=[true]
這樣做會使Eureka發布顯示對安全通信明確偏好的實例信息,對于以這種方式配置的服務,Spring Cloud DiscoveryClient始終返回以https開頭的URI,同樣,當以這種方式配置服務時,Eureka(本機)實例信息具有安全的健康檢查URL。
由于Eureka在內部工作的方式,它仍然會發布狀態和主頁的非安全URL,除非你也明確地覆蓋這些URL,你可以使用占位符來配置eureka實例URL,如以下示例所示:
application.yml
eureka: instance: statusPageUrl: https://${eureka.hostname}/info healthCheckUrl: https://${eureka.hostname}/health homePageUrl: https://${eureka.hostname}/
請注意,${eureka.hostname}是一個原生占位符,僅在更高版本的Eureka中可用,你也可以使用Spring占位符實現相同的功能 — 例如,使用${eureka.instance.hostName}。
如果你的應用程序在代理后面運行,并且SSL終止在代理中(例如,如果你在Cloud Foundry或其他平臺中作為服務運行),然后,你需要確保代理“轉發” headers被應用程序攔截和處理。如果嵌入在Spring Boot應用程序中的Tomcat容器具有針對X-Forwarded-* headers的顯式配置,則會自動發生,應用程序呈現到自身的鏈接錯誤(錯誤的主機、端口或協議)表明你的配置錯誤。Eureka的健康檢查
默認情況下,Eureka使用客戶端心跳來確定客戶端是否已啟動,除非另有說明,否則Discovery Client不會根據Spring Boot Actuator傳播應用程序的當前健康檢查狀態,因此,在成功注冊后,Eureka始終宣布應用程序處于“UP”狀態,通過啟用Eureka健康檢查可以更改此行為,從而將應用程序狀態傳播到Eureka。因此,每個其他應用程序都不會向“UP”以外的狀態下的應用程序發送流量,以下示例顯示如何為客戶端啟用健康檢查:
application.yml
eureka: client: healthcheck: enabled: true
eureka.client.healthcheck.enabled=true應該只在application.yml中設置,在bootstrap.yml中設置值會導致不良副作用,例如在Eureka中以UNKNOWN狀態注冊。
如果你需要更多控制健康檢查,請考慮實現自己的com.netflix.appinfo.HealthCheckHandler。
實例和客戶端的Eureka元數據值得花一些時間了解Eureka元數據的工作原理,因此你可以在平臺中使用它,有用于信息的標準元數據,如主機名、IP地址、端口號、狀態頁和健康檢查。這些發布在服務注冊表中,客戶端使用它們以直接的方式聯系服務,可以將額外元數據添加到eureka.instance.metadataMap中的實例注冊中,并且可以在遠程客戶端中訪問此元數據。通常,除非客戶端了解元數據的含義,否則額外元數據不會更改客戶端的行為,本文稍后將介紹幾種特殊情況,其中Spring Cloud已經為元數據映射賦予了意義。
在Cloud Foundry上使用EurekaCloud Foundry有一個全局路由器,因此同一個應用程序的所有實例都具有相同的主機名(具有類似架構的其他PaaS解決方案),這不一定是使用Eureka的障礙。但是,如果你使用路由器(建議甚至強制使用,具體取決于你的平臺的設置方式),你需要明確設置主機名和端口號(安全或非安全),以便他們使用路由器。你可能還希望使用實例元數據,以便區分客戶端上的實例(例如,在自定義負載均衡器中),默認情況下,eureka.instance.instanceId是vcap.application.instance_id,如以下示例所示:
application.yml
eureka: instance: hostname: ${vcap.application.uris[0]} nonSecurePort: 80
根據在Cloud Foundry實例中設置安全規則的方式,你可以注冊并使用主機VM的IP地址進行直接服務到服務調用,Pivotal Web Services(PWS)尚未提供此功能。
在AWS上使用Eureka如果計劃將應用程序部署到AWS云,則必須將Eureka實例配置為支持AWS,你可以通過自定義EurekaInstanceConfigBean來執行此操作,如下所示:
@Bean @Profile("!default") public EurekaInstanceConfigBean eurekaInstanceConfig(InetUtils inetUtils) { EurekaInstanceConfigBean b = new EurekaInstanceConfigBean(inetUtils); AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka"); b.setDataCenterInfo(info); return b; }更改Eureka實例ID
一個vanilla 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
eureka: instance: instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
使用前面示例中顯示的元數據和部署在localhost上的多個服務實例,將隨機值插入其中以使實例唯一,在Cloud Foundry中,vcap.application.instance_id會自動填充在Spring Boot應用程序中,因此不需要隨機值。
使用EurekaClient一旦你擁有一個發現客戶端的應用程序,就可以使用它從Eureka Server發現服務實例,一種方法是使用原生com.netflix.discovery.EurekaClient(而不是Spring Cloud DiscoveryClient),如以下示例所示:
@Autowired private EurekaClient discoveryClient; public String serviceUrl() { InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false); return instance.getHomePageUrl(); }
不要在@PostConstruct方法或@Scheduled方法中使用EurekaClient(或者可能尚未啟動ApplicationContext的任何地方),它在SmartLifecycle中初始化(phase=0),因此最早可以依賴它的是另一個具有更高階段的SmartLifecycle。沒有Jersey的EurekaClient
默認情況下,EurekaClient使用Jersey進行HTTP通信,如果你希望避免來自Jersey的依賴項,則可以將其從依賴項中排除,Spring Cloud基于Spring RestTemplate自動配置傳輸客戶端,以下示例顯示Jersey被排除在外:
原生Netflix EurekaClient的替代品org.springframework.cloud spring-cloud-starter-netflix-eureka-client com.sun.jersey jersey-client com.sun.jersey jersey-core com.sun.jersey.contribs jersey-apache-client4
你無需使用原始Netflix EurekaClient,此外,在某種包裝后面使用它通常更方便,Spring Cloud通過邏輯Eureka服務標識符(VIP)而不是物理URL支持Feign(REST客戶端構建器)和Spring RestTemplate。要使用固定的物理服務器列表配置Ribbon,可以將
你還可以使用org.springframework.cloud.client.discovery.DiscoveryClient,它為發現客戶端提供簡單的API(不特定于Netflix),如以下示例所示:
@Autowired private DiscoveryClient discoveryClient; public String serviceUrl() { List為什么注冊服務這么慢?list = discoveryClient.getInstances("STORES"); if (list != null && list.size() > 0 ) { return list.get(0).getUri(); } return null; }
作為實例還涉及到注冊表的定期心跳(通過客戶端的serviceUrl),默認持續時間為30秒,在實例、服務器和客戶端在其本地緩存中都具有相同的元數據之前,客戶端無法發現服務(因此可能需要3個心跳)。你可以通過設置eureka.instance.leaseRenewalIntervalInSeconds來更改周期,將其設置為小于30的值會加快使客戶端連接到其他服務的過程,在生產中,最好堅持使用默認值,因為服務器中的內部計算會對租約續期做出假設。
Zones如果你已將Eureka客戶端部署到多個區域,你可能希望這些客戶端在嘗試另一個區域中的服務之前使用同一區域內的服務,要進行此設置,你需要正確配置Eureka客戶端。
首先,你需要確保將Eureka服務器部署到每個區域,并確保它們彼此對等,有關詳細信息,請參閱有關Zones和Regions的部分。
接下來,你需要告訴Eureka你的服務所在的區域,你可以使用metadataMap屬性執行此操作,例如,如果將service 1部署到zone 1和zone 2,則需要在service 1中設置以下Eureka屬性:
zone 1的service 1
eureka.instance.metadataMap.zone = zone1 eureka.client.preferSameZoneEureka = true
zone 2的service 1
eureka.instance.metadataMap.zone = zone2 eureka.client.preferSameZoneEureka = true上一篇:Spring Cloud Config Client 下一篇:服務發現:Eureka Server
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74146.html
摘要:何時首選地址在某些情況下,最好公布服務的地址而不是主機名,將設置為,當應用程序向注冊時,它使用其地址而不是其主機名。 服務發現:Eureka Server 本節介紹如何設置Eureka服務器。 如何包含Eureka服務器 要在項目中包含Eureka Server,請使用組ID為org.springframework.cloud和工件ID為spring-cloud-starter-net...
摘要:應用程序可以立即利用或應用程序開發人員提供的其他外部屬性源,它還提取了一些與變化事件相關的額外有用特性。標簽也可以以逗號分隔列表的形式提供,在這種情況下,列表中的項目將逐個嘗試,直到成功為止,在處理特性分支時,此行為非常有用。 Spring Cloud Config Client Spring Boot應用程序可以立即利用Spring Config Server(或應用程序開發人員提供...
摘要:下一篇介紹基于的服務注冊與調用。服務提供者工程配置這里服務提供者是使用之前進階教程第三篇整合連接池以及監控改造而來,這里一樣的部分就不再重復說明,下面將說明新增的部分。 Spring Cloud簡介 Spring Cloud是一個基于Spring Boot實現的云應用開發工具,它為基于JVM的云應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分...
摘要:客戶端負載均衡器是一個客戶端負載均衡器,可以讓你對和客戶端的行為進行大量控制,已經使用了,因此,如果你使用,此部分也適用。 客戶端負載均衡器:Ribbon Ribbon是一個客戶端負載均衡器,可以讓你對HTTP和TCP客戶端的行為進行大量控制,Feign已經使用了Ribbon,因此,如果你使用@FeignClient,此部分也適用。 Ribbon中的一個核心概念是命名客戶端,每個負載均...
閱讀 899·2021-10-25 09:44
閱讀 1272·2021-09-23 11:56
閱讀 1194·2021-09-10 10:50
閱讀 3140·2019-08-30 15:53
閱讀 2143·2019-08-30 13:17
閱讀 626·2019-08-29 18:43
閱讀 2501·2019-08-29 12:57
閱讀 862·2019-08-26 12:20