Spring Cloud 教程 - Eureka Client


本文基於Spring Cloud Finchley.RELEASE 版本。

服務發現:Eureka clients

服務發現是微服務架構的一個關鍵原則。手動配置每一個客戶端不僅非常複雜,同時也容易出錯。Netflix 提供了Erueka作爲服務發現的服務端和客戶端。Srever端可配置,同時每個server可以互相註冊做高可用部署。

如何使用Eureka Client

將groupId 爲 org.springframework.cloud,artifactId 爲spring-cloud-starter-netflix-eureka-client的依賴添加到項目中即可引入Eureka Client,具體版本號可以參考Spring Cloud Project

註冊Eureka Client

客戶端向Eureka註冊的時候會提供一系列的元數據信息,例如:主機,端口,健康檢查url,主頁等。Eureka 接受每個服務發送的心跳信息,如果在某個配置的超時時間內未接收到心跳信息,實例會被從註冊列表中移除。 例如如下的服務:

@SpringBootApplication@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-cloud-starter-netflix-eureka-client添加到classpath時,應用會自動的註冊到Eureka Server中,只需要配置Eureka 服務器位置。

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

可以通過${spring.application.name},${server.port}配置註冊的服務名和服務端口。 將spring-cloud-starter-netflix-eureka-client添加到classpath會使服務註冊爲一個Eureka的實例,即服務本身會向自己註冊,同時也是一個從註冊中心獲取其他服務的客戶端。如果想要關閉自我註冊的服務可以設置eureka.client.enabled=false。 更多配置信息可以參考EurekaInstanceConfigBean和EurekaClientConfigBean。

通過Eureka Server授權

如果Eureka Server配置了http basic的授權信息,可以通過將授權信息添加到eureka.client.serviceUrl.defaultZone中設置授權信息,eureka.client.serviceUrl.defaultZone=http://user:password@localhost:8761/eureka

狀態頁和健康檢查

Eureka實例默認的狀態頁和健康檢查接口是/info/health,他們是Spring Boot Actuator默認的端點。如果不想採用默認的設置可以通過修改Servlet Path (server.servletPath=/custom) 或者管理路徑(management.contextPath=/admin),yaml中配置

eureka:
  instance:
    statusPageUrlPath: ${management.server.servlet.context-path}/info
    healthCheckUrlPath: ${management.server.servlet.context-path}/health
註冊一個安全的應用

如果應用需要通過HTTPS通信,可以設置:

  • eureka.instance.nonSecurePortEnabled=false
  • eureka.instance.securePortEnabled=true

通過設置這兩個配置,可以讓Eureka發佈安全的通信,DiscoveryClient每次都會返回https開頭的URI。同樣的,如果服務這麼設置,健康檢查也會使用https。 由於Eureka工作在內網,所以仍然會發布非https的健康檢查和狀態端點,所以需要手工替換,例如:

eureka:
  instance:
    statusPageUrl: https://${eureka.hostname}/info
    healthCheckUrl: https://${eureka.hostname}/health
    homePageUrl: https://${eureka.hostname}/
健康檢查

默認情況下,Eureka使用心跳判斷一個服務是否可用。除非特別說明,否則服務發現客戶端不會根據Spring Boot Actuator來發布健康檢查。當成功註冊服務的後,Eureka總是將應用標記爲UP狀態。可以通過如下配置修改:

eureka:
  client:
    healthcheck:
      enabled: true

注意這個配置只能配置在application.yml中,如果配置在bootstrap.yml可能會出現副作用,例如註冊服務爲UNKNOWN狀態。

Eureka 元數據

標準的元數據信息包括,host,port,ip,狀態頁,健康檢查。如果需要自定義元數據信息可以將其配置到eureka.instance.metadataMap中,這些元數據信息可以被其服務獲取

修改Eureka 實例的ID

Spring Cloud Eureka 將如下${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}} 信息註冊微Eureka 實例的ID。例如myhost:myappname:8080。 通過如下配置可以修改其實例ID

eureka:
  instance:
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
使用Eureka Client

通過EurekaClient可以獲取服務發現的信息,例如:

@Autowiredprivate EurekaClient discoveryClient;public String serviceUrl() {
    InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);    return instance.getHomePageUrl();
}

注意,不要將EurekaClient應用在@PostConstruct或者@Scheduled的方法中或者其他ApplicationContext還未啓動的方法中。

移出Jersey依賴

默認情況下,EurekaClient使用Jersey作爲HTTP 通信工具,如果不希望依賴Jersey,可以通過將Jersey依賴移出。Spring Cloud默認會使用RestTempalte作爲通信工具。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-apache-client4</artifactId>
        </exclusion>
    </exclusions>
</dependency>
爲什麼服務註冊很慢

默認情況下,心跳時間爲30秒。只有在,client,server,client 緩存同時可以用的情況下,纔會判斷一個實例可用。可以修改eureka.instance.leaseRenewalIntervalInSeconds參數修改心跳的時間。儘量不要修改這個參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章