本文基於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
參數修改心跳的時間。儘量不要修改這個參數。