1. 程式人生 > >SpringCloud學習中遇到的一些bug

SpringCloud學習中遇到的一些bug

 

There was a problem with the instance info replicator

  • 錯誤原因: 該服務嘗試將自己作為客服端註冊
  • 解決辦法: 在application.yml配置檔案中,設定
# 註冊Eureka服務
eureka:
  client:
    # Eureka服務註冊中心會將自己作為客戶端來嘗試註冊它自己,必須禁止
    register-with-eureka: false
    fetch-registry: false

 

實體類轉化出錯: disable SerializationFeature.FAIL_ON_EMPTY_BEANS

  • 錯誤原因: 使用的框架是Spring Boot,處理完請求之後,返回資料之前,在POJO轉化成JSON時,有些屬性違背輸出規則或者有些屬性迴圈引用會造成無法輸出。
  • 解決辦法: 在實體類上面加上註解
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })

 

This application has no explicit mapping for /error, so you are seeing this as a fallback.

  • 錯誤原因: 很可能是你Application啟動類放的位置不對。要將Application放在最外層,也就是要包含所有子包。
  • 解決辦法: 將Application放在最外層,也就是要包含所有子包。

 

message:Request method 'POST' not supported

There was an unexpected error (type=Internal Server Error, status=500). status 405 reading UserFeignClient#getUser(User); content: {"timestamp":"2018-09-07T09:01:14.290+0000","status":405,"error":"Method Not Allowed","message":"Request method 'POST' not supported","path":"/feign-get-user"}

  • 錯誤原因: 該請求不會成功,只要引數是複雜物件,即使指定了是GET方法,feign依然會以POST方法進行傳送請求。可能是我沒找到相應的註解或使用方法錯誤。

  • 解決辦法:

    // 該請求不會成功,只要引數是複雜物件,即使指定了是GET方法,feign依然會以POST方法進行傳送請求。可能是我沒找到相應的註解或使用方法錯誤。
    @RequestMapping(method = RequestMethod.GET, value = "/feign-get-user")
    public User getUser(User user);
    
    //正確用法
    @RequestMapping(method = RequestMethod.GET, value = "/feign-get-user")
    public User getUser(@RequestParam("id") Long id, @RequestParam("username") String username, @RequestParam("age") String age);
}

 

Error creating bean with name 'eurekaAutoServiceRegistration'

org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'eurekaAutoServiceRegistration': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)

  • 錯誤原因:
    • 同一個服務重複啟了;
    • 或者是埠被其他應用佔用了。
  • 解決辦法: 釋放被佔用的埠即可

 

Read timed out

  • 詳細描述: com.sun.jersey.api.client.ClientHandlerException: java.net.SocketTimeoutException: Read timed out
  • 錯誤原因: 應用剛啟動,需要通過ribbon從eureka上拉取服務;需要將虛擬主機名轉化為ip地址
  • 解決辦法: 這是比較正常的現象,只需要再次重新整理就好了

 

解決第一次請求報超時異常的方案

 

Cannot execute request on any known server

  • 錯誤詳細描述: com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
  • 錯誤原因: Peer Awareness配置
# application.yml (Two Peer Aware Eureka Servers). 
---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2/eureka/

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1/eureka/
  • 解決辦法: 修改C:\Windows\System32\drivers\etc路徑下的hosts檔案,在文末加入以下內容:
127.0.0.1 peer1 peer2 peer3

 

com.netflix.client.ClientException: Load balancer does not have available server for client: microservice-provider-user

  • 錯誤原因: 消費者呼叫服務時無服務可用
  • 解決辦法:
  1. 確定本機是否關閉防火牆
  2. 是否匯入eureka的jar包
    <!-- 註冊Eureka服務 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
  1. 確定是否匯入hystrix的jar包
    <!-- 配置hystrix所需依賴的包 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
  1. 確定配置檔案服務前面是否有空格

    image

 

Unable to connect to Command Metric Stream

  • 錯誤原因: 配置檔案不完整
  • 解決辦法: Hystrix Metrics Stream 要啟用Hystrix度量標準流,請在spring-boot-starter-actuator上包含依賴項,並設定management.endpoints.web.exposure.include:hystrix.stream。 這樣做會將 /actuator/hystrix.stream公開為管理端點,如以下示例所示:
    • pom.xml
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
       
        </dependency>
    • application.yml
        # 配置Hystrix Metrics Stream
        management:
          endpoints:
            web:
              exposure:
                include: hystrix.stream

     

hystrix.stream一直是ping

  • 錯誤原因:
    • 因為沒有請求任何東西,所以看不到內容;
    • 缺少配置監控的依賴
    • 配置環境不完善
  • 解決辦法:
    • 訪問一下其他服務,比如http://localhost:9000/goods/2(自己寫的一個服務)即可看到內容
    • 客服端新增依賴
    <!-- Actuator是SpringBoot提供的對應用系統的自省和監控的整合功能,可以檢視應用配置的詳細資訊;
       如果提示 Unable to connect to Command Metric Stream.則需要引入以下包!
    -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency> 
    • 完善配置環境
     # 使用Hystrix Metrics Stream必備 
     management:
       endpoints: 
         web:
           exposure: 
             include: hystrix.stream   

     

turbine.stream一直是ping

  • 錯誤原因:
    • 因為沒有請求任何東西,所以看不到內容;
    • 缺少配置監控的依賴
    • Eureka服務註冊中心未將自己作為客戶端來嘗試註冊它自己
    # 註冊Eureka服務
    eureka:
      client:
        register-with-eureka: false
        fetch-registry: false
    • 缺少配置監控的依賴
  • 解決辦法:
    • 訪問一下其他服務,比如http://localhost:9000/goods/2(自己寫的一個服務)即可看到內容
    • 客服端新增依賴
    <!-- Actuator是SpringBoot提供的對應用系統的自省和監控的整合功能,可以檢視應用配置的詳細資訊;
       如果提示 Unable to connect to Command Metric Stream.則需要引入以下包!
    -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency> 
    • Eureka服務註冊中心未將自己作為客戶端來嘗試註冊它自己
    # 註冊Eureka服務
    eureka:
      client:
    #    register-with-eureka: false
    #    fetch-registry: false
    • 新增配置的依賴(作為客服端的都需要配置)
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency> 

     

Health Indicator訪問無結果

  • 錯誤原因:
    • 未匯入依賴包
    • 版本原因導致訪問方式改變了
  • 解決辦法:
    • 匯入依賴包
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    • 訪問http://localhost:8030/actuator檢視
     {
         "_links": {
             "self": {
                 "href": "http://localhost:8030/actuator",
                 "templated": false
             },
             "health": {
                 "href": "http://localhost:8030/actuator/health",
                 "templated": false
             },
             "info": {
                 "href": "http://localhost:8030/actuator/info",
                 "templated": false
             }
         }
     }
    • 訪問http://localhost:8030/actuator/health即可

 

Turbine監控多個服務,配置後,出現只監控到一部分服務情況

  • 錯誤原因:
    • 配置有問題
  • 解決辦法:
    • application.xml配置如下:
    # 0、配置多個監控服務
    turbine:
      appConfig: microservice-consumer-goods-feign-with-hystrix,microservice-consumer-goods-ribbon-with-hystrix
      clusterNameExpression: "'default'"
    # 1、僅配置監控一個服務
    turbine:
      aggregator:
        clusterConfig: MICROSERVICE-CONSUMER-GOODS-RIBBON-WITH-HYSTRIX
      appConfig: microservice-consumer-goods-ribbon-with-hystrix
    • 各個微服務的Controller配置 
      每個微服務均需要加上如下註解:
    //配置hystrix所需註解
    @EnableCircuitBreaker