Spring Cloud——服務發現與註冊
版本說明
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.16.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Edgware.SR4</spring-cloud.version> </properties>
服務發現
在計算機網路中,一種自動發現裝置或服務的技術,通過服務發現協議(Service Discovery Protocol)實現。
常見協議
- REST: HATEOSA
- Web Services: UDDI(Universal Description Discovery and Integration)
服務註冊
裝置或服務主動/被動註冊到管理中心,以便服務被發現和消費
常見註冊中心
- Zookeeper
- Netflix Eureka
- Consul
高可用
一種系統特性,致力於確保可接受程式的操作執行,通常採用上線時間作為基準。其中,以一年內的上線時間與自然時間的比率來描述可用性。
基本原則
- 消滅單點故障
- 可靠性交迭
- 故障探測
服務發現:Eureka
是由Netflix公司發明的服務發現中介軟體,包括服務發現伺服器和客戶端。
核心元件
- Eureka Server
- Eureka Client
服務端:Eureka Server
是Eureka Client的註冊服務中心,管理所有註冊服務、以及其例項資訊和狀態。
執行Eureka Server
- 依賴
spring-cloud-starter-eureka-server
- 啟用:增加
@EnableEurekaServer
建立服務端
建立的時候選擇以下三個jar包
<dependency>
<groupId >org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
在EurekaServerApplication新增@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
修改application.properties:
# 伺服器應用名稱
spring.application.name=spring-cloud-eureka-server
# 伺服器服務埠
server.port=9090
# 管理埠安全關閉
management.security.enabled=false
然後啟動,啟動時成功了,但是會報錯
[nfoReplicator-0] c.n.discovery.InstanceInfoReplicator : There was a problem with the instance info replicator
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
問題原因:Eureka Server 既是註冊伺服器,也是客戶端,預設情況,也需要配置註冊中心地址。
## 取消向註冊中心註冊
eureka.client.register-with-eureka=false
## 取消向註冊中心獲取註冊資訊(服務、例項資訊)
eureka.client.fetch-registry=false
客戶端:Eureka Client
為當前服務提供註冊、同步、查詢服務以及其例項資訊或狀態等能力。
執行Eureka Client
- 依賴
spring-cloud-starter-eureka
- 啟用
@EnableEurekaClient
或@EnableDiscoveryClient
建立客戶端
選擇actuator
、web
、eureka discovery
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
在EurekaClientApplication新增@EnableEurekaClient
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {
同樣,修改配置檔案:
# 客戶端應用名稱
spring.application.name=spring-cloud-eureka-client
# 客戶端服務埠
server.port=8080
# 管理埠安全關閉
management.security.enabled=false
然後啟動,這裡沒有配置註冊中心地址,也會報剛才和服務端一樣的錯誤。
這裡,我們配置一下,在上面的配置檔案中新增
# 客戶端註冊到Eureka伺服器
eureka.client.serviceUrl.defaultZone = http://localhost:9090/eureka
重啟後,就不會有錯誤了
然後訪問localhost:9090可以看到註冊成功了
調整健康檢查頁面
Eureka Server會ping Eureka Client 的/health,看是否能ping通來檢測客戶端是否“健康”
# 調整狀態頁面
eureka.instance.status-page-url-path=/status
# 調整健康檢查頁面
eureka.instance.health-check-url-path=/health
我們把狀態頁面設為/status
,同時新增自定義的StatusController
:
package com.learn.eurekaclient.web.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 狀態控制器
*/
@RestController
public class StatusController {
@GetMapping("/status")
public String status() {
return "OK";
}
}
訪問localhost:9090
會看到Status 的URL變了