1. 程式人生 > >Spring Cloud常見問題與總結(一)

Spring Cloud常見問題與總結(一)

在使用Spring Cloud的過程中,難免會遇到一些問題。所以對Spring Cloud的常用問題做一些總結。

一、Eureka常見問題

1.1 Eureka 註冊服務慢

預設情況下,服務註冊到Eureka Server的過程較慢。在開發或測試時,常常希望能夠加速這一
過程,從而提升工作效率。

    該問題的原因及解決方案:

    服務的註冊涉及週期性心跳,預設30秒一次(通過客戶端配置的serviceUrl)。只有當例項、服務端和客戶端的本地快取中的元資料都相同時,服務才被其他客戶端發現(所以可能需要3次心跳)。可以使用引數 eureka.instance.leaseRenewalI

nSeconds 修改時間間隔, 從而加快客戶端連線到其他服務的過程。在生產環境中最好堅持使用預設值,因為在伺服器內部有一些計算,它們會對續約做出假設。

    綜上所述,要想解決服務註冊慢的問題,只須將  eureka.instance.leaseRenewalInSeconds 設成一個更小的值。該配置用於設定 Eureka Client 向 Eureka Server 傳送心跳的時間間隔, 預設是30,單位是秒。在生產環境中,建議堅持使用預設值。

1.2 已停止的微服務節點登出慢或不登出

    在開發環境下,常常希望 Eureka Server 能迅速有效地登出已停止的微服務例項。然而,由於 Eureka Server 清理無效節點週期長(預設90秒),以及自我保護模式等原因,可能會遇到微服務登出慢甚至不登出的問題。解決方案如下:

 · Eureka Server 端:

  配置關閉自我保護,並按需配置 Eureka Server 清理無效節點的時間間隔。

eureka.server.enable-self-preservation
# 設為false, 關閉自我保護, 從而保證會登出微服務

eureka.server.eviction-interval-timer-in-ms
# 清理間隔(單位毫秒,預設是60 * 1000)

 · Eureka Client 端:

   配置開啟健康檢查, 並按需配置續約更新時間和到期時間。

eureka.client.healthcheck.enabled
# 設為true,開啟健康檢查(需要spring-boot-starter-actuator 依賴)

eureka.instance.lease-renewal-interval-in-seconds
# 續約更新時間間隔(預設是30秒)

eureka.instance.lease-expiration-duration-in-seconds
# 續約到期時間(預設90秒)

 值得注意的是,這些配置僅建議開發或測試時使用,生產環境建議堅持使用預設值。

下面給出兩個例項

 · Eureka Server 配置

eureka:
  server:
    enable-self-preservation:false
    eviction-interval-timer-in-ms:4000

· Eureka Client 配置

eureka:
  client:
    healthcheck:
      enabled:true
  instance:
    lease-expiration-duration-inseconds:30
    lease-renewal-interval-in-seconds:10

修改Eureka的續約頻率可能會打破 Eureka 的自我保護特徵;這也意味著在生產環境中,如果想要使用 Eureka 的自我保護特性,應堅持使用預設配置。

1.3 自定義微服務的Instance ID

    Instance ID用於唯一標識註冊到Eureka Server 上的微服務例項。在Eureka Server 的首頁可以直觀地看到各個微服務的InstanceID 。例如,下圖中的 eureka-dev:cloud-register-user:8002 就是Instance ID 。

 

  在 Spring Cloud 中,服務的Instance ID   的預設值是${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}} 。當然如果想要自定義這部分內容,只須在微服務中配置 eureka.instance.instance-id 屬性即可,示例如下:

spring:
  application:
    name: cloud-register-user
eureka:
  instance:
    # 將 Instance ID 設定成IP: 埠的形式
    instance-id:${spring.cloud.client.ipAddress}:${server.port}

  這樣,就可以將微服務cloud-register-user 的Instance ID 設為IP:埠的形式。效果圖如下:

 

1.4 Eureka 的 UNKNOWN 問題總結與解決

   註冊資訊 UNKNOWN ,是新手常會遇到的問題。但往往很多新手,並不清楚有兩種 UNKNOWN 的情況,一種是應用名稱 UNKNOWN,另一種是應用狀態 UNKNOWN 。

  1)應用名稱UNKNOWN

    應用名稱UNKNOWN 顯然不合適,首先是微服務的名稱不夠語義化,無法直觀看出這是哪個微服務;更重要的是,我們常常使用應用名稱消費對應微服務的介面。

    一般來說,有兩種情況會導致該問題的發生:

    · 未配置spring.application.name 或者 eureka.instance.appname 屬性。如果這兩個屬性均不配置,就會導致應用名稱 UNKNOWN 的問題。

    · 某些舊版本的SpringFox 會導致該問題,例如 SpringFox 2.6.0 。建議使用SpringFox 2.6.1或更新版本。

 2) 微服務例項狀態UNKNOWN

    微服務例項狀態UNKNOWN 同樣很麻煩。一般來講,只會請求狀態是 UP 的微服務。該問題一般由健康檢查導致。

    eureka.client.healthcheck.enabled=true必須設定在application.yml中,而不能設定在bootstrap.yml 中,否則一些場景下會導致應用狀態 UNKNOWN 的問題。

拓展閱讀

    1) SpringFox 是一款基於Spring 和 Swagger 的開源的API 文件框架,前身是 swagger-springmvc 【http://springfox.io/】。

    2) Swagger 是一款非常流行的API 文件框架,它可以幫助我們設計、構建、測試、RESTful 介面,也可生成 RESTful 介面文件。【http://swagger.io/

更多精彩內容,請關注博主公眾號