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地址
- 解決辦法: 這是比較正常的現象,只需要再次刷新就好了
解決第一次請求報超時異常的方案
- 錯誤原因: 網路等原因,導致請求時間過長,進而引發timeout的錯誤
- 解決辦法:
- 預設時間是超過1秒就是超時,將其設置為5秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
- 禁用超時時間timeout
hystrix.command.default.execution.timeout.enabled: false
- 索性禁用feign的hystrix支持
feign.hystrix.enabled: false
- 超時的issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/768
- 超時的解決方案: http://stackoverflow.com/questions/27375557/hystrix-command-fails-with-timed-out-and-no-fallback-available
- hystrix配置: https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.thread.timeoutInMilliseconds
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
- 錯誤原因: 消費者調用服務時無服務可用
- 解決辦法:
- 確定本機是否關閉防火牆
- 是否導入eureka的jar包
<!-- 註冊Eureka服務 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 確定是否導入hystrix的jar包
<!-- 配置hystrix所需依賴的包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
- 確定配置文件服務前面是否有空格
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