溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

整合spring cloud云服務架構 - eureka 基礎

發(fā)布時間:2020-09-23 19:29:08 來源:網絡 閱讀:551 作者:qq5acc0f2564c82 欄目:開發(fā)技術

在構建項目之前,我們先學習一下eureka,這是官方的講解,我這邊再重新幫大家回顧一下:

服務發(fā)現:Eureka客戶端
服務發(fā)現是基于微服務架構的關鍵原則之一。嘗試配置每個客戶端或某種形式的約定可能非常困難,可以非常脆弱。Netflix服務發(fā)現服務器和客戶端是Eureka??梢詫⒎掌髋渲煤筒渴馂楦呖捎眯?,每個服務器將注冊服務的狀態(tài)復制到其他服務器。

如何包含Eureka客戶端
要在您的項目中包含Eureka客戶端,請使用組org.springframework.cloud和工件ID spring-cloud-starter-eureka的啟動器。

注冊Eureka
當客戶端注冊Eureka時,它提供關于自身的元數據,例如主機和端口,健康指示符URL,主頁等。Eureka從屬于服務的每個實例接收心跳消息。如果心跳失敗超過可配置的時間表,則通常將該實例從注冊表中刪除。

示例eureka客戶端:

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@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應用程序)。在這個例子中,我們明確地使用@EnableEurekaClient,但只有Eureka可用,你也可以使用@EnableDiscoveryClient。需要配置才能找到Eureka服務器。例:

application.yml

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

其中“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客戶端。對于更復雜的需求,您可以創(chuàng)建DiscoveryClientOptionalArgs類型的@Bean,并將ClientFilter實例注入到其中,所有這些都將應用于從客戶端到服務器的調用。

注意
由于Eureka中的限制,不可能支持每個服務器的基本身份驗證憑據,所以只能使用第一個找到的集合。
狀態(tài)頁和健康指標
Eureka實例的狀態(tài)頁面和運行狀況指示器分別默認為“/ info”和“/ health”,它們是Spring Boot執(zhí)行器應用程序中有用端點的默認位置。如果您使用非默認上下文路徑或servlet路徑(例如server.servletPath=/foo)或管理端點路徑(例如management.contextPath=/admin),則需要更改這些,即使是執(zhí)行器應用程序。例:

application.yml
eureka:
  instance:
    statusPageUrlPath: ${management.context-path}/info
    healthCheckUrlPath: ${management.context-path}/health

這些鏈接顯示在客戶端使用的元數據中,并在某些情況下用于決定是否將請求發(fā)送到應用程序,因此如果它們是準確的,這是有幫助的。

注冊安全應用程序
如果您的應用程序想通過HTTPS聯系,則可以分別在EurekaInstanceConfig,即 eureka.instance.[nonSecurePortEnabled,securePortEnabled]=[false,true] 中設置兩個標志。這將使Eureka發(fā)布實例信息顯示安全通信的明確偏好。Spring Cloud DiscoveryClient將始終為以這種方式配置的服務返回一個https://…; URI,并且Eureka(本機)實例信息將具有安全的健康檢查URL。

由于Eureka內部的工作方式,它仍然會發(fā)布狀態(tài)和主頁的非安全網址,除非您也明確地覆蓋。您可以使用占位符來配置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或其他平臺作為服務),則需要確保代理“轉發(fā)”頭部被截取并處理應用程序。Spring Boot應用程序中的嵌入式Tomcat容器會自動執(zhí)行“X-Forwarded - \ *”標頭的顯式配置。你這個錯誤的一個跡象就是你的應用程序本身所呈現的鏈接是錯誤的(錯誤的主機,端口或協議)。
Eureka的健康檢查
默認情況下,Eureka使用客戶端心跳來確定客戶端是否啟動。除非另有規(guī)定,否則發(fā)現客戶端將不會根據Spring Boot執(zhí)行器傳播應用程序的當前運行狀況檢查狀態(tài)。這意味著成功注冊后Eureka將永遠宣布申請?zhí)幱凇癠P”狀態(tài)。通過啟用Eureka運行狀況檢查可以改變此行為,從而將應用程序狀態(tài)傳播到Eureka。因此,每個其他應用程序將不會在“UP”之外的狀態(tài)下將流量發(fā)送到應用程序。

application.yml
eureka:
  client:
    healthcheck:
      enabled: true

警告
eureka.client.healthcheck.enabled=true只能在application.yml中設置。設置bootstrap.yml中的值將導致不期望的副作用,例如在具有UNKNOWN狀態(tài)的eureka中注冊。
如果您需要更多的控制健康檢查,您可以考慮實施自己的com.netflix.appinfo.HealthCheckHandler。

Eureka實例和客戶端的元數據
值得花點時間了解Eureka元數據的工作原理,以便您可以在平臺上使用它。有主機名,IP地址,端口號,狀態(tài)頁和運行狀況檢查等標準元數據。這些發(fā)布在服務注冊表中,由客戶使用,以直接的方式聯系服務。額外的元數據可以添加到eureka.instance.metadataMap中的實例注冊中,并且這將在遠程客戶端中可訪問,但一般不會更改客戶端的行為,除非意識到元數據的含義。下面描述了幾個特殊情況,其中Spring Cloud已經為元數據映射指定了含義。

在Cloudfoundry上使用Eureka
Cloudfoundry有一個全局路由器,所以同一個應用程序的所有實例都具有相同的主機名(在具有相似架構的其他PaaS解決方案中也是如此)。這不一定是使用Eureka的障礙,但如果您使用路由器(建議,甚至是強制性的,具體取決于您的平臺的設置方式),則需要明確設置主機名和端口號(安全或非安全),以便他們使用路由器。您可能還需要使用實例元數據,以便您可以區(qū)分客戶端上的實例(例如,在自定義負載平衡器中)。默認情況下,eureka.instance.instanceId為vcap.application.instance_id。例如:

application.yml
eureka:
  instance:
    hostname: ${vcap.application.uris[0]}
    nonSecurePort: 80

服務發(fā)現:Eureka服務器
如何包含Eureka服務器
要在項目中包含Eureka服務器,請使用組org.springframework.cloud和工件id spring-cloud-starter-eureka-server的啟動器。有關 使用當前的Spring Cloud發(fā)布列表設置構建系統(tǒng)的詳細信息,請參閱Spring Cloud項目頁面。

如何運行Eureka服務器
示例eureka服務器;

@SpringBootApplication
@EnableEurekaServer
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

其他的我就不多講了,還有很多關于注冊中心的講解,大家可以去查一下相關的資料。

從現在開始,我這邊會將近期研發(fā)的spring cloud微服務云架構的搭建過程和精髓記錄下來,幫助更多有興趣研發(fā)spring cloud框架的朋友,大家來一起探討spring cloud架構的搭建過程及如何運用于企業(yè)項目。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI