SpringCloud 極簡(jiǎn)入門 | 您所在的位置:網(wǎng)站首頁 › 屬猴出生最有錢的日子 › SpringCloud 極簡(jiǎn)入門 |
![]() 上章節(jié)我們講了消費(fèi)者調(diào)用生產(chǎn)者的兩種方案。 調(diào)用過程中出現(xiàn)異常或者服務(wù)不可用怎么辦呢? 管它呢,直接返回給客戶錯(cuò)誤信息.... 這個(gè)?這個(gè)?這樣做貌似不是一個(gè)合格程序員做的事情吧,我們應(yīng)該遵循友好性原則,友情提示下。 那這就是本篇的主題FeignClient中使用熔斷機(jī)制Hystrix進(jìn)行服務(wù)熔斷友情提示 小插曲說來也慚愧,項(xiàng)目弄了3個(gè)月了剛開始也是集成了熔斷機(jī)制的,可以SpringCloud一升級(jí)發(fā)現(xiàn)不起作用了,也就不用管這塊,突然在整理本章內(nèi)容的時(shí)候,發(fā)現(xiàn)了原因,現(xiàn)在共享給大家,希望有所幫助。(我們時(shí)共同進(jìn)步的機(jī)制,所以有問題在下面發(fā)表你的看法,有問必有答) 概念掃盲在微服務(wù)架構(gòu)中,根據(jù)業(yè)務(wù)來拆分成一個(gè)個(gè)的服務(wù),服務(wù)與服務(wù)之間可以相互調(diào)用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來調(diào)用。為了保證其高可用,單個(gè)服務(wù)通常會(huì)集群部署。由于網(wǎng)絡(luò)原因或者自身的原因,服務(wù)并不能保證100%可用,如果單個(gè)服務(wù)出現(xiàn)問題,調(diào)用這個(gè)服務(wù)就會(huì)出現(xiàn)線程阻塞,此時(shí)若有大量的請(qǐng)求涌入,Servlet容器的線程資源會(huì)被消耗完畢,導(dǎo)致服務(wù)癱瘓。服務(wù)與服務(wù)之間的依賴性,故障會(huì)傳播,會(huì)對(duì)整個(gè)微服務(wù)系統(tǒng)造成災(zāi)難性的嚴(yán)重后果,這就是服務(wù)故障的“雪崩”效應(yīng)。為了解決這個(gè)問題,業(yè)界提出了斷路器模型。 Netflix開源了Hystrix組件,實(shí)現(xiàn)了斷路器模式,SpringCloud對(duì)這一組件進(jìn)行了整合。 在微服務(wù)架構(gòu)中,一個(gè)請(qǐng)求需要調(diào)用多個(gè)服務(wù)是非常常見的 來張圖 強(qiáng)大的springcloud-01-eureka-producer-consumer模塊,沒錯(cuò),本章內(nèi)容還是以這個(gè)模塊為demo,已經(jīng)很多章節(jié)都是以此模塊講解了,是不是有必要下載下源碼呢?(文末共享) 以下代碼在消費(fèi)者spring-cloud-consumer添加 首先是pom引入(和上章節(jié)一樣,木變化)我們用的是spring-cloud-starter-openfeign核心包 org.springframework.cloud spring-cloud-starter-openfeign org.springframework.cloud spring-cloud-starter-netflix-eureka-client 接下就是Service層了看看和上篇有哪些變化 @FeignClient(name= "spring-cloud-provider",fallbackFactory = HelloServiceFallbackFactory.class) public interface HelloService { @RequestMapping(value = "hello") public String hello(@RequestParam(value = "name") String name); }發(fā)現(xiàn)有什么不同了嗎?沒錯(cuò)的,相信已經(jīng)看到了,就這么簡(jiǎn)單加上fallbackFactory即可 fallbackFactory = HelloServiceFallbackFactory.class 然后HelloServiceFallbackFactory?實(shí)現(xiàn)FallbackFactory接口就ok了 HelloServiceFallbackFactory 類 @Component public class HelloServiceFallbackFactory implements FallbackFactory { @Override public HelloService create(Throwable throwable) { return new HelloService() { @Override public String hello(String name) { return "連接超時(shí),稍后重試"; } }; } }注意點(diǎn):加上注解@Component 不要忘記? ?;然后實(shí)現(xiàn)每個(gè)方法的返回值就ok了 啟動(dòng)類? (也很關(guān)鍵) @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients //1.支持Hystrix和他的fallback 2.支持ribbon 的負(fù)載均衡 3.啟動(dòng)時(shí)會(huì)進(jìn)行包掃描,掃描所有帶@FeignClient的類并進(jìn)行處理 public class SpringCloudConsumerApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudConsumerApplication.class, args); System.out.println("/*************spring cloud consumer 9001********************/"); } }對(duì)的只需要加上@EnableFeignClients即可,但是這邊有幾個(gè)知識(shí)點(diǎn),一定要要牢記,EnableFeignClients功能 1.支持Hystrix和他的fallback ?2.支持ribbon 的負(fù)載均衡 ? 3.啟動(dòng)時(shí)會(huì)進(jìn)行包掃 Controller層結(jié)束,為了本章完整性,在加一下controller吧(和上章木有變化) 啟動(dòng)項(xiàng)目開始測(cè)試 測(cè)試?訪問controller結(jié)果返回,正確,收工? 這就測(cè)試完成了?我們還忘了配置文件的配置吧,不是忘記了,是因?yàn)樘匾耍覀兎旁谶@里講解 配置文件(最后幾項(xiàng)) spring.application.name=spring-cloud-consumer server.port=9001 eureka.client.serviceUrl.defaultZone=http://localhost:7001/eureka/ #開啟熔斷 feign.hystrix.enabled=true #是否開啟超時(shí)熔斷, 如果為false,?則熔斷機(jī)制只在服務(wù)不可用時(shí)開啟 hystrix.command.default.execution.timeout.enabled=true #?設(shè)置超時(shí)熔斷時(shí)間 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000測(cè)試流程:關(guān)閉掉spring-cloud-provider模塊的生產(chǎn)者,此時(shí)是沒有服務(wù)的,消費(fèi)者者訪問理應(yīng)觸發(fā)熔斷機(jī)制。 一:我們要是不開啟熔斷feign.hystrix.enabled,會(huì)有什么效果呢(如下圖,還是會(huì)報(bào)錯(cuò)的,熔斷沒起作用) 二:feign.hystrix.enabled=true開啟后 ? 結(jié)論:熔斷生效 至于最后熔斷超時(shí)設(shè)置,驗(yàn)證就很簡(jiǎn)單了(啟動(dòng)消費(fèi)者在生產(chǎn)者打上斷點(diǎn),消費(fèi)者自然就超時(shí)了) 未打斷點(diǎn)返回?cái)?shù)據(jù):hello spring-cloud zhangsan1 開始打斷點(diǎn): 打上之后返回:連接超時(shí),稍后重試? 結(jié)論:超時(shí)設(shè)置生效 End案例很簡(jiǎn)單,要學(xué)會(huì)動(dòng)手實(shí)踐,SpringCloud極簡(jiǎn)入門系列文章結(jié)束后,即將開啟高級(jí)架構(gòu)實(shí)戰(zhàn)篇?dú)g迎轉(zhuǎn)發(fā)關(guān)注 有問題可隨時(shí)@架構(gòu)師速成記 源碼:https://github.com/shinians/springcloud-demos |
CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有 |