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