SpringCloud基礎教程(三)-Eureka進階

程式設計師笑笑生發表於2020-01-28

   我的部落格:蘭陵笑笑生,歡迎瀏覽部落格!

   上一章 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介面呼叫的方式,改變當前的微服務元件的健康狀態:

file

這個時候,再去檢視Eureka的監控頁面,就可以看到服務提供方的狀態發生了變化:

file

這裡我們是可以根據自己的場景進行操作的

二、 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將自己也註冊到了叢集中了。

file

服務註冊:分別將服務提供方和服務呼叫方啟動,註冊到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例項當機一臺,也不影響服務的呼叫。

file

三、自我保護模式

 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}:複製程式碼

 如圖:

file

這裡我們可以直接修改,修改成如下圖

eureka:
  instance:
    instance-id: P1複製程式碼

file

  自定義Eureka的控制檯服務連結

  Eureka首頁顯示服務呼叫的地址預設是 http:hostName:port/

  可以通過配置

eureka:
  instance:
    prefer-ip-address: true  #設定服務呼叫IP為先複製程式碼

如下圖:

file

修改後:單擊服務變成了ip呼叫:

file

五、總結

 本章講解了Eureka的進階內容,包括Eureka健康檢查、生產環境的Eureka叢集搭建,也對常用的配置進行了介紹。後期我們會在這些基礎之上繼續探索更多的微服務功能!

 以上就是本期的分享,你可以關注本部落格的#Spring Cloud基礎教程!#

​  還可以關注公眾號: 程式設計師笑笑生,關注更多精彩內容!

  • file
    *

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章