01-SpringCloud相關(guān)概念介紹
1、微服務(wù)的由來
微服務(wù)最早由Martin Fowler與James Lewis于2014年共同提出,微服務(wù)架構(gòu)風(fēng)格是一種使用一套小服務(wù)來開發(fā)單個應(yīng)用的方式途徑,每個服務(wù)運行在自己的進程中,并使用輕量級機制通信,通常是HTTP API,這些服務(wù)基于業(yè)務(wù)能力構(gòu)建,并能夠通過自動化部署機制來獨立部署,這些服務(wù)使用不同的編程語言實現(xiàn),以及不同數(shù)據(jù)存儲技術(shù),并保持最低限度的集中式管理。

2、為什么需要微服務(wù)
在傳統(tǒng)的IT行業(yè)軟件大多都是各種獨立系統(tǒng)的堆砌,這些系統(tǒng)的問題總結(jié)來說就是擴展性差,可靠性不高,維護成本高。到后面引入了SOA服務(wù)化,但是,由于 SOA 早期均使用了總線模式,這種總線模式是與某種技術(shù)棧強綁定的,比如:J2EE。這導(dǎo)致很多企業(yè)的遺留系統(tǒng)很難對接,切換時間太長,成本太高,新系統(tǒng)穩(wěn)定性的收斂也需要一些時間。
3、微服務(wù)與單體架構(gòu)區(qū)別
(1)單體架構(gòu)所有的模塊全都耦合在一塊,代碼量大,維護困難。
? ? ? ? ?微服務(wù)每個模塊就相當(dāng)于一個單獨的項目,代碼量明顯減少,遇到問題也相對來說比較好解決。
(2)單體架構(gòu)所有的模塊都共用一個數(shù)據(jù)庫,存儲方式比較單一。
? ? ? ? ?微服務(wù)每個模塊都可以使用不同的存儲方式(比如有的用redis,有的用mysql等),數(shù)據(jù)庫也是單個模塊對應(yīng)自己的數(shù)據(jù)庫。
(3)單體架構(gòu)所有的模塊開發(fā)所使用的技術(shù)一樣。
????????微服務(wù)每個模塊都可以使用不同的開發(fā)技術(shù),開發(fā)模式更靈活。?
4、微服務(wù)本質(zhì)
(1)微服務(wù),關(guān)鍵其實不僅僅是微服務(wù)本身,而是系統(tǒng)要提供一套基礎(chǔ)的架構(gòu),這種架構(gòu)使得微服務(wù)可以獨立的部署、運行、升級,不僅如此,這個系統(tǒng)架構(gòu)還讓微服務(wù)與微服務(wù)之間在結(jié)構(gòu)上“松耦合”,而在功能上則表現(xiàn)為一個統(tǒng)一的整體。這種所謂的“統(tǒng)一的整體”表現(xiàn)出來的是統(tǒng)一風(fēng)格的界面,統(tǒng)一的權(quán)限管理,統(tǒng)一的安全策略,統(tǒng)一的上線過程,統(tǒng)一的日志和審計方法,統(tǒng)一的調(diào)度方式,統(tǒng)一的訪問入口等等。
(2)微服務(wù)的目的是有效的拆分應(yīng)用,實現(xiàn)敏捷開發(fā)和部署 。
(3)微服務(wù)提倡的理念團隊間應(yīng)該是 inter-operate, not integrate 。inter-operate是定義好系統(tǒng)的邊界和接口,在一個團隊內(nèi)全棧,讓團隊自治,原因就是因為如果團隊按照這樣的方式組建,將溝通的成本維持在系統(tǒng)內(nèi)部,每個子系統(tǒng)就會更加內(nèi)聚,彼此的依賴耦合能變?nèi)酰缦到y(tǒng)的溝通成本也就能降低。
5、什么樣的項目適合微服務(wù)
????????微服務(wù)可以按照業(yè)務(wù)功能本身的獨立性來劃分,如果系統(tǒng)提供的業(yè)務(wù)是非常底層的,如:操作系統(tǒng)內(nèi)核、存儲系統(tǒng)、網(wǎng)絡(luò)系統(tǒng)、數(shù)據(jù)庫系統(tǒng)等等,這類系統(tǒng)都偏底層,功能和功能之間有著緊密的配合關(guān)系,如果強制拆分為較小的服務(wù)單元,會讓集成工作量急劇上升,并且這種人為的切割無法帶來業(yè)務(wù)上的真正的隔離,所以無法做到獨立部署和運行,也就不適合做成微服務(wù)了。
6、微服務(wù)開發(fā)框架
目前微服務(wù)的開發(fā)框架,最常用的有以下四個:
????Spring Cloud:http://projects.spring.io/spring-cloud(現(xiàn)在非常流行的微服務(wù)架構(gòu))
????Dubbo:http://dubbo.io
????Dropwizard:http://www.dropwizard.io (關(guān)注單個微服務(wù)的開發(fā))
????Consul、etcd&etc.(微服務(wù)的模塊)
7、什么是Spring Cloud
????????Spring Cloud是一系列框架的集合。它利用Spring Boot的開發(fā)便利性簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),如服務(wù)發(fā)現(xiàn)、服務(wù)注冊、配置中心、消息總線、負載均衡、 熔斷器、數(shù)據(jù)監(jiān)控等,都可以用Spring Boot的開發(fā)風(fēng)格做到一鍵啟動和部署。Spring并沒有重復(fù)制造輪子,它只是將目前各家公司開發(fā)的比較成熟、經(jīng)得起實際考驗的服務(wù)框架組合起來,通過SpringBoot風(fēng)格進行再封裝屏蔽掉了復(fù)雜的配置和實現(xiàn)原理,最終給開發(fā)者留出了一套簡單易懂、易部署和易維護的分布式系統(tǒng)開發(fā)工具包。

8、Spring Cloud和Spring Boot是什么關(guān)系
????????Spring Boot 是 Spring 的一套快速配置腳手架,可以基于Spring Boot 快速開發(fā)單個微服務(wù),Spring Cloud是一個基于Spring Boot實現(xiàn)的開發(fā)工具;Spring Boot專注于快速、方便集成的單個微服務(wù)個體,Spring Cloud關(guān)注全局的服務(wù)治理框架; Spring Boot使用了默認大于配置的理念,很多集成方案已經(jīng)幫你選擇好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot來實現(xiàn),必須基于Spring Boot開發(fā)。可以單獨使用Spring Boot開發(fā)項目,但是Spring Cloud離不開 Spring Boot。
9、Spring Cloud相關(guān)基礎(chǔ)服務(wù)組件
????????服務(wù)發(fā)現(xiàn)——Netflix Eureka(Nacos)
????????服務(wù)調(diào)用——Netflix Feign?
????????熔斷器——Netflix Hystrix?
????????服務(wù)網(wǎng)關(guān)——Spring Cloud??GateWay
????????分布式配置——Spring Cloud Config(Nacos)
????????消息總線 —— Spring Cloud Bus(Nacos)
10、Spring Cloud的版本
Spring Cloud并沒有熟悉的數(shù)字版本號,而是對應(yīng)一個開發(fā)代號。

????????開發(fā)代號看似沒有什么規(guī)律,但實際上首字母是有順序的,比如:Dalston版本,我們可以簡稱 D 版本,對應(yīng)的 Edgware 版本我們可以簡稱 E 版本。
小版本
Spring Cloud 小版本分為:
SNAPSHOT: 快照版本,隨時可能修改
M: MileStone,M1表示第1個里程碑版本,一般同時標(biāo)注PRE,表示預(yù)覽版版。
SR: Service Release,SR1表示第1個正式版本,一般同時標(biāo)注GA:(GenerallyAvailable),表示穩(wěn)定版本。
02-服務(wù)發(fā)現(xiàn)-搭建Nacos服務(wù)
一、Nacos
1、基本概念
(1)Nacos?是阿里巴巴推出來的一個新開源項目,是一個更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺。Nacos?致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos?提供了一組簡單易用的特性集,幫助您快速實現(xiàn)動態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。Nacos?幫助您更敏捷和容易地構(gòu)建、交付和管理微服務(wù)平臺。?Nacos?是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu)?(例如微服務(wù)范式、云原生范式)?的服務(wù)基礎(chǔ)設(shè)施。
(2)常見的注冊中心:
????????1. Eureka(原生,2.0遇到性能瓶頸,停止維護)
????????2. Zookeeper(支持,專業(yè)的獨立產(chǎn)品。例如:dubbo)
????????3. Consul(原生,GO語言開發(fā))
????????4. Nacos
????????相對于?Spring Cloud Eureka?來說,Nacos?更強大。Nacos = Spring Cloud Eureka + Spring Cloud Config
????????Nacos?可以與?Spring, Spring Boot, Spring Cloud?集成,并能代替?Spring Cloud Eureka, Spring Cloud Config
????????-?通過?Nacos Server?和?spring-cloud-starter-alibaba-nacos-discovery?實現(xiàn)服務(wù)的注冊與發(fā)現(xiàn)。
(3)Nacos是以服務(wù)為主要服務(wù)對象的中間件,Nacos支持所有主流的服務(wù)發(fā)現(xiàn)、配置和管理。
Nacos主要提供以下四大功能:
1.?服務(wù)發(fā)現(xiàn)和服務(wù)健康監(jiān)測
2.?動態(tài)配置服務(wù)
3.?動態(tài)DNS服務(wù)
4.?服務(wù)及其元數(shù)據(jù)管理
(4)Nacos結(jié)構(gòu)圖


2、Nacos下載和安裝
(1)下載地址和版本
下載地址:https://github.com/alibaba/nacos/releases
下載版本:nacos-server-1.1.4.tar.gz或nacos-server-1.1.4.zip,解壓任意目錄即可
(2)啟動nacos服務(wù)
- Linux/Unix/Mac
啟動命令(standalone代表著單機模式運行,非集群模式)
啟動命令:sh startup.sh -m standalone
- Windows
啟動命令:cmd startup.cmd?或者雙擊startup.cmd運行文件。

訪問:http://localhost:8848/nacos
用戶名密碼:nacos/nacos

二、服務(wù)注冊(service_edu為例)
把service-edu微服務(wù)注冊到注冊中心中。
1、在service模塊配置pom
配置Nacos客戶端的pom依賴
????????<!--服務(wù)注冊-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
? ? ? ? </dependency>
2、添加服務(wù)配置信息
配置application.properties,在客戶端微服務(wù)中添加注冊Nacos服務(wù)的配置信息
service-edu模塊:
# nacos服務(wù)地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、添加Nacos客戶端注解
service-edu模塊:在客戶端微服務(wù)啟動類中添加注解
@EnableDiscoveryClient
4、啟動客戶端微服務(wù)
啟動注冊中心
啟動已注冊的微服務(wù),可以在Nacos服務(wù)列表中看到被注冊的微服務(wù)
????????service-vod步驟相同。
????????如果service_oss沒有注冊到注冊中心中,啟動時會報錯(no server available),這是因為我們引入了服務(wù)注冊依賴,啟動時會找Nacos注冊中心,但是因為我們沒有做配置所以找不到。后面這些都需要在注冊中心進行注冊。

03-服務(wù)調(diào)用-Feign
一、Feign
1、基本概念
????Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端, Feign可以幫助我們更快捷、優(yōu)雅地調(diào)用HTTP API。
????Feign支持多種注解,例如Feign自帶的注解或者JAX-RS注解等。
????Spring Cloud對Feign進行了增強,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,從而讓Feign的使用更加方便。
????Spring Cloud Feign是基于Netflix feign實現(xiàn),整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供這兩者的強大功能外,還提供了一種聲明式的Web服務(wù)客戶端定義的方式。
????Spring Cloud Feign幫助我們定義和實現(xiàn)依賴服務(wù)接口的定義。在Spring Cloud feign的實現(xiàn)下,只需要創(chuàng)建一個接口并用注解方式配置它,即可完成服務(wù)提供方的接口綁定,簡化了在使用Spring Cloud Ribbon時自行封裝服務(wù)調(diào)用客戶端的開發(fā)量。
二、實現(xiàn)服務(wù)調(diào)用
前提條件:把互相調(diào)用服務(wù)在Nacos進行注冊
1、需求
????????刪除課時的同時刪除云端視頻。
????通過service_edu模塊調(diào)用service_vod中刪除視頻的方法(微服務(wù))。

2、在service模塊添加pom依賴
????????<!--服務(wù)調(diào)用-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-openfeign</artifactId>
? ? ? ? </dependency
3、在調(diào)用端的啟動類添加注解
調(diào)用端:我們需要實現(xiàn)service_edu(調(diào)用端,消費者)調(diào)用service_vod(被調(diào)用端,生產(chǎn)者)
@EnableFeignClients
4、創(chuàng)建包和接口
在調(diào)用端service_edu中創(chuàng)建client包,然后創(chuàng)建VodClient接口:
@FeignClient注解用于指定從哪個服務(wù)中調(diào)用功能 ,名稱與被調(diào)用的服務(wù)名保持一致。
@GetMapping注解用于對被調(diào)用的微服務(wù)進行地址映射。
@PathVariable注解一定要指定參數(shù)名稱,否則出錯
@Component注解防止,在其他位置注入CodClient時idea報錯
@FeignClient("service-vod")
@Component
public interface VodClient {
? ? //根據(jù)視頻id刪除阿里云視頻
? ? //復(fù)制被調(diào)用者的方法,并把路徑寫完全
? ? @DeleteMapping("/eduvod/video/removeAlyVideo/{id}")
? ? public R removeAlyVideo(@PathVariable("id") String id);
}
5、調(diào)用微服務(wù)
在調(diào)用端中調(diào)用client中的方法
????//刪除小節(jié)
? ? //TODO 后面這個方法需要完善:刪除小節(jié)的時候,同時把里面視頻刪除
? ? @DeleteMapping("deleteVideo/{id}")
? ? public R deleteVideo(@PathVariable String id){
? ? ? ? //根據(jù)小節(jié)id獲取視頻id,調(diào)用方法實現(xiàn)視頻刪除
? ? ? ? EduVideo eduVideo = eduVideoService.getById(id);
? ? ? ? String videoSourceId = eduVideo.getVideoSourceId();
? ? ? ? //判斷小節(jié)里面是否有視頻id
? ? ? ? if (!StringUtils.isEmpty(videoSourceId)){
? ? ? ? ? ? //根據(jù)視頻id,遠程調(diào)用實現(xiàn)視頻刪除
? ? ? ? ? ? //需要注入VodClient,才可以使用service_vod中刪除視頻的方法
? ? ? ? ? ? vodClient.removeAlyVideo(videoSourceId);
? ? ? ? }
? ? ? ? //刪除小節(jié)
? ? ? ? eduVideoService.removeById(id);
? ? ? ? return R.ok();
? ? }
6、測試
啟動相關(guān)微服務(wù)
測試刪除課時的功能:刪除小節(jié),數(shù)據(jù)庫和阿里云視頻都被刪除。
04-完善刪除課程業(yè)務(wù)
????需求:刪除課程的同時刪除云端視頻
一、vod服務(wù)
1、web層接口
controller:VodController.java
????//批量刪除視頻
? ? //@RequestParam("videoIdList")表示參數(shù)的名稱是videoIdList
????@DeleteMapping("delete-batch")
? ? public R removeAlyVideoList(@RequestParam("videoIdList") List videoIdList){
? ? ? ? vodService.removeMoreAlyVideo(videoIdList);
? ? ? ? return R.ok();
? ? }
2、業(yè)務(wù)
業(yè)務(wù)接口:VideoService.java
void removeMoreAlyVideo(List videoIdList);
業(yè)務(wù)實現(xiàn):VideoServiceImpl.java
????@Override
? ? public void removeMoreAlyVideo(List videoIdList) {
? ? ? ? try {
? ? ? ? ? ? //初始化對象
? ? ? ? ? ? DefaultAcsClient client = InitObjectV.initVodClient(ConstantPropertiesUtil.ACCESS_KEY_ID,ConstantPropertiesUtil.ACCESS_KEY_SECRET);
? ? ? ? ? ? //創(chuàng)建刪除視頻request對象
? ? ? ? ? ? //一次只能批量刪20個
? ? ? ? ? ? DeleteVideoRequest request = new DeleteVideoRequest();
? ? ? ? ? ? //videoIdList值轉(zhuǎn)換為1,2,3
? ? ? ? ? ? String join = StringUtils.join(videoIdList.toArray(), ",");
? ? ? ? ? ? //向request設(shè)置視頻id
? ? ? ? ? ? //傳遞id的格式:1,2,3
? ? ? ? ? ? request.setVideoIds(join);
? ? ? ? ? ? //調(diào)用初始化對象的方法實現(xiàn)刪除
? ? ? ? ? ? client.getAcsResponse(request);
? ? ? ? } catch (ClientException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? throw new GuliException(20001,"刪除視頻失敗");
? ? ? ? }
? ? }
3、Swagger測試
輸入多個id,每個一行

二、edu服務(wù)
在service-edu調(diào)用service- vod接口實現(xiàn)刪除多個視頻的功能
(1)VodClient:定義服務(wù)名字,調(diào)用方法
1、client
VodClient.java
//批量刪除視頻
? ? //@RequestParam("videoIdList")表示參數(shù)的名稱是videoIdList
? ? @DeleteMapping("/eduvod/video/delete-batch")
? ? public R removeAlyVideoList(@RequestParam("videoIdList") List<String> videoIdList);
2、業(yè)務(wù)
EduCourseControllerl.java:

EduCourseServiceImpll.java:

EduVideoServiceImpl.java
@Service
public class EduVideoServiceImpl extends ServiceImpl<EduVideoMapper, EduVideo> implements EduVideoService {
? ? @Autowired
? ? private VodClient vodClient;
? ? // 1 根據(jù)課程id刪除小節(jié)
? ? //TODO 刪除小節(jié),刪除對應(yīng)視頻文件
? ? @Override
? ? public boolean removeVideoByCourseId(String id) {
? ? ? ? //1 根據(jù)課程id查詢課程所有的視頻id
? ? ? ? QueryWrapper<EduVideo> eduVideoQueryWrapper = new QueryWrapper<>();
? ? ? ? eduVideoQueryWrapper.eq("course_id",id);
? ? ? ? //查詢指定的列
? ? ? ? eduVideoQueryWrapper.select("video_source_id");
? ? ? ? List<EduVideo> eduVideoList = baseMapper.selectList(eduVideoQueryWrapper);
? ? ? ? // List<EduVideo> 變成 List<String>
? ? ? ? List<String> videoIds = new ArrayList<>();
? ? ? ? for (int i = 0; i < eduVideoList.size(); i++) {
? ? ? ? ? ? EduVideo eduVideo = eduVideoList.get(i);
? ? ? ? ? ? String videoSourceId = eduVideo.getVideoSourceId();
? ? ? ? ? ? if (!StringUtils.isEmpty(videoSourceId)){
? ? ? ? ? ? ? ? //放到videoIds里面
? ? ? ? ? ? ? ? videoIds.add(videoSourceId);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //根據(jù)多個視頻id刪除多個視頻
? ? ? ? if (videoIds.size()>0){
? ? ? ? ? ? vodClient.removeAlyVideoList(videoIds);
? ? ? ? }
? ? ? ? //刪除小節(jié)
? ? ? ? //需要根據(jù)小節(jié)id進行刪除,但是傳遞過來的是課程id,因此需要傳遞對象
? ? ? ? QueryWrapper<EduVideo> wrapper = new QueryWrapper<>();
? ? ? ? wrapper.eq("course_id",id);
? ? ? ? int delete = baseMapper.delete(wrapper);
? ? ? ? return delete > 0;
? ? }
}

測試:點擊刪除

05-熔斷器
一、Hystrix基本概念
1、Spring Cloud調(diào)用接口過程
Spring Cloud?在接口調(diào)用上,大致會經(jīng)過如下幾個組件配合:
Feign?----->Hystrix?—>Ribbon?—>Http Client(apache http components?或者?Okhttp)?具體交互流程上,如下圖所示:

(1)接口化請求調(diào)用當(dāng)調(diào)用被@FeignClient注解修飾的接口時,在框架內(nèi)部,將請求轉(zhuǎn)換成Feign的請求實例feign.Request,交由Feign框架處理。
(2)Feign?:轉(zhuǎn)化請求Feign是一個http請求調(diào)用的輕量級框架,可以以Java接口注解的方式調(diào)用Http請求,封裝了Http調(diào)用流程。
(3)Hystrix:熔斷處理機制?Feign的調(diào)用關(guān)系,會被Hystrix代理攔截,對每一個Feign調(diào)用請求,Hystrix都會將其包裝成HystrixCommand,參與Hystrix的流控和熔斷規(guī)則。如果請求判斷需要熔斷,則Hystrix直接熔斷,拋出異常或者使用FallbackFactory返回熔斷Fallback結(jié)果;如果通過,則將調(diào)用請求傳遞給Ribbon組件。
(4)Ribbon:服務(wù)地址選擇?當(dāng)請求傳遞到Ribbon之后,Ribbon會根據(jù)自身維護的服務(wù)列表,根據(jù)服務(wù)的服務(wù)質(zhì)量,如平均響應(yīng)時間,Load等,結(jié)合特定的規(guī)則,從列表中挑選合適的服務(wù)實例,選擇好機器之后,然后將機器實例的信息請求傳遞給Http Client客戶端,HttpClient客戶端來執(zhí)行真正的Http接口調(diào)用;
(5)HttpClient?:Http客戶端,真正執(zhí)行Http調(diào)用根據(jù)上層Ribbon傳遞過來的請求,已經(jīng)指定了服務(wù)地址,則HttpClient開始執(zhí)行真正的Http請求
2、Hystrix概念
Hystrix?是一個供分布式系統(tǒng)使用,提供延遲和容錯功能,保證復(fù)雜的分布系統(tǒng)在面臨不可避免的失敗時,仍能有其彈性。
比如系統(tǒng)中有很多服務(wù),當(dāng)某些服務(wù)不穩(wěn)定的時候,使用這些服務(wù)的用戶線程將會阻塞,如果沒有隔離機制,系統(tǒng)隨時就有可能會掛掉,從而帶來很大的風(fēng)險。SpringCloud使用Hystrix組件提供斷路器、資源隔離與自我修復(fù)功能。下圖表示服務(wù)B觸發(fā)了斷路器,阻止了級聯(lián)失敗。

二、feign結(jié)合Hystrix使用
改造service-edu模塊
1、在service的pom中添加依賴
? ?? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
? ? ? ? </dependency>
? ? ? ? <!--hystrix依賴,主要是用? @HystrixCommand -->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
? ? ? ? </dependency>
? ? ? ? <!--服務(wù)注冊-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
? ? ? ? </dependency>
? ? ? ? <!--服務(wù)調(diào)用-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-openfeign</artifactId>
? ? ? ? </dependency>
2、在service-edu配置文件中添加hystrix配置
#開啟熔斷機制
feign.hystrix.enabled=true
# 設(shè)置hystrix超時時間,默認1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000
3、在service-edu的client包里面創(chuàng)建熔斷器的實現(xiàn)類
@Component
public class VodFileDegradeFeignClient implements VodClient{
? ? //出錯之后執(zhí)行
? ? @Override
? ? public R removeAlyVideo(String id) {
? ? ? ? return R.error().message("刪除視頻出錯了");
? ? }
? ? @Override
? ? public R removeAlyVideoList(List<String> videoIdList) {
? ? ? ? return R.error().message("刪除多個視頻出錯了");
? ? }
}
4、修改VodClient接口的注解
@FeignClient(name = "service-vod",fallback = VodFileDegradeFeignClient.class)
@Component
public interface VodClient {
? ? //根據(jù)視頻id刪除阿里云視頻
? ? //復(fù)制被調(diào)用者的方法,并把路徑寫完全
? ? @DeleteMapping("/eduvod/video/removeAlyVideo/{id}")
? ? public R removeAlyVideo(@PathVariable("id") String id);
? ? //批量刪除視頻
? ? //@RequestParam("videoIdList")表示參數(shù)的名稱是videoIdList
? ? @DeleteMapping("/eduvod/video/delete-batch")
? ? public R removeAlyVideoList(@RequestParam("videoIdList") List<String> videoIdList);
}
5、測試熔斷器效果
使用Debug設(shè)置斷點:
創(chuàng)建小節(jié),然后關(guān)閉vod:

????????在操作的時候,得到視頻id,然后使用遠程調(diào)用vod中的方法根據(jù)id刪除視頻,但是由于vod服務(wù)器已經(jīng)停止,這時就會執(zhí)行熔斷器處理(當(dāng)出現(xiàn)問題,就會執(zhí)行熔斷器的實現(xiàn)類中的方法)。
