前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
一、為什么要有熔斷
在微服務架構中,根據業務來拆分成一個個的服務,服務與服務之間可以相互調用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來調用。為了保證其高可用,單個服務通常會集群部署。由于網絡原因或者自身的原因,服務并不能保證100%可用,如果單個服務出現問題,調用這個服務就會出現線程阻塞,此時若有大量的請求涌入,Servlet容器的線程資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重后果,這就是服務故障的 “雪崩” 效應。
為了解決這個問題,業界提出了斷路器模型 。
以上出自:https://blog.csdn.net/forezp/article/details/81040990?
二、熔斷實現
1.?首先 啟動 注冊中心 eureka?工程、服務生產者?see-param 工程(8803端口)、
? ? ? ? ? ? ? ? ? ? ?服務消費者 feign 工程(8702端口)、服務消費者 ribbon 工程(8701 端口)。
(生產者和消費者這 2 個概念是相對的。在不同的業務場景中,2 者身份可互換。或多服務時,同一服務可兼具 2 個身份。)
分別訪問 生產者:
2. feign 中熔斷器實現。
配置文件中開啟熔斷:
# 開啟斷熔器: ( Feign 自帶斷路器,但默認為不開啟: false)
feign.hystrix.enabled=true
在?SeeParamService 類中?@FeignClient 注解中加上參數 fallback ,并指明熔斷方法實現類。
書寫?熔斷方法實現類:
package com.feign.servicefeign;import org.springframework.stereotype.Component;/*** @author yujiang* @description 迷斷回調方法類* @date 2019/7/24 9:39*/// 注入IOC容器中,把本類交給 spring 管理
@Component
public class SeeParamError implements SeeParamService {@Overridepublic String seeParam(String param) {return " 乖乖加班吧,服務掛了,搬磚,搬磚 ... ";}}
此時, 關閉服務生產者 see-param 工程,并再訪問其服務:
至此,feign? 熔斷生效 。
3. ribbon?中熔斷器實現。
ribbon 并不自帶迷斷功能,故要引入依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
工程啟動類加注解? @EnableHystrix ,開啟熔斷。
SeeParamService 類中,在要實現熔斷的方法上加注解:@HystrixCommand(fallbackMethod = "熔斷實現方法名"),如:
package com.ribbon.serviceribbon;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;/*** @author yujiang* @description* @date 2019/7/22 11:45*/
@Service
public class SeeParamService {@AutowiredRestTemplate restTemplate;/*** 注解 @HystrixCommand :* 開啟熔斷器,指定熔斷時回調方法為 seeParamError** @param param* @return*/@HystrixCommand(fallbackMethod = "seeParamError")public String seeService(String param) {return restTemplate.getForObject("http://see-param/seeParam?param=" + param, String.class);}/*** 熔斷 調用此方法** @return*/public String seeParamError(String param) {return " 哎,別瞅了,別瞅了,服務已經 go die ...";}}
此時, 關閉服務生產者 see-param 工程,并再訪問其服務:
至此,ribbon? 熔斷生效 。
--------------------------------------------------------------
下一篇:springCloud - 第6篇 - 網關的實現:ZUUL
源碼見:https://gitee.com/FJ_WoMenDeShiJie/springcloud-feign
? ? ? ? ? ? ??https://gitee.com/FJ_WoMenDeShiJie/springcloud-ribbon
--------------------------------------------------------------
PS:這個系列不定時更新,只是個人的學習分享,
內容全程參考書目:
《Spring Cloud 與 Docker 微服務架構空實戰?》、
《Spring Cloud 微服務實戰》及此書作者博客:http://blog.didispace.com/spring-cloud-learning/
《深入理解 Spring Cloud 與微服務構建》及此書作者博客:https://blog.csdn.net/forezp/article/details/70148833
--------------------------------------------------------------