SpringBoot集成Sentinel实现接口流量控制

左手的ㄟ右手 2023-01-23 04:56 141阅读 0赞

2cb941616b47ceb41e95ebdbb05e1872.png

  • Sentinel控制台搭建
  • Sentinel 客户端
    • 项目搭建
    • 如何定义资源
    • 启动控制台
  • 控制台配置规则

Hello,大家好,我是麦洛,今天带大家来了解一下SpringBoot如何继承Sentinel来实现接口流量控制

假如大家有什么问题或者建议,可以关注公众号,回复”加群”就可以获取到我的个人微信二维码,可以拉大家进交流群一起讨论学习;

Sentinel控制台搭建

在我的上一篇文章阿里出品的Sentinel到底是个什么玩意?中,已经介绍过如何准备Sentinel控制台,大家可以直接参考;

Sentinel 客户端

项目搭建

首先我们来创建一个测试项目,这里初始化项目的url建议大家填写阿里云的地址,会有惊喜????

  1. http://start.aliyun.com

1b41c380bade31e91ed03e8c862184f2.png

接下来就是常规操作,一路next,在下图的位置稍微注意一下

47c4ce3584ad0d925294bd4bcbd726d8.png

说明:

同大家以前创建项目一样,只需要在这里勾选Sentinel就可以啦????

项目创建好以后,我们发现pom文件中引入了下面的依赖

0b6d1a7a9a250f7152d68a1862b4214e.png

有的小伙伴看网上博客,也会有下面的方式,指定版本号

  1. <!-- sentinel -->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  5. <version>2.1.0.RELEASE</version>
  6. </dependency>

如果你使用我推荐的阿里云的Url,会发现Sentinel的版本号都定义父工程,Cloud的各个组件的兼容性就不要大家操心了

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-dependencies</artifactId>
  6. <version>${spring-boot.version}</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>com.alibaba.cloud</groupId>
  12. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  13. <version>${spring-cloud-alibaba.version}</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. </dependencies>
  18. </dependencyManagement>

打开项目配置文件,会发现它已经为我们自动加好了配置,真的超级方便????

  1. server.port=8083
  2. # 应用名称
  3. spring.application.name=springcloud-sentinel
  4. # Sentinel 控制台地址
  5. spring.cloud.sentinel.transport.dashboard=localhost:8080
  6. # 取消Sentinel控制台懒加载
  7. # 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
  8. # 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
  9. spring.cloud.sentinel.eager=true
  10. # 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
  11. # spring.cloud.sentinel.transport.client-ip=# sentinel 配置
  12. spring.application.name=frms
  13. spring.cloud.sentinel.transport.dashboard=localhost:8080
  14. spring.cloud.sentinel.transport.heartbeat-interval-ms=500

如何定义资源

编程式定义

官网提供的demo

  1. package com.milo.sentinel;
  2. import com.alibaba.csp.sentinel.Entry;
  3. import com.alibaba.csp.sentinel.SphU;
  4. import com.alibaba.csp.sentinel.slots.block.BlockException;
  5. import com.alibaba.csp.sentinel.slots.block.RuleConstant;
  6. import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
  7. import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
  8. import org.springframework.boot.SpringApplication;
  9. import org.springframework.boot.autoconfigure.SpringBootApplication;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. /**
  13. * 项目入口
  14. * @author Milo Lee
  15. * @date 2021-3-20 19:07
  16. *
  17. */
  18. @SpringBootApplication
  19. public class SentinelApplication {
  20. public static void main(String[] args) {
  21. SpringApplication.run(SentinelApplication.class, args);
  22. // 配置规则.
  23. initFlowRules();
  24. while (true) {
  25. // 1.5.0 版本开始可以直接利用 try-with-resources 特性
  26. try (Entry entry = SphU.entry("HelloWorld")) {
  27. // 被保护的逻辑
  28. Thread.sleep(300);
  29. System.out.println("hello world");
  30. } catch (BlockException | InterruptedException ex) {
  31. // 处理被流控的逻辑
  32. System.out.println("blocked!");
  33. }
  34. }
  35. }
  36. private static void initFlowRules(){
  37. List<FlowRule> rules = new ArrayList<>();
  38. FlowRule rule = new FlowRule();
  39. rule.setResource("HelloWorld");
  40. rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
  41. // Set limit QPS to 20.
  42. rule.setCount(20);
  43. rules.add(rule);
  44. FlowRuleManager.loadRules(rules);
  45. }
  46. }

注解式定义

  1. @SpringBootApplication
  2. public class Application {
  3. public static void main(String[] args) {
  4. SpringApplication.run(ServiceApplication.class, args);
  5. }
  6. }
  7. @Service
  8. public class TestService {
  9. @SentinelResource(value = "sayHello")
  10. public String sayHello(String name) {
  11. return "Hello, " + name;
  12. }
  13. }
  14. @RestController
  15. public class TestController {
  16. @Autowired
  17. private TestService service;
  18. @GetMapping(value = "/hello/{name}")
  19. public String apiHello(@PathVariable String name) {
  20. return service.sayHello(name);
  21. }
  22. }

@SentinelResource 注解用来标识资源是否被限流、降级。上述例子上该注解的属性 sayHello 表示资源名。

启动控制台

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

734225e1fd773bd6b0251ea968acfa54.png

控制台配置规则

控制台的操作我们用编程式定义的例子来演示,大家启动我们的服务

2e6448a2154c7f8c23727085c760b45e.png

我们会发现除了sentinel-dashboard之外,多了一个milolee-sentinel,这个就是我们的服务,它的名称其实对应我们配置文件定义的应用名称:

  1. # 应用名称
  2. spring.application.name=milolee-sentinel

点击机器列表,这这里如果能发现你的机器,那就是成功上线了

b4fab4d725d9b140682acf5af8cc1ac4.png

实时监控

f8de685554f93a159cc45cc19d4a2cc1.png

簇点链路

4d8cb9b74de18b89934087fbeab2abd7.png

流控规则配置

给我们的资源HelloWorld配置流控规则,它的QPS(每秒请求数)为1,如图:

4e6fb3d0012192fb842c72204a3994be.png

通过查看实时监控,我们发现已经生效

fc42a668c5f927549222d1c7d7a01655.png

降级规则配置

给我们的资源HelloWorld添加一个降级规则配置,如果QPS大于1,且平均响应时间大于20ms,则接口下来接口在2秒钟无法访问,之后自动恢复。

bf1b1d367edaec1d6726b086d44741a4.png

目前这些规则仅在内存态生效,应用重启之后,该规则会丢失。后续文章我们会继续学习动态规则

a17c1f71156c78b92ece091ea9aa2dba.png

????关于控制台的使用,大家可以参考官方文档,比较详细https://sentinelguard.io/zh-cn/docs/dashboard.html

谢谢大家的阅读,如果有什么疑问或者建议,可以点击下方留言板,给我留言!

d63a2ec120b13ce6b599ddd691f83d63.png

66fc869e06beeb984e3004bf269ceed5.png

f5e5179efd1c459cbed44dfa8d2945fa.png

往期推荐

阿里出品的Sentinel到底是个什么玩意?

从Nacos客户端视角来分析一下配置中心实现原理

听句劝! Nacos集群搭建可以看看这篇教程

你所不知道的Nacos实现原理

SpringCloud集成Nacos实现服务发现和配置管理

Spring Cloud Alibaba -Nacos入门讲解

3b44e69368ee5707d2ce7033368dcd4a.gif

发表评论

表情:
评论列表 (有 0 条评论,141人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Sentinel(五)之流量控制

    转载自  [流量控制][Link 1] 概述 流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制

    相关 流量控制Sentinel

    Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性,

    相关 Sentinel流量控制规则

    [完整目录清单页面(必看)][Link 1] 流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,