人们因为能忘却,所以自己能渐渐的脱离了受过的苦痛,也因为能忘却,所以照样得再犯前人的错误。——鲁迅

引入依赖

1
2
3
4
5
6
7
8
9
10
11
<!--    sentinel 降级熔断    -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 与sentinel控制台进行通信 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.7.1</version>
</dependency>

下载客户端jar包

然后输入命令运行

1
java -Dserver.port=9000 -Dcsp.sentinel.dashboard.server=localhost:9000 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

若您的应用使用了 Spring AOP,您需要通过配置的方式将 SentinelResourceAspect 注册为一个 Spring Bean:

1
2
3
4
5
6
7
8
@Configuration
public class SentinelAspectConfiguration {

@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
}

然后在配置文件配置

1
2
3
4
5
6
7
sentinel:
transport:
port: 9001
dashboard: localhost:9000
filter:
enabled: true
url-patterns: /**

因为我们可以看到运行后输出的

2021-03-16 23:24:49.986 INFO 18604 — [ main] c.a.c.s.SentinelWebAutoConfiguration : [Sentinel Starter] register SentinelWebInterceptor with urlPatterns: [/*].

所以需要配置url-patterns: /**否则只有一层url会被监控到

1
2
3
4
5
6
7
8
9
10
/**
* 登录成功时调用该接口,传入一句话
*
* @param word 参数 例子:?word=登录成功!
* @return 返回json格式的map
*/
@GetMapping("say")
public AjaxJson say(@RequestParam String word) {
return AjaxJson.success().put("data", word);
}

访问控制台localhost:9000(上面配置的9000端口)

输入默认用户名密码sentinel

然后找到我们需要限流的接口点击流控

image-20210315223724526

image-20210315223743891

然后我们每秒就只能访问一次了

image-20210315223811400

接下来是服务降级

我们可以在配置文件开启

1
2
3
feign:
sentinel:
enabled: true

然后实现我们的feign接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.ruben.feign.fallback;

import com.ruben.feign.ConsumerService;
import com.ruben.pojo.dto.PageDTO;
import com.ruben.utils.AjaxJson;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
* @ClassName: ConsumerServiceFallback
* @Description: 我还没有写描述
* @Date: 2021/3/16 0016 22:14
* *
* @author: <achao1441470436@gmail.com>
* @version: 1.0
* @since: JDK 1.8
*/
@Slf4j
@Service
public class ConsumerServiceFallback implements ConsumerService {
@Override
public AjaxJson list(PageDTO pageDTO) {
log.error("服务挂了");
return AjaxJson.error("");
}

@Override
public AjaxJson dropWare() {
log.error("服务挂了");
return AjaxJson.error("");
}
}

最后在feign接口使用@FeignClientfallback参数指定降级实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.ruben.feign;

import com.ruben.feign.fallback.ConsumerServiceFallback;
import com.ruben.pojo.dto.PageDTO;
import com.ruben.utils.AjaxJson;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(value = "ruben-consumer", fallback = ConsumerServiceFallback.class)
public interface ConsumerService {
@GetMapping("study/list")
AjaxJson list(@RequestBody PageDTO pageDTO);

@GetMapping("ware")
AjaxJson dropWare();
}

然后访问我们的接口如果出现异常,则会调用我们的降级实现

image-20210316222356684

我们再配置熔断

点击我们远程接口的降级按钮

image-20210316222609418

image-20210316222702186

配置完成后如果我们再远程调用在5秒内异常比例超过百分之八十,则之后都会直接调用我们的降级实现了

自定义受保护的资源

可以在接口上加@SentinelResource注解

也可以在代码中

1
2
3
4
5
6
7
8
9
10
11
12
13
    @Override
@Transactional
@GlobalTransactional
public AjaxJson order() {
try (Entry entry = SphU.entry("resourceName")) {
consumerService.dropWare();
// mpOrderMapper.insert(OrderPO.builder().id(1L).build());
} catch (BlockException e) {
return AjaxJson.error("慢点");
}
return AjaxJson.success();
}
}

加上try(Entry entry = SphU.entry("{资源名}")){}catch(BlockException e){}

后即可把这段代码作为一个受保护的资源

我们可以在catch中编写我们的降级方法

然后我们需要在流控规则中新建

image-20210316223918123

然后可以看到我们成功实现流控我们的受保护资源

image-20210316224004294