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

   個人博客:蘭陵笑笑生,歡迎瀏覽博客!java

   上一章 SpringCloud基礎教程(二)-服務發現 Eureka當中,咱們介紹了微服務組件當中的服務註冊和發現組件程序員

Eureka,本章將繼續探索Eurea在生產環境中的配置和使用。spring

前言

 在上一章當中,咱們初步瞭解了Eureka的使用,雖然最基本的場景,服務註冊、服務發現和消費均可以實現。可是在實際的企業應用時候,就會遇到不少的自定義的配置。特別是在生產環境。緩存

1、Eureka的健康檢查

 在不添加任何配置的狀況下,Eureka註冊中心和服務之間是經過心跳機制來監測的,若是心跳正常,那麼表明服務是能夠用的。可是實際上不是這樣。咱們開發的微服務組件,大多數都會依賴緩存Redis、搜素引擎Solr等等外部的資源。若是這些資源不能提供應用,雖然服務組件能與Eureka正常的保持心跳,可是在這樣的狀況下,服務的調用就不能得到預期的效果。在這裏,咱們能夠經過配置Eureka的健康檢查,將服務組件的狀態同步到Eureka中心。網絡

 在開發的微服務組件中,修改application.xml 開啓健康檢查,默認是false,依賴心跳,這裏修改爲true,app

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、OUT_OF_SERVICE、UNKNOWN.這裏咱們能夠自定義的實現 org.springframework.boot.actuate.health.HealthIndicator 接口。經過HTTP接口手動的修改服務組件的狀態,並同步到Eureka.(在實際的應用中,例如緩存宕機,就能夠改變當前的服務組件的健康狀態)。ide

 新建SelfHealthChecker的組件實現HealthIndicator接口,建立Health對象,當前服務的健康狀態隨着health的之變化而變化。spring-boot

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

這裏咱們是能夠根據本身的場景進行操做的

2、 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

3、自我保護模式

 eureka在設計時候充分考慮到了分佈式環境網絡的不可靠。由於網絡的緣由會致使eureka的server沒有收到心跳,可是並不能說明eureka是宕機了。因此Eureka Server默認會打開保護模式。

 一旦進入保護模式,eureka不是刪除裏面的服務註冊列表數據,即不會馬上註銷任何微服務。服務調用者任然嘗試調用服務提供者。若是調用失敗,則會使用熔斷模式。當網絡故障恢復後,eureka會自動的退出自我保護模式。

 修改配置的yml,打開或者關閉註冊中心的爲我保護模式,false表明關閉。

eureka:
  server:
    enable-self-preservation: false

4、其餘配置

 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

5、總結

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

 以上就是本期的分享,你能夠關注本博客的#Spring Cloud基礎教程!#

​  還能夠關注公衆號: 程序員笑笑生,關注更多精彩內容!

  • file

本文由博客一文多發平臺 OpenWrite 發佈!

個人博客地址蘭陵笑笑生,歡迎瀏覽!

相關文章
相關標籤/搜索