Sentinel
分为两个部分
:
核心库(
Java
客户端)不依赖任何框架
/库,能够运行于所有 Java 运行时环境,同时对 Dubbo/Spring Cloud 等框架也有较好的支持。[客端户]
控制台(
Dashboard
)基于
Spring Boot
开发,打包后可以直接运行,不需要额外的
Tomcat
等应用容器。 [服务端
]
官方文档
:
https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0
1.获取控制台
可以从
release
页面
下载最新版本的控制台
jar
包。
2.启动控制台(
注意
:启动
Sentinel
控制台需要
JDK
版本为
1.8
及以上版本
)
使用如下命令启动控制台:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.2.jar
3.项目环境
shop
-
product
:
商品服务,提供了
/product/findById/{id}
shop
-
order
-
rest
:
订单服务,基于
Ribbon
通过
RestTemplate
调用商品服务。
shop
-
order
-
feign
:订单服务,基于
Feign
通过声明式服务调用商品服务。
4.客户端接入控制台
1 子工程需要添加如下依赖
:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
2 配置文件
shop
-
order
-
rest
的
application.yml
3
初始化客户并问
5.定义资源
资源
是
Sentinel
中的核心概念之一。我们说的资源,可以是任何东西,服务,服务里的方法,甚至是一段代码。最常用的资源是我们代码中的Java
方法。
Sentinel
提供了
@SentinelResource
注解用于定义资源,并提供了
AspectJ
的 扩展用于自动定义资源、处理 BlockException
等。
package com.yjq.service.impl; import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.yjq.entry.Product; import com.yjq.service.ProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class ProductServiceImpl_blank implements ProductService { @Autowired private RestTemplate restTemplate; @Override //定义资源 //value:定义资源名称 //fallback:异常兜底方案必须 与该方法的返回值一致, 参数必须一致。额外多出一个异常对象 //blockHandLer:熔断兜底方案 @SentinelResource(value = "findByid", fallback = "fallbackMethod", blockHandler = "blockHanderMethod") public Product findByid(Integer pid) { if (pid==1){ throw new RuntimeException("查询主键id为1的导致异常"); } return restTemplate.getForObject("http://shop-product/product/findById/"+pid,Product.class); } public Product fallbackMethod(Integer pid,Throwable e){ Product product=new Product(); product.setPid(pid); product.setPname("服务器出现异常时的兜底方法"); return product; } public Product blockHanderMethod(Integer pid, BlockException e){ Product product=new Product(); product.setPid(pid); product.setPname("服务器出现熔断时的兜底方法"); return product; } }
6.定义规则
Sentinel的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时
Sentinel
也提供相关
API,用来定制自己的规则策略。 Sentinel支持以下几种规则
:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和热点参数规则。
流量控制规则:
选择簇点链路找到定义好的资源
selectProductById
并点击对应的规则按钮进行设置。
熔断降级规则 :
修改
sshop-service-rest
项目中的核心代码,模拟服务出错。
7.动态规则扩展
创建该类:
最后进行测试:
8.openfeign的支持
1 添加依赖
<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>
2
开启
Sentinel
3
创建一个
Feign
接口的实现类
4 在
Feign
上使用兜底类
最后测试: