在構(gòu)建項目之前,我們先學(xué)習(xí)一下eureka常遂,這是官方的講解纳令,我這邊再重新幫大家回顧一下:
服務(wù)發(fā)現(xiàn)是基于微服務(wù)架構(gòu)的關(guān)鍵原則之一。嘗試配置每個客戶端或某種形式的約定可能非常困難克胳,可以非常脆弱平绩。Netflix服務(wù)發(fā)現(xiàn)服務(wù)器和客戶端是Eureka∧恚可以將服務(wù)器配置和部署為高可用性馒过,每個服務(wù)器將注冊服務(wù)的狀態(tài)復(fù)制到其他服務(wù)器。
要在您的項目中包含Eureka客戶端酗钞,請使用組org.springframework.cloud和工件ID spring-cloud-starter-eureka的啟動器腹忽。
當(dāng)客戶端注冊Eureka時,它提供關(guān)于自身的元數(shù)據(jù)砚作,例如主機(jī)和端口窘奏,健康指示符URL,主頁等葫录。Eureka從屬于服務(wù)的每個實例接收心跳消息着裹。如果心跳失敗超過可配置的時間表,則通常將該實例從注冊表中刪除米同。
示例eureka客戶端:
@Configuration@ComponentScan@EnableAutoConfiguration@EnableEurekaClient@RestControllerpublic 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應(yīng)用程序)骇扇。在這個例子中,我們明確地使用@EnableEurekaClient面粮,但只有Eureka可用少孝,你也可以使用@EnableDiscoveryClient。需要配置才能找到Eureka服務(wù)器熬苍。例:
application.yml
eureka:client:serviceUrl:defaultZone:http://localhost:8761/eureka/
其中“defaultZone”是一個魔術(shù)字符串后備值稍走,為任何不表示首選項的客戶端提供服務(wù)URL(即它是有用的默認(rèn)值)袁翁。
從Environment獲取的默認(rèn)應(yīng)用程序名稱(服務(wù)ID),虛擬主機(jī)和非安全端口分別為${spring.application.name}婿脸,${spring.application.name}和${server.port}粱胜。
@EnableEurekaClient將應(yīng)用程序同時進(jìn)入一個Eureka“實例”(即注冊自己)和一個“客戶端”(即它可以查詢注冊表以查找其他服務(wù))。實例行為由eureka.instance.*配置鍵驅(qū)動狐树,但是如果您確保您的應(yīng)用程序具有spring.application.name(這是Eureka服務(wù)ID或VIP的默認(rèn)值)焙压,那么默認(rèn)值將是正常的。
使用Eureka服務(wù)器進(jìn)行身份驗證
如果其中一個eureka.client.serviceUrl.defaultZone網(wǎng)址中包含一個憑據(jù)(如http://user:password@localhost:8761/eureka))抑钟,HTTP基本身份驗證將自動添加到您的eureka客戶端冗恨。對于更復(fù)雜的需求,您可以創(chuàng)建DiscoveryClientOptionalArgs類型的@Bean味赃,并將ClientFilter實例注入到其中掀抹,所有這些都將應(yīng)用于從客戶端到服務(wù)器的調(diào)用。
注意
由于Eureka中的限制心俗,不可能支持每個服務(wù)器的基本身份驗證憑據(jù)傲武,所以只能使用第一個找到的集合。
狀態(tài)頁和健康指標(biāo)
Eureka實例的狀態(tài)頁面和運(yùn)行狀況指示器分別默認(rèn)為“/ info”和“/ health”城榛,它們是Spring Boot執(zhí)行器應(yīng)用程序中有用端點(diǎn)的默認(rèn)位置揪利。如果您使用非默認(rèn)上下文路徑或servlet路徑(例如server.servletPath=/foo)或管理端點(diǎn)路徑(例如management.contextPath=/admin),則需要更改這些狠持,即使是執(zhí)行器應(yīng)用程序疟位。例:
application.yml
eureka:
instance:
statusPageUrlPath: ${management.context-path}/info
healthCheckUrlPath: ${management.context-path}/health
這些鏈接顯示在客戶端使用的元數(shù)據(jù)中,并在某些情況下用于決定是否將請求發(fā)送到應(yīng)用程序喘垂,因此如果它們是準(zhǔn)確的甜刻,這是有幫助的。
注冊安全應(yīng)用程序
如果您的應(yīng)用程序想通過HTTPS聯(lián)系正勒,則可以分別在EurekaInstanceConfig得院,即 eureka.instance.[nonSecurePortEnabled,securePortEnabled]=[false,true] 中設(shè)置兩個標(biāo)志。這將使Eureka發(fā)布實例信息顯示安全通信的明確偏好章贞。Spring Cloud DiscoveryClient將始終為以這種方式配置的服務(wù)返回一個https://…?; URI祥绞,并且Eureka(本機(jī))實例信息將具有安全的健康檢查URL。
由于Eureka內(nèi)部的工作方式鸭限,它仍然會發(fā)布狀態(tài)和主頁的非安全網(wǎng)址蜕径,除非您也明確地覆蓋。您可以使用占位符來配置eureka實例URL败京,例如
application.yml
eureka:
instance:
statusPageUrl: https://${eureka.hostname}/info
healthCheckUrl: https://${eureka.hostname}/health
homePageUrl: https://${eureka.hostname}/
(請注意兜喻,${eureka.hostname}是僅在稍后版本的Eureka中可用的本地占位符,您也可以使用Spring占位符實現(xiàn)同樣的功能喧枷,例如使用${eureka.instance.hostName}虹统。
注意
如果您的應(yīng)用程序在代理服務(wù)器后面運(yùn)行,并且SSL終止服務(wù)在代理中(例如隧甚,如果您運(yùn)行在Cloud Foundry或其他平臺作為服務(wù))车荔,則需要確保代理“轉(zhuǎn)發(fā)”頭部被截取并處理應(yīng)用程序。Spring Boot應(yīng)用程序中的嵌入式Tomcat容器會自動執(zhí)行“X-Forwarded - \ *”標(biāo)頭的顯式配置戚扳。你這個錯誤的一個跡象就是你的應(yīng)用程序本身所呈現(xiàn)的鏈接是錯誤的(錯誤的主機(jī)忧便,端口或協(xié)議)。
Eureka的健康檢查
默認(rèn)情況下帽借,Eureka使用客戶端心跳來確定客戶端是否啟動珠增。除非另有規(guī)定,否則發(fā)現(xiàn)客戶端將不會根據(jù)Spring Boot執(zhí)行器傳播應(yīng)用程序的當(dāng)前運(yùn)行狀況檢查狀態(tài)砍艾。這意味著成功注冊后Eureka將永遠(yuǎn)宣布申請?zhí)幱凇癠P”狀態(tài)蒂教。通過啟用Eureka運(yùn)行狀況檢查可以改變此行為,從而將應(yīng)用程序狀態(tài)傳播到Eureka脆荷。因此凝垛,每個其他應(yīng)用程序?qū)⒉粫凇癠P”之外的狀態(tài)下將流量發(fā)送到應(yīng)用程序。
application.yml
eureka:
client:
healthcheck:
enabled: true
警告
eureka.client.healthcheck.enabled=true只能在application.yml中設(shè)置蜓谋。設(shè)置bootstrap.yml中的值將導(dǎo)致不期望的副作用梦皮,例如在具有UNKNOWN狀態(tài)的eureka中注冊。
如果您需要更多的控制健康檢查桃焕,您可以考慮實施自己的com.netflix.appinfo.HealthCheckHandler剑肯。
Eureka實例和客戶端的元數(shù)據(jù)
值得花點(diǎn)時間了解Eureka元數(shù)據(jù)的工作原理,以便您可以在平臺上使用它观堂。有主機(jī)名让网,IP地址,端口號师痕,狀態(tài)頁和運(yùn)行狀況檢查等標(biāo)準(zhǔn)元數(shù)據(jù)寂祥。這些發(fā)布在服務(wù)注冊表中,由客戶使用七兜,以直接的方式聯(lián)系服務(wù)丸凭。額外的元數(shù)據(jù)可以添加到eureka.instance.metadataMap中的實例注冊中,并且這將在遠(yuǎn)程客戶端中可訪問腕铸,但一般不會更改客戶端的行為惜犀,除非意識到元數(shù)據(jù)的含義。下面描述了幾個特殊情況狠裹,其中Spring Cloud已經(jīng)為元數(shù)據(jù)映射指定了含義虽界。
在Cloudfoundry上使用Eureka
Cloudfoundry有一個全局路由器,所以同一個應(yīng)用程序的所有實例都具有相同的主機(jī)名(在具有相似架構(gòu)的其他PaaS解決方案中也是如此)涛菠。這不一定是使用Eureka的障礙莉御,但如果您使用路由器(建議撇吞,甚至是強(qiáng)制性的,具體取決于您的平臺的設(shè)置方式)礁叔,則需要明確設(shè)置主機(jī)名和端口號(安全或非安全)牍颈,以便他們使用路由器。您可能還需要使用實例元數(shù)據(jù)琅关,以便您可以區(qū)分客戶端上的實例(例如煮岁,在自定義負(fù)載平衡器中)。默認(rèn)情況下涣易,eureka.instance.instanceId為vcap.application.instance_id画机。例如:
application.yml
eureka:
instance:
hostname: ${vcap.application.uris[0]}
nonSecurePort: 80
服務(wù)發(fā)現(xiàn):Eureka服務(wù)器
如何包含Eureka服務(wù)器
要在項目中包含Eureka服務(wù)器,請使用組org.springframework.cloud和工件id spring-cloud-starter-eureka-server的啟動器新症。有關(guān) 使用當(dāng)前的Spring Cloud發(fā)布列表設(shè)置構(gòu)建系統(tǒng)的詳細(xì)信息步氏,請參閱Spring Cloud項目頁面。
如何運(yùn)行Eureka服務(wù)器
示例eureka服務(wù)器;
@SpringBootApplication
@EnableEurekaServer
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
其他的我就不多講了徒爹,還有很多關(guān)于注冊中心的講解戳护,大家可以去查一下相關(guān)的資料。
從現(xiàn)在開始瀑焦,我這邊會將近期研發(fā)的spring cloud微服務(wù)云架構(gòu)的搭建過程和精髓記錄下來腌且,幫助更多有興趣研發(fā)spring cloud框架的朋友,大家來一起探討spring cloud架構(gòu)的搭建過程及如何運(yùn)用于企業(yè)項目榛瓮。