我的部落格:蘭陵笑笑生,歡迎瀏覽部落格!
上一章 SpringCloud基礎教程(二)-服務發現 Eureka當中,我們介紹了微服務元件當中的服務註冊和發現元件
Eureka,本章將繼續探索Eurea在生產環境中的配置和使用。
前言
在上一章當中,我們初步瞭解了Eureka的使用,雖然最基本的場景,服務註冊、服務發現和消費都可以實現。但是在實際的企業應用時候,就會遇到很多的自定義的配置。特別是在生產環境。
一、Eureka的健康檢查
在不新增任何配置的情況下,Eureka註冊中心和服務之間是通過心跳機制來監測的,如果心跳正常,那麼代表服務是可以用的。但是實際上不是這樣。我們開發的微服務元件,大多數都會依賴快取Redis、搜素引擎Solr等等外部的資源。如果這些資源不能提供應用,雖然服務元件能與Eureka正常的保持心跳,但是在這樣的情況下,服務的呼叫就不能獲得預期的效果。在這裡,我們可以通過配置Eureka的健康檢查,將服務元件的狀態同步到Eureka中心。
在開發的微服務元件中,修改application.xml 開啟健康檢查,預設是false,依賴心跳,這裡修改成true,
eureka:
client:
healthcheck:
enabled: true複製程式碼
並在pom.xml中新增actuator依賴(如果不新增,是不起作用的):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>複製程式碼
Eureka中的例項包含了多種狀態:UP、DOWN、STARTING、OUTOFSERVICE、UNKNOWN.這裡我們可以自定義的實現 org.springframework.boot.actuate.health.HealthIndicator 介面。通過HTTP介面手動的修改服務元件的狀態,並同步到Eureka.(在實際的應用中,例如快取當機,就可以改變當前的服務元件的健康狀態)。
新建SelfHealthChecker的元件實現HealthIndicator介面,建立Health物件,當前服務的健康狀態隨著health的之變化而變化。
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class SelfHealthChecker implements HealthIndicator {
private boolean health = true;
@Override
public Health health() {
if (health) {
return new Health.Builder()
.withDetail("a", 10).withDetail("b", "up").up().build();
} else {
return new Health.Builder()
.withDetail("error", "client is down").down().build();
}
}
public boolean isHealth() {
return health;
}
public void setHealth(boolean health) {
this.health = health;
}
}
複製程式碼
新建控制器,注入自定義的健康檢查元件,可以通過HTTP介面呼叫的方式,改變當前的微服務元件的健康狀態:
這個時候,再去檢視Eureka的監控頁面,就可以看到服務提供方的狀態發生了變化:
這裡我們是可以根據自己的場景進行操作的
二、 Eureka高可用叢集
如果是本機搭建,首先在host檔案中,配置如下的對映(如果不配置,而是使用localhost,那麼服務註冊的時候只能註冊到一個Eureka例項中,原因是eureka對localhost做了過濾。)
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com複製程式碼
分別啟動3個eureka例項,並在每個例項的配置中配置其他可用的例項URL,如下
appcaiton-s1.xml
#eureka 服務端
spring:
application:
name: eureka-server
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #服務端的例項名稱
client:
service-url:
# 設定與註冊中心互動的url ,
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#false表示自己就是服務中細膩
fetch-registry: false
#註冊自己到註冊中心
register-with-eureka: true
healthcheck:
enabled: false
複製程式碼
appcaiton-s2.xml
#eureka 服務端
spring:
application:
name: eureka-server
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #服務端的例項名稱
client:
service-url:
# 設定與註冊中心互動的url ,
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/
#false表示自己就是服務中細膩
fetch-registry: false
#註冊自己到註冊中心
register-with-eureka: true
healthcheck:
enabled: false
複製程式碼
appcaiton-s3.xml
#eureka 服務端
spring:
application:
name: eureka-server
server:
port: 7003
eureka:
instance:
hostname: eureka7003.com #服務端的例項名稱
client:
service-url:
# 設定與註冊中心互動的url ,
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
#false表示自己就是服務中細膩
fetch-registry: false
#註冊自己到註冊中心
register-with-eureka: true
healthcheck:
enabled: false
複製程式碼
開啟eureka任何一個示例的監控中心,可以看到,每個eureka將自己也註冊到了叢集中了。
服務註冊:分別將服務提供方和服務呼叫方啟動,註冊到eureka叢集中,例如服務提供方的配置檔案applicaiton.yml配置如下:配置的eureka示例只要配置叢集任何一個eureka示例就可以了
#服務提供方
spring:
application:
name: server-provider
server:
port: 9001
eureka:
instance:
hostname: eureka7002.com #eureka服務端的例項名稱
client:
service-url:
# 與註冊中心互動的url
defaultZone: http://eureka7002.com:7002/eureka/
enabled: true
複製程式碼
通過叢集監控皮膚可以看到如下的資訊。這個時候,服務呼叫方就可以呼叫服務提供方介面了,就算eureka例項當機一臺,也不影響服務的呼叫。
三、自我保護模式
eureka在設計時候充分考慮到了分散式環境網路的不可靠。因為網路的原因會導致eureka的server沒有收到心跳,但是並不能說明eureka是當機了。所以Eureka Server預設會開啟保護模式。
一旦進入保護模式,eureka不是刪除裡面的服務註冊列表資料,即不會立刻登出任何微服務。服務呼叫者任然嘗試呼叫服務提供者。如果呼叫失敗,則會使用熔斷模式。當網路故障恢復後,eureka會自動的退出自我保護模式。
修改配置的yml,開啟或者關閉註冊中心的為我保護模式,false代表關閉。
eureka:
server:
enable-self-preservation: false複製程式碼
四、其他配置
eureka預設的服務名稱是
${spring.cloud.client.hostname}:${spring.application.name}:${spring.applicaiton.instance_id}:${port}:複製程式碼
如圖:
這裡我們可以直接修改,修改成如下圖
eureka:
instance:
instance-id: P1複製程式碼
自定義Eureka的控制檯服務連結
Eureka首頁顯示服務呼叫的地址預設是 http:hostName:port/
可以通過配置
eureka:
instance:
prefer-ip-address: true #設定服務呼叫IP為先複製程式碼
如下圖:
修改後:單擊服務變成了ip呼叫:
五、總結
本章講解了Eureka的進階內容,包括Eureka健康檢查、生產環境的Eureka叢集搭建,也對常用的配置進行了介紹。後期我們會在這些基礎之上繼續探索更多的微服務功能!
以上就是本期的分享,你可以關注本部落格的#Spring Cloud基礎教程!#
還可以關注公眾號: 程式設計師笑笑生,關注更多精彩內容!
*
本文由部落格一文多發平臺 OpenWrite 釋出!