人们因为能忘却,所以自己能渐渐的脱离了受过的苦痛,也因为能忘却,所以照样得再犯前人的错误。——鲁迅
引入依赖
1 2 3 4 5 6 7 8 9 10 11
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
<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
|
@GetMapping("say") public AjaxJson say(@RequestParam String word) { return AjaxJson.success().put("data", word); }
|
访问控制台localhost:9000
(上面配置的9000端口)
输入默认用户名密码sentinel
然后找到我们需要限流的接口点击流控
然后我们每秒就只能访问一次了
接下来是服务降级
我们可以在配置文件开启
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;
@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
接口使用@FeignClient
的fallback
参数指定降级实现
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(); }
|
然后访问我们的接口如果出现异常,则会调用我们的降级实现
我们再配置熔断
点击我们远程接口的降级按钮
配置完成后如果我们再远程调用在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();
} catch (BlockException e) { return AjaxJson.error("慢点"); } return AjaxJson.success(); } }
|
加上try(Entry entry = SphU.entry("{资源名}")){}catch(BlockException e){}
后即可把这段代码作为一个受保护的资源
我们可以在catch
中编写我们的降级方法
然后我们需要在流控规则中新建
然后可以看到我们成功实现流控我们的受保护资源