Sentinel官方提供了详细的由Hystrix 迁移到Sentinel 的方法
(4) 名词解释
Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合Dashboard 可以取得最好的效果。
使用 Sentinel 来进行熔断保护,主要分为几个步骤:
-
定义资源
-
定义规则
-
检验规则是否生效
资源:可以是任何东西,一个服务,服务里的方法,甚至是一段代码。
规则:Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和 热点参数规则。
Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效先把可能需要保护的资源定义好,之后再配置规则。
也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。
(1)下载启动控制台
1)获取 Sentinel 控制台
您可以从官方网站中下载最新版本的控制台 jar 包,下载地址如下:
https://github.com/alibaba/Sentinel/releases/download/1.6.3/sentinel-dashboard-1.6.3.jar
2)启动
使用如下命令启动控制台:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.6.3.jar
其中 -Dserver.port=8080
用于指定 Sentinel
控制台端口为 8080
。
从 Sentinel 1.6.0
起,Sentinel
控制台引入基本的登录功能,默认用户名和密码都是 sentinel
。可以参考 鉴权模块文档 配置用户名和密码。
启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
访问:
(1)客户端能接入控制台(将所有的服务交给控制台管理)
控制台启动后,客户端需要按照以下步骤接入到控制台。
1)创建案例
之前都已经创建过这里直接导入代码学习即可
代码下载地址
https://download.csdn.net/download/qq_44757034/49774279
启动所有项目
2)引入依赖
需要注意SpringCloud-Alibaba与SpringCloud的版本关系
父工程引入alibaba实现的SpringCloud
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.1.0.RELEASE
pom
import
子工程中引入sentinel
- order_service_feign
- order_service_rest
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
3)配置参数
- 在order_service_rest当中的application.yml
cloud:
sentinel:
transport:
dashboard: localhost:8080 #sentinel控制台的请求地址
- order_service_feign当中的application.yml
cloud:
sentinel:
transport:
dashboard: localhost:8080 #sentinel控制台的请求地址
4)启动运行测试
访问:http://localhost:9003/order/buy/1
http://localhost:9004/order/buy/1
访问:http://localhost:8080/#/login
(2)通用的资源保护
1)修改order_service_rest当中的OrderController
package cn.itbluebox.order.controller;
import cn.itbluebox.order.entity.Product;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
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;
@RestController
@RequestMapping(“/order”)
public class OrderController {
@Autowired
private RestTemplate restTemplate;
/**
-
@SentinelResource
-
blockHandler : 声明熔断时调用的降级方法
-
fallback : 抛出异常执行的降级方法
-
value : 自定义的资源名称
-
* 不设置:当前全类名.方法名
*/
@SentinelResource(value=“orderFindById”,blockHandler = “orderBlockHandler”,fallback = “orderFallback”)
@RequestMapping(value = “/buy/{id}”,method = RequestMethod.GET)
public Product findById(@PathVariable Long id) {
if(id != 1) {
throw new RuntimeException(“错误”);
}
return restTemplate.getForObject(“http://service-product/product/1”,Product.class);
}
/**
-
定义降级逻辑
-
hystrix和sentinel
-
熔断执行的降级方法
-
抛出异常执行的降级方法
*/
public Product orderBlockHandler(Long id) {
Product product = new Product();
product.setProductName(“触发熔断的降级方法”);
return product;
}
public Product orderFallback(Long id) {
Product product = new Product();
product.setProductName(“抛出异常执行的降级方法”);
return product;
}
}
在需要被保护的方法上使用@SentinelResource注解进行熔断配置。与Hystrix不同的是,Sentinel对抛
出异常和熔断降级做了更加细致的区分,通过 blockHandler 指定熔断降级方法,通过 fallback 指定
触发异常执行的降级方法。
2)运行测试
访问http://localhost:9004/order/buy/1
访问http://localhost:8080/#/dashboard/metric/service-order-rest
访问测试:http://localhost:9004/order/buy/2进入降级方法
多刷新上述访问我们再次访问http://localhost:9004/order/buy/1也进入降级方法
等待5s以后再次访问http://localhost:9004/order/buy/1
恢复正常状态,退出降级方法
3)对于@SentinelResource的其他配置如下表:
注:1.6.0 之前的版本 fallback 函数只针对降级异常( DegradeException )进行处理,不能针对业务异常进行处理。
特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。
若未配置 blockHandler 、 fallback 和 defaultFallback ,则被限流降级时会BlockException 直接抛出。
一条限流规则主要由下面几个因素组成:
resource:资源名,即限流规则的作用对象
count: 限流阈值
grade: 限流阈值类型(QPS 或并发线程数)
limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
strategy: 调用关系限流策略
controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
java代码 RuleConstant
配置文件添加如下配置
#通过文件读取限流规则
spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json
spring.cloud.sentinel.datasource.ds1.file.data-type=json
spring.cloud.sentinel.datasource.ds1.file.rule-type=flow
1)修改order_service_rest当中的application.yml
ds1:
file:
file: classpath:flowrule.json
data-type: json
rule-type: flow
eager: true #立即加载
2)创建flowrule.json
[
{
“resource”: “orderFindById”,
“controlBehavior”: 0,
“count”: 1,
“grade”: 1,
“limitApp”: “default”,
“strategy”: 0
}
]
3)运行测试
访问:http://localhost:9004/order/buy/1
访问:http://localhost:8080/#/dashboard/identity/service-order-rest
(1)修改order_service_rest当中的OrderController
去除之前配置的关于熔断的方法
package cn.itbluebox.order.controller;
import cn.itbluebox.order.entity.Product;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
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;
@RestController
@RequestMapping(“/order”)
public class OrderController {
@Autowired
private RestTemplate restTemplate;
/**
-
@SentinelResource
-
blockHandler : 声明熔断时调用的降级方法
-
fallback : 抛出异常执行的降级方法
-
value : 自定义的资源名称
-
* 不设置:当前全类名.方法名
*/
@RequestMapping(value = “/buy/{id}”,method = RequestMethod.GET)
public Product findById(@PathVariable Long id) {
if(id != 1) {
throw new RuntimeException(“错误”);
}
return restTemplate.getForObject(“http://service-product/product/1”,Product.class);
}
}
(2)在order_service_rest当中的RestOrderApplication上测试
1)创建ExceptionUtils
package cn.itbluebox.order.exception;
import cn.itbluebox.order.entity.Product;
import com.alibaba.cloud.sentinel.rest.SentinelClientHttpResponse;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.fastjson.JSON;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
public class ExceptionUtils {
/**
-
静态方法
-
返回值: SentinelClientHttpResponse
-
参数 : request , byte[] , clientRquestExcetion , blockException
*/
//限流熔断业务逻辑
public static SentinelClientHttpResponse handleBlock(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution,
BlockException ex) {
Product product = new Product();
product.setProductName(“限流熔断降级”);
总结
阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了
1、JAVA面试核心知识整理(PDF):包含JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。
2、Redis学习笔记及学习思维脑图
3、数据面试必备20题+数据库性能优化的21个最佳实践
tpResponse handleBlock(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution,
BlockException ex) {
Product product = new Product();
product.setProductName(“限流熔断降级”);
总结
阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了
[外链图片转存中…(img-1g1XQZO7-1714337818521)]
1、JAVA面试核心知识整理(PDF):包含JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。
[外链图片转存中…(img-3lTQobcc-1714337818522)]
2、Redis学习笔记及学习思维脑图
[外链图片转存中…(img-2SNOHBR2-1714337818522)]
3、数据面试必备20题+数据库性能优化的21个最佳实践
[外链图片转存中…(img-ePheKTFk-1714337818523)]