文章目录
一、Sentienl
1. 什么是Sentienl?
Sentinel 是一个开源的分布式系统的流量防卫兵,由阿里巴巴集团开发。它旨在为微服务架构提供流量控制、熔断降级、系统负载保护等功能。Sentinel 可以实时监控应用程序的流量情况,并根据预设的规则对流量进行控制和保护,以确保系统的稳定性和可靠性。
2. Sentinel限流实战
第一步:
Sentinel 提供了现成的服务端供我们使用,点击官网下载,下载之后通过命令行启动:
java -jar -Dserver.port=1111 sentinel-dashboard-1.6.0.jar
访问:http://127.0.0.1:1111
进入控制台,使用 sentinel/sentinel登录。
第二步:修改用户服务 springcloudalibaba-user-server ,加入sentinel依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
第三步:配置Sentinel,在云端或者bootstrap.yml配置,注意结构分层:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:1111
第四步:Sentinel为我们提供了 @SentinelResource
注解标记需要限流的资源,修改UserController:
@GetMapping("/user/{id}")
//限流降级
@SentinelResource(value="user",blockHandler="exceptionHandler")
public User getById(@PathVariable Long id){
return new User(id,"我是zs");
}
// 限流与阻塞处理 : 参数要和 被降级的方法参数一样
public User exceptionHandler(@PathVariable Long id, BlockException ex) {
ex.printStackTrace();
return new User(-1L,"限流了");
}
这里通过@SentinelResource
的value属性为资源取名为 “user” ,后续我们可以根据该资源名来进行限流。
第五步:Sentinel设置限流策略
启动应用 springcloudalibaba-user-server
,然后通过浏览器访问 http://localhost:10020/user/1
,然后登录Sentinel控制台,在“实时监控”列表中可以看到资源的相关监控信息的:
在 “族点链路” 列表中可以看到资源的调用链 ,并且可以通过“流控”按钮设置流控规则:
也可以在“流量控制”菜单中我们可以针对资源进行限流规则的设置。如下:
这里我添加了一个流控规则,资源名对应客户端 @SentinelResource(value="user"..
注解的资源,通过QPS限流(每秒请求数量),阈值是 1 ,意思是“user”这个资源每秒只能有1个请求进来,多余的请求会触发限流,返回降级数据。
第六步:限流测试,通过浏览器频发访问 “user”资源,当QPS大于1就会触发限流:
3. Gateway使用Sentinel限流
第一步:在父工程下新建模块springcloudalibaba-order-gateway
。
第二步:导入gataway基础依赖和配置中心依赖:
<!--gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud </groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 配置中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
第三步:主配置类
//服务注册与发现
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApp {
public static void main(String[] args) {
SpringApplication.run(GatewayApp.class);
}
}
第四步:在http://localhost:8848/nacos/index.html
云端进行yaml配置;最后项目中创建bootstrap.yml
连接云端(略):
server:
port: 10030
spring:
application:
name: gateway-server
cloud:
nacos:
discovery:
server-addr: localhost:8848 #云端
gateway:
discovery:
locator:
enabled: false #开放服务名访问方式
lower-case-service-id: true #服务名小写
routes:
- id : user-server #指定服务名
uri: lb://user-server #去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/servers/user/** #服务访问路径
filters:
- StripPrefix=2 #请求转发的时候会去掉 /servers/user访问路径
- id: order-server
uri: lb://order-server
predicates:
- Path=/servers/order/**
filters:
- StripPrefix=2
第五步:到这里基础的已经搭建完成,现在开始通过Sentinel对请求进行流控。
还是导入依赖,这里我们需要导入sentinel基础依赖和 sentinel-gateway 整合依赖:
<!-- 限流和gataway使用-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
第六步:在云端配置Sentinel地址,注意层级关系:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:1111
第七步:配置限流规则:
启动Gateway,登录sentinel控制台,对url资源进行流控限制,配置方式和前面的配置方式一样。
第八步:编写降级配置类:
@Configuration
public class SentinelConfig {
public SentinelConfig(){
GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
return ServerResponse.ok().body(Mono.just("限流啦,请求太频繁"),String.class);
}
});
}
}
第九步:启动测试 ,启动springcloudalibaba-gateway-server
,浏览器向 http://localhost:10030/servers/user/user/1
资源发起访问。
4. 整合Nacos持久化限流规则
第一步:导入基础依赖,springcloudalibaba-user-server
工程增加Sentinel和Nacos持久化配置依赖 :
<!--Sentinel和Nacos做持久的-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.5.2</version>
</dependency>
第二步:配置Nacos持久化Sentinel限流规则
[
{
"resource": "user",
"limitApp": "default",
"grade": 1,
"count": 10,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
注意:
这里的Data ID没有添加后缀yaml
;"resource": "user"
:这里的 user 指的是资源名。
第三步:bootstrap.yml中添加配置持久化nacos地址:
#====================持久化配置=================================
datasource:
flow:
nacos: #限流持久配置
server-addr: localhost:8848 #使用nacos的持久
dataId: application-user-dev #获取限流的数据源的dataId
groupId: DEFAULT_GROUP
rule-type: flow #类型:限流
#=====================================================
第四步:启动测试 ,启动springcloudalibaba-user-server
,浏览器向 http://localhost:10030/servers/user/user/1
资源发起访问,然后观察Sentinel控制台 ’ 流控规则 ’ 是否有了一条限流策略。
5. Nacos持久化Sentinel降级规则
第一步:在Nacos配置列表增加文件 如:application-user-degrade-dev
(没有后缀yaml):
[
{
"resource": "user",
"grade": 0,
"count": 2,
"timeWindow": 5
}
]
解释一下
- resources : 资源名
- grade : 慢调用比例 0 ;异常比例 1 ;异常数 2;
- count : 最大RT,最大平均响应时间
- timeWindow :时间窗口,即熔断时长
第二步:项目中bootstrap.yml文件中增加配置:
##==================================================================
degrade: #降级的配置
nacos:
server-addr: 127.0.0.1:8848
dataId: application-user-degrade-dev
groupId: DEFAULT_GROUP
rule-type: degrade
第三步:启动测试,观察sentinel的熔断规则列表。
6. Sentinel熔断
第一步:修改springcloudalibaba-user-serve
工程,修改UserController
,通过@SentinelResource
注解的fallback=""
属性指定降级方法。
package top.itimmortal.userTest.controller;
//用户服务:暴露接口给订单访问
@RestController
public class UserController {
@Value("${spring.redis.port}")
private int port;
@Autowired
private IUserService iUserService;
//订单服务来调用这个方法
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
//注解标记需要限流的资源
@SentinelResource(value = "user",/*blockHandler = "exceptionHandler",*/fallback = "Userfallback")
public User getById(@PathVariable("id")Long id){
//根据id去数据库查询User
return iUserService.findOne(id);
}
// //降级类:参数要和 被降级的方法参数一样
// public User exceptionHandler(@PathVariable("id")Long id, BlockException e){
// e.printStackTrace();
// return new User(-1L,"系统繁忙,请稍后重试");
// }
// 熔断降级,参数和返回值与源方法一致
public User Userfallback(@PathVariable Long id){
return new User(id, "熔断托底了");
}
}
第二步:在Sentinel控制台,在族点链路菜单中找到“user”资源,然后点击“降级”按钮添加降级策略。
第三步:启动springcloudalibaba-user-1010工程,频繁访问 http://localhost:10030/servers/user/user/1
。
7. OpenFeign整合Sentinel熔断
第一步:基础配置,连接云端,Sentinel 客户端接入,启动类还要开启Feign支持。
第二步:在bootstrap.yml中添加配置:
feign:
sentinel:
enabled: true #熔断
第三步:给UserFeignClient接口降级:
//Feign根据服务名能够在注册中心找到目标服务的通信地址
@FeignClient(value = "user-server",fallbackFactory = UserClientFallback.class)
public interface UserFeignClient {
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
User getById(@PathVariable("id")Long id);
}
第四步:编写降级类:
@Component
public class UserClientFallback implements FallbackFactory<UserFeignClient> {
@Override
public UserFeignClient create(Throwable throwable) {
return new UserFeignClient() {
@Override
public User getById(Long id) {
return new User(-1L,"降级降级降级");
}
};
}
}
第五步:启动测试。