Ribon的服務降級操作
雪崩效應:
?如果短信服務炸了后面的所有服務就會起連鎖反應造成全部服務掛掉,這就是雪崩效應,那么其實短信服務又不是我們主要業(yè)務,這個時候我們可以采用服務降級,服務降級就是暫時的把短信服務停掉能用就返回不能用就返回個錯誤,但是它也不會影響到我們的主業(yè)務,這樣就會保障我們主要服務的正常運行
總結下其實就是對于我們的非主線業(yè)務我們一般會才去服務降級的方式保證我們的主要業(yè)務正常的運行
服務降級或者是容錯我們才使用springcloud提供的Hystrix(豪豬)進行操作:
首先我們在member項目上進行測試
輸入測試地址:http://localhost:8088/test?bid=1,返回的信息如下圖所示:
?返回的controller使我們的Ribbon對RestTemplate做的集群請求,如下所示:
?我們把book的服務停掉來看下結果:
我們發(fā)現我們的book服務訪問不到了,但是這樣是不成的我們來給用戶看,其實是因為book的模塊因為壓力太大我手動的給停掉了(后續(xù)會使用熔斷器進行操作)
所以下面我們使用Hyxtrix進行操作,首先我們先導入Hyxtrix的依賴,在member的pom.xml文件中
<!--Hyxtrix的依賴--> |
然后在Member項目啟動類添加一個注解:
package com.laosan.member; |
回到我們Controller中要對test這個方法寫一個服務降級的方法:
具體的解決如下所示:
/** |
然后我們通過瀏覽器進行測試:
返回我們對服務降級所要的結果
但是我們還是有個問題,就是Controller中有多個方法需要服務降級,那么我們就要為每一個方法寫一個對應的降級方法,這個時候我們就需要寫一個通用的全局的服務降級方法
首先我們要在該Controller中添加一個注解
@Controller 定義一個服務降級的方法 /** 對應的服務降級的方法上面的注解也需要改變下,如下所示: /** } |
但是現在還有個問題就是超時的問題,如果請求超出了時間Hystrix也會對我們進行服務的降級,測試如下所示,我們把我們的book服務啟動,并在book的Controller的info方法中設置一個時間:
@GetMapping("/info") 啟動book服務 |
我們通過瀏覽器來查看會不會對我們進行一個服務降級的操作呢,在瀏覽器進行測試,如下所示:
?我們發(fā)現也發(fā)生了服務降級
這樣的話是不太好的我們需要對服務降級的時間進行設置,因為他的默認服務降級的時間是1秒,多于1秒立刻服務降級
具體操作如下所示:
我們要在member項目中創(chuàng)建一個配置文件application.yml文件進行配置:
|
最后在瀏覽器進行測試:
Spring Cloud 容錯機試 Hystrix 服務降級 Feign
我們回到book項目進行操作:
首先我們打開bootstrap.yml進行操作:
spring: |
然后我們打開book項目client包下feign的客戶端進行操作:
具體的想法是雖然你的服務掛掉的但是通過hystriy返回一個類似的真實數據
我們發(fā)現因為我們feign是個接口沒辦法進行操作,那么我們可以在接口中寫一個靜態(tài)內部類進行實現就好,具體的如下所示:boot服務中 package com.pb.client; import com.pb.dto.MemberDTO; import com.pb.vo.ResultVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.Map; @FeignClient(name="member",fallback = MemberClient.MemberClientFallBack.class) public interface MemberClient { //調用member的服務請求為selectMemberByMobile的 @RequestMapping("/selectMemberByMobile") ResultVo<MemberDTO> selectMemberByMobile(@RequestParam("mobile") String mobile); @Component //通過靜態(tài)內部類來實現自己進行完成操作 static class MemberClientFallBack implements MemberClient{ @Override public ResultVo<MemberDTO> selectMemberByMobile(String mobile) { //啟動服務降級并給一個假的數據返回個調用方 ResultVo<MemberDTO> resultVO = new ResultVo<>(); resultVO.setCode(200); resultVO.setMessage("success"); MemberDTO memberDTO = new MemberDTO(); memberDTO.setMid(0L); resultVO.setData(memberDTO); return resultVO; } } } |
@Transactional
@Override
public void takeBookBookrow(String mobile,Long bid, Date takedate, Date returndate) {
Book book=null;
Optional<Book> option = bookRespository.findById(bid);
if (option.isPresent()){
book=option.get();
}else {
throw new BookNotFoundException("圖書未找到");
}
//庫存是否為0
if (book.getStock()<=0){
throw new BookLessException("庫存不足");
}
//開始插入借書的記錄 ,有個數據要先處理一下 mid
MemberDTO memberDTO=null;
ResultVo<MemberDTO> result = memberClient.selectMemberByMobile(mobile);
if (result.getCode() == 200){
memberDTO=result.getData();
if (memberDTO.getMid()==0){
throw new RuntimeException("輸入錯誤");
}
}
//借書記錄插入
Borrow borrow=new Borrow();
borrow.setBid(bid);
borrow.setMid(memberDTO.getMid()); //*
borrow.setCreatetime(new Date());
borrow.setTakedate(takedate);
borrow.setReturndate(returndate);
//插入下
borrowRepository.save(borrow);
//修改庫存
book.setStock(book.getStock()-1);
bookRespository.saveAndFlush(book);
}
好我們先把book的服務停掉,然后啟動我們的前臺頁面index.html
Hystrix斷路器:(必須和服務降級聯合使用)
改造member項目的Controller里面的內容:
/** */ |
進行對斷路器時間的設置:
hystrix: ??command: ????default: ??????execution: ????????isolation: ??????????thread: ????????????timeoutInMilliseconds: 3000 ??????circuitBreaker: ????????requestVolumeThreshold : 10???#10個請求 ????????sleepWindowInMilliseconds: 10000???#休息10秒 中文章來源:http://www.zghlxwxcb.cn/news/detail-465382.html ????????errorThresholdPercentage: 60????#錯誤的請求達到60%文章來源地址http://www.zghlxwxcb.cn/news/detail-465382.html |
到了這里,關于Spring Cloud 容錯機試 Hystrix 服務降級 RestTemplate:的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!