日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

SpringCloud Alibaba微服务实战(五) - Sentinel实现限流熔断

發布時間:2023/11/28 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringCloud Alibaba微服务实战(五) - Sentinel实现限流熔断 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是Sentinel?

請查看文章:SpringCloud Alibaba微服務實戰(一) - 基礎環境搭建

構建服務消費者cloud-sentinel進行服務調用

服務創建請查看文章:SpringCloud Alibaba微服務實戰(二) - Nacos服務注冊與restTemplate消費
1.在父項目中創建子module項目名字為cloud-sentinel,在pom中引入nacos服務注冊依賴

 <!--Spring web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--SpringCloud Alibaba nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

完整服務消費者cloud-sentinel的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>cloud-alibaba</artifactId><groupId>com.zsy.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><artifactId>cloud-sentinel</artifactId><dependencies><!--Spring web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--SpringCloud Alibaba nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><!--指定阿里云鏡像庫下載依賴--><repository><id>central</id><name>aliyunmaven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url></repository></repositories>
</project>

2.配置application.yml或者properties文件

server:port: 8085
spring:#服務應用名字application:name: cloud-sentinelcloud:# 指定nacos控制臺地址,配置注冊ip:端口,注意即使是80端口也不可能省略nacos:discovery:server-addr: 127.0.0.1:8848sentinel:transport:dashboard: 127.0.0.1:8080 # sentinel服務端地址eager: true # 取消延遲加載

3.FeignClient接口定義AccountService

package com.zsy.springcloud.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Map;
@FeignClient("cloud-account")
public interface AccountService {//獲取客戶信息@RequestMapping(value = "/getAccount", method = RequestMethod.GET)public Map<String,Object> getAccount();
}

4.創建消費者AccountConsumerController

package com.zsy.springcloud.controller;
import com.zsy.springcloud.service.AccountService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Log4j2
@RestController
public class AccountConsumerController {@Resourceprivate AccountService accountService;@RequestMapping(value = "/getAccount", method = RequestMethod.GET)public Map<String,Object> getAccount() {Map<String,Object> account = new HashMap<>();log.info("---------消費者開始------------");account = accountService.getAccount();log.info("---------消費者結束--------account{}----", account);return account;}
}

5.配置消費者啟動服務的啟動類

package com.zsy.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient //開啟服務注冊
@EnableFeignClients//開啟feign客戶端
public class CloudSentinelApplication {public static void main(String[] args) {SpringApplication.run(CloudSentinelApplication.class, args);}
}

6.啟動cloud-sentinel服務項目,啟動成功,如下圖

7. 驗證服務,瀏覽器訪問http://localhost:8085/getAccount,返回如下圖

查看消費者cloud-sentinel控制臺,如下圖

查看服務者cloud-account控制臺,如下圖

限流

限流配置
訪問:http://127.0.0.1:8080/,登錄sentinel
理想是豐滿的,現實是骨感的。為了方便測試,我們就將cloud-sentinel中的getAccount接口的QPS單機閾值設置成1,如果每秒QPS超過1,直接丟棄。

打開瀏覽器,快速刷新瀏覽器,當每秒請求書超過1時會看到如下錯誤:

不要慌,這說明我們的目的達到了,限流成功!

自定義異常

我們可以通過@SentinelResource中添加blockHandler參數,給其添加自定義異常方法。如:

package com.zsy.springcloud.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.zsy.springcloud.service.AccountService;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;@Log4j2
@RestController
public class AccountConsumerController {@Resourceprivate AccountService accountService;@RequestMapping(value = "/getAccount", method = RequestMethod.GET)@SentinelResource(value = "getAccount",blockHandler = "handleException")public Map<String,Object> getAccount() {Map<String,Object> account = new HashMap<>();log.info("---------消費者開始------------");account = accountService.getAccount();log.info("---------消費者結束--------account{}----", account);return account;}/*** 自定義異常策略* 返回值和參數要跟目標函數一樣,參數可以追加BlockException*/public Map<String,Object> handleException(BlockException exception){Map<String,Object> account = new HashMap<>();log.info("flow exception{}",exception.getClass().getCanonicalName());account.put("msg","別點了,達到閥值了,稍后再試");return account;}
}

注意,自定義的異常方法的參數和返回值要跟目標方法一樣,參數可以追加BlockException

打開瀏覽器,快速刷新瀏覽器,當每秒請求書超過1時會看到如下錯誤:

@SentinelResource 屬性介紹

熔斷

什么是熔斷?
消費者order-service需要先調用product-service獲取具體的product,然后再處理其他的業務邏輯。但是這個product-service接口不是很穩定,經常拋出異常,或者是響應緩慢,宕機。導致order-service的響應變慢;如果置之不理,order-service可能會被product-service拖垮。這時候為了保護order-service,我們需要對product-service接口進行熔斷。

總結:熔斷是通過限制自己對外部系統的調用, 起到節約響應時間、維護鏈路穩定的作用

熔斷

Sentinel中的熔斷降級有三個降級策略:

RT(平均響應時間):
當資源的平均響應時間超過閾值之后,資源進入準降級狀態。接下來如果持續進入 5 個請求,它們的 RT 都持續超過這個閾值,那么在接下的時間窗口之內,對這個方法的調用都會自動拋出 DegradeException 異常。在下一個時間窗口到來時, 會接著再放入5個請求, 再重復上面的判斷.

異常比例
當資源的每秒異??倲嫡纪ㄟ^量的比值超過閾值之后,資源進入降級狀態,即在接下的時間窗口之內,對這個方法的調用都會自動地拋出DegradeException異常。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。

異常數
當資源近 1 分鐘的異常數目超過閾值之后會進行熔斷。

未進行熔斷配置,服務異常驗證

1.配置服務拋出異常

2.驗證,訪問http://localhost:8085/getAccount,頁面展示如下圖:

控制臺如下圖:

在日常中,我們肯定不希望發生這樣的事故。我們可以通過熔斷實現服務降級來處理這種情況

熔斷配置

1.自定義異常,創建異常本地實現類,實現FeignClient接口

package com.zsy.springcloud.fallback;
import com.zsy.springcloud.service.AccountService;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Log4j2
@Service
public class AccountServiceBack implements AccountService {@Overridepublic Map<String, Object> getAccount() {Map<String,Object> account = new HashMap<>();account.put("msg","服務熔斷了,本地處理");return account;}
}

.2.修改FeignClient接口定義AccountService

package com.zsy.springcloud.service;
import com.zsy.springcloud.fallback.AccountServiceBack;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Map;
@FeignClient(value = "cloud-account",fallback = AccountServiceBack.class)
public interface AccountService {//獲取客戶信息@RequestMapping(value = "/getAccount", method = RequestMethod.GET)public Map<String,Object> getAccount();
}

3.配置application.yml或者properties文件

server:port: 8085
spring:#服務應用名字application:name: cloud-sentinelcloud:# 指定nacos控制臺地址,配置注冊ip:端口,注意即使是80端口也不可能省略nacos:discovery:server-addr: 127.0.0.1:8848sentinel:transport:dashboard: 127.0.0.1:8080 # sentinel服務端地址eager: true # 取消延遲加載
feign:hystrix:enabled: true #打開feign對hustrix的支持,FeignClient 中的 fallback不起任何作用

因為Fallback是通過Hystrix實現的, 所以需要開啟Hystrix,spring boot application.properties文件配置feign.hystrix.enabled=true,這樣就開啟了Fallback

4.配置getAccount熔斷

5.驗證,訪問http://localhost:8085/getAccount,頁面展示如下圖:

控制臺如下圖:

熔斷配置完成,我們已經給我們的微服務加上了限流熔斷保護,再也不用擔心異常流量的沖擊,下游系統不穩定導致自身服務不可用了。本片文章只是對Sentinel進行了一個入門級的交流,Sentinel更高級的等后面有時間了另行分享。
1.Sentinel的配置默認是放在內存中的,每當應用重啟或者sentinel重啟都會丟失數據,該如何處理?
。。。。。。。。。.。。。。。。。。。。。。。。。
碼云地址:https://gitee.com/zlzhaoe/cloud-alibaba

總結

以上是生活随笔為你收集整理的SpringCloud Alibaba微服务实战(五) - Sentinel实现限流熔断的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。