(十七)spring cloud微服務分散式雲架構-eureka 基礎

springcloud885發表於2019-03-13

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

服務發現:Eureka客戶端 Spring Cloud大型企業分散式微服務雲架構原始碼請加一七九一七四三三八零

服務發現是基於微服務架構的關鍵原則之一。嘗試配置每個客戶端或某種形式的約定可能非常困難,可以非常脆弱。Netflix服務發現伺服器和客戶端是Eureka。可以將伺服器配置和部署為高可用性,每個伺服器將註冊服務的狀態複製到其他伺服器。

如何包含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客戶端。對於更復雜的需求,您可以建立DiscoveryClientOptionalArgs型別的@Bean,並將ClientFilter例項注入到其中,所有這些都將應用於從客戶端到伺服器的呼叫。

注意

由於Eureka中的限制,不可能支援每個伺服器的基本身份驗證憑據,所以只能使用第一個找到的集合。

狀態頁和健康指標

Eureka例項的狀態頁面和執行狀況指示器分別預設為“/ info”和“/ health”,它們是Spring Boot執行器應用程式中有用端點的預設位置。如果您使用非預設上下文路徑或servlet路徑(例如server.servletPath=/foo)或管理端點路徑(例如management.contextPath=/admin),則需要更改這些,即使是執行器應用程式。例:

application.yml
eureka:
  instance:
    statusPageUrlPath: ${management.context-path}/info
    healthCheckUrlPath: ${management.context-path}/health
複製程式碼

這些連結顯示在客戶端使用的後設資料中,並在某些情況下用於決定是否將請求傳送到應用程式,因此如果它們是準確的,這是有幫助的。

註冊安全應用程式

如果您的應用程式想通過HTTPS聯絡,則可以分別在EurekaInstanceConfig,即 eureka.instance.[nonSecurePortEnabled,securePortEnabled]=[false,true] 中設定兩個標誌。這將使Eureka釋出例項資訊顯示安全通訊的明確偏好。Spring Cloud DiscoveryClient將始終為以這種方式配置的服務返回一個https://…​; URI,並且Eureka(本機)例項資訊將具有安全的健康檢查URL。

由於Eureka內部的工作方式,它仍然會發布狀態和主頁的非安全網址,除非您也明確地覆蓋。您可以使用佔位符來配置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或其他平臺作為服務),則需要確保代理“轉發”頭部被擷取並處理應用程式。Spring Boot應用程式中的嵌入式Tomcat容器會自動執行“X-Forwarded - \ *”標頭的顯式配置。你這個錯誤的一個跡象就是你的應用程式本身所呈現的連結是錯誤的(錯誤的主機,埠或協議)。

Eureka的健康檢查

預設情況下,Eureka使用客戶端心跳來確定客戶端是否啟動。除非另有規定,否則發現客戶端將不會根據Spring Boot執行器傳播應用程式的當前執行狀況檢查狀態。這意味著成功註冊後Eureka將永遠宣佈申請處於“UP”狀態。通過啟用Eureka執行狀況檢查可以改變此行為,從而將應用程式狀態傳播到Eureka。因此,每個其他應用程式將不會在“UP”之外的狀態下將流量傳送到應用程式。

application.yml
eureka:
  client:
    healthcheck:
      enabled: true
複製程式碼

警告

eureka.client.healthcheck.enabled=true只能在application.yml中設定。設定bootstrap.yml中的值將導致不期望的副作用,例如在具有UNKNOWN狀態的eureka中註冊。

如果您需要更多的控制健康檢查,您可以考慮實施自己的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
eureka:
  instance:
    hostname: ${vcap.application.uris[0]}
    nonSecurePort: 80
複製程式碼

服務發現:Eureka伺服器

如何包含Eureka伺服器

要在專案中包含Eureka伺服器,請使用組org.springframework.cloud和工件id spring-cloud-starter-eureka-server的啟動器。有關 使用當前的Spring Cloud釋出列表設定構建系統的詳細資訊,請參閱Spring Cloud專案頁面。

如何執行Eureka伺服器

示例eureka伺服器;

@SpringBootApplication
@EnableEurekaServer
public class Application {

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

}
複製程式碼

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

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

相關文章