Spring Cloud 探索 | 服務註冊與發現 Eureka(下)
接上文 ……
注意
:以下是針對Eureka Client進行配置,如果需要對Eureka Server進行配置會有明顯的說明。
4 Spring Cloud Eureka Client 配置過程
4.1 pom.xml 新增依賴
新增Eureka Client依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</ artifactId>
</dependency>
4.2 配置啟動類
與往常 Spring Boot 啟動類類似,不同的是多了一個 @EnableDiscoveryClient
註解,用來標識當前工程是Discovery Client。因為 Spring Cloud 提供了非常多的服務註冊發現的元件,如 euerka、zookeeper、consul、etcd。所以為統一標識客戶端身份,它用的是 @EnableDiscoveryClient 註解。
也可以使用
@EnableEurekaClient
,但是此註解只適用於 euerka 服務註冊發現元件。
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudEurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaClientApplication.class, args);
}
}
4.3 application.yml基礎配置
下面是一個Eureka客戶端最基本的配置:
server:
port : 9005
spring:
application:
name: service-provider
eureka:
instance:
hostname: eureka-client.com # 記得修改 hosts 檔案
client:
service-url:
defaultZone: http://lpf:[email protected]-server.com:9000/eureka
#defaultZone: http://eureka-server.com:9000/eureka
logging.level.root: info
配置解釋:
spring.application.name
: 指定微服務的名稱,後續在呼叫的時候只需要使用該名稱就可以進行服務的訪問;eureka.client.service-url.defaultZone
: 指定服務註冊中心的位置。如果Eureka Server配置了許可權驗證,則配置格式如下:http://${security.user.name}:${security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/
;
到此,Eureka Client已經可以和Eureka Server正常連線了。
4.4 Controller、Service等
在編寫程式碼之前需要在 pom.xml 檔案中新增需要的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在服務提供方中提供一個介面來獲取當前所有的服務資訊:
@RestController
public class ProviderController {
//日誌記錄器
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
DiscoveryClient discoveryClient;
@GetMapping("/dept/simlpe/{id}")
public String simlpe(@PathVariable("id") long id) {
// 獲取已註冊到Eureka的例項資訊
String result = JSON.toJSONString(discoveryClient.getServices());
logger.info(result);
return "來自服務提供者:" + result;
}
}
4.5 配置/測試/展示結果
4.5.1 訪問 eureka
此時,啟動Eureka Client,訪問 eureka:
可以看到,服務已經註冊成功了。
4.5.2 訪問 /dept/simlpe/{id}
可以看到,Eureka Client成功的從Eureka Server獲取了服務列表。
4.5.3 顯示具體的服務例項
在 application.yml 檔案中新增如下配置項:
eureka:
instance:
instance-id: eureka-client-9005
配置解釋:
eureka.instance.instance-id
: 用於標識此微服務例項。這裡也可以使用這樣的配置方式instance-id: ${spring.application.name}:${server.port}
4.5.4 使用IP地址註冊服務例項
在新增配置項之前服務註冊資訊如狀態列所示:此時是使用域名進行註冊。
在 application.yml 檔案中新增如下配置項:
eureka:
instance:
prefer-ip-address: true
如下圖,此時是使用IP地址進行註冊:
4.5.5 使用指定IP地址註冊服務例項
在 application.yml 檔案中新增如下配置項並設定 prefer-ip-address:=true:
eureka:
instance:
ip-address: 127.0.0.12
如下圖,此時是使用我們指定的IP地址進行註冊:
4.5.6 檢視服務例項的詳細資訊
在 pom.xml中新增依賴並新增一個資訊匹配的外掛:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
</plugins>
</build>
修改 application.yml 配置檔案,追加 info 的相關資訊:
info:
build:
artifact: @[email protected]
name: @[email protected]
description: @[email protected]
version: @[email protected]
新增完成後,通過Eureka Server頁面檢視相應服務例項的資訊:
顯示如圖:
4.5.6 配置客戶端心跳
Eureka Client之所以可以與 Eureka Server之間保持聯絡,依靠的是心跳機制,也就是說客戶端可以自己來進行心跳的配置處理。在 application.yml 檔案中新增如下配置項:
eureka:
instance:
lease-renewal-interval-in-seconds: 3
lease-expiration-duration-in-seconds: 4
配置解釋:
eureka.instance.lease-renewal-interval-in-seconds
:設定心跳的時間間隔(預設是30秒);eureka.instance.lease-expiration-duration-in-seconds
:eureka伺服器在接受到例項的最後一次發出的心跳後,需要等待多久才可以將此例項刪除(預設是90秒)。
如果該值太大,則很可能將流量轉發過去的時候,該instance已經不存活了。
如果該值設定太小了,則instance則很可能因為臨時的網路抖動而被摘除掉。
另外,該值至少應該大於lease-renewal-interval-in-seconds。
這裡就不演示了,大家可以將日誌級別調整為 debug,從日誌就可以觀察出來。
4.5.7 健康檢查23
預設情況下,Eureka中各個服務例項的健康檢查並不是通過spring-boot-actuator模組的 /health 端點來實現的,而是依靠客戶端心跳的方式保持服務例項的存活,在Eureka的服務續約與剔除機制下,客戶端的監控狀態從註冊到註冊中心開始都會處於UP狀態,除非心跳終止一段時間之後,服務註冊中心將其剔除。預設的心跳實現方式可以有效檢查客戶端程序
是否正常運作,但卻無法保證客戶端應用能夠正常提供服務。由於大多數的應用都會有一些其他的外部資源依賴,比如資料庫。快取、訊息代理等,如果應用與這些外部資源無法聯通的時候,實際上已經不能提供正常的對外服務了,但此時心跳依然正常,所以它還是會被服務消費者呼叫,而這樣的呼叫實際上並不能獲得預期的結果。
在Spring Cloud Eureka中,我們可以通過簡單的配置,把Eureka客戶端的監控檢查交給spring-boot-actuator模組的 /health 端點,以實現更加全面的健康狀態維護。
在 application.yml 檔案中新增如下配置項:
eureka.client.healthcheck.enabled: true
management.endpoint.health.show-details: always # 顯示詳細的健康檢查資訊
然後我們在專案中新增如下配置來驗證一下此配置項:
// 自定義健康檢查:用來控制伺服器的健康狀態
@Component
public class MyHealthChecker implements HealthIndicator {
private boolean up = true;
@Override
public Health health() {
if (up) {
return Health.up().build();
} else {
return Health.down().build();
}
}
public void setUp(boolean up) {
this.up = up;
}
}
在 ProviderController 中新增如下方法:
@RestController
public class ProviderController {
@Autowired
MyHealthChecker myHealthChecker;
@RequestMapping("/up")
public String up(@RequestParam("up") Boolean up) {
myHealthChecker.setUp(up);
return up.toString();
}
}
重啟Eureka Client後將會註冊到Eureka Server中去,此時顯示的是UP:
然後我們呼叫一下服務:http://127.0.0.1:9005/up?up=false ,此時檢視 http://127.0.0.1:9005/actuator/health ,整個應用的 health 狀態變成 DOWN 了:
註冊中心的服務狀態也將變為DOWN:
另外,我們可以試一下把 application.ym l中 eureka.client.healthcheck.enabled=true 這段配置去掉重新啟動服務,然後呼叫服務將 health 變為 DOWN,但是註冊中心中仍然會顯示該服務的 status 為 UP!
4.5.8 修改狀態頁面和健康監控地址
在 application.yml 檔案中新增如下配置項:
management.server.port: 8088
management.endpoints.web.base-path: /monitor
此時,Eureka Client註冊資訊如下圖所示:
可以看到,註冊資訊不正確,點選例項訪問 info 端點返回 404。問了解決這樣的問題,我們新增如下配置項:
eureka.instance.status-page-url-path: ${management.endpoints.web.base-path}/info
此時,註冊資訊如下,可以正常訪問:
5 附加補充
5.1 其他引數
Eureka Client 的其他引數:
spring:
cloud:
inetutils:
# 忽略指定網絡卡(支援正則),假設你的電腦有 VM 那麼該選項是非常有用的一個選項
ignored-interfaces:
#忽略 docker0 網絡卡以及 veth 開頭的網絡卡
- docker0
- veth.*
preferred-networks:
# 使用指定網路地址,選擇 eth0 網絡卡,當然也可以直接寫 IP (192.168)
- eth0
- 192.168
eureka:
# 客戶端進行Eureka註冊的配置
client:
# 是否從eureka伺服器上獲取註冊資訊,預設為true
fetch-registry: true
# 當前的微服務是否註冊到eureka之中,預設為true
register-with-eureka: true
# 從eureka伺服器端獲取註冊資訊的間隔時間(預設:30秒)
registry-fetch-interval-seconds: 5
5.2 其他功能介紹
暫無
5.3 遺留問題
暫無
5.3 原始碼地址
原始碼:https://gitee.com/liupeifeng3514/Spring-Cloud-Learning