Spring Cloud Alibaba 学习 -- 3、S

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

学习视频(B站):www.bilibili.com/video/BV1Mt…

GitHub 源码地址:github.com/tyronczt/sp…

简介

Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。

雪崩效应

如果在A的链路上某个或几个被调用的子服务不可用或延迟较高,则会导致调用A服务的请求被堵住。堵住的请求会消耗占用掉系统的线程、io等资源,当该类请求越来越多,占用的计算机资源越来越多的时候,会导致系统瓶颈出现,造成其他的请求同样不可用,最终导致业务系统崩溃,又称:雪崩效应。

解决方案

  1. 设置线程超时
  2. 设置限流
  3. 熔断器 Sentinel、Hystrix
  • 降级:在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack方法)
  • 限流:服务限流就是对接口访问进行限制,常用服务限流算法令牌桶、漏桶,计数器也可以进行粗暴限流实现。
  • 熔断:熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值,让后直接拒绝访问,保护当前服务。

集成Sentinel

  • provider 的 pom.xml 引入依赖
1
2
3
4
5
6
7
8
9
10
xml复制代码<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • application.yml 配置
1
2
3
4
5
6
7
8
9
10
11
12
yaml复制代码# 配置限流路径
management:
endpoints:
web:
exposure:
include: "*"
# sentinel的控制面板路径
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080

用户名/密码:sentinel/sentinel

实时监控

当访问provider项目中index接口时 [http://localhost:3333/index],sentinel会将流量实时记录,每十秒刷新:

在这里插入图片描述

簇点链路

在这里插入图片描述

流控规则

在这里插入图片描述

一般阈值类型选择QPS(Query Per Second每秒查询率)

直接限流

选择单机阈值为1时,即表示每秒查询超过1时,即被流量限制,默认提示:Blocked by Sentinel (flow limiting)

关联限流

流控模式为 **关联 **时,输入关联资源,如list,即效果为:当list超过阈值时,index限制访问

模拟访问list接口:

1
2
3
4
5
6
7
java复制代码public static void main(String[] args) throws InterruptedException {
RestTemplate restTemplate = new RestTemplate();
for (int i = 0; i < 1000; i++) {
restTemplate.getForEntity("http://localhost:3333/list",String.class);
Thread.sleep(200);
}
}

效果:
在这里插入图片描述

链路限流

主要对service或dao层的接口进行限流保护。

pom.xml 添加依赖

1
2
3
4
5
6
7
8
9
10
11
xml复制代码<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.7.1</version>
</dependency>

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-web-servlet</artifactId>
<version>1.7.1</version>
</dependency>

修改配置文件application.yml

1
2
3
4
5
yaml复制代码spring:
cloud:
sentinel:
filter:
enabled: false

添加配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
java复制代码@Configuration
public class FilterConfiguration {

@Bean
public FilterRegistrationBean registrationBean(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new CommonFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY,"false");
registrationBean.setName("sentinelFilter");
return registrationBean;
}
}

Service层

1
2
3
4
5
6
7
8
java复制代码@Service
public class ProviderService {

@SentinelResource("provider")
public String provider(){
return "ProviderService";
}
}

Controller层

1
2
3
4
5
6
7
8
9
10
11
12
java复制代码@Autowired
private ProviderService providerService;

@GetMapping("/provider1")
public String provider1() {
return providerService.provider();
}

@GetMapping("/provider2")
public String provider2() {
return providerService.provider();
}

配置规则
在这里插入图片描述

访问:http://localhost:3333/provider2,当QPS超过1时,提示500

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%