Spring Boot集成 Sentinel 实现接口流量控制

麦洛 等级 1301 0 0

Spring Boot集成 Sentinel 实现接口流量控制

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

Sentinel控制台搭建

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

Sentinel 客户端

项目搭建

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

http://start.aliyun.com

Spring Boot集成 Sentinel 实现接口流量控制

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

Spring Boot集成 Sentinel 实现接口流量控制

说明:

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

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

Spring Boot集成 Sentinel 实现接口流量控制

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

 <!-- sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>

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

 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

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

如何定义资源

编程式定义

官网提供的demo

package com.milo.sentinel;

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.ArrayList;
import java.util.List;

/**
 * 项目入口
 * @author Milo Lee
 * @date 2021-3-20 19:07
 *
 */
@SpringBootApplication
public class SentinelApplication {

    public static void main(String[] args) {
        SpringApplication.run(SentinelApplication.class, args);

        // 配置规则.
        initFlowRules();
        while (true) {
            // 1.5.0 版本开始可以直接利用 try-with-resources 特性
            try (Entry entry = SphU.entry("HelloWorld")) {
                // 被保护的逻辑
                Thread.sleep(300);
                System.out.println("hello world");
            } catch (BlockException | InterruptedException ex) {
                // 处理被流控的逻辑
                System.out.println("blocked!");
            }
        }

    }

    private static void initFlowRules(){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("HelloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // Set limit QPS to 20.
        rule.setCount(20);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

}

注解式定义

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(ServiceApplication.class, args);
    }
}

@Service
public class TestService {

    @SentinelResource(value = "sayHello")
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}

@RestController
public class TestController {

    @Autowired
    private TestService service;

    @GetMapping(value = "/hello/{name}")
    public String apiHello(@PathVariable String name) {
        return service.sayHello(name);
    }
}

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

启动控制台

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

Spring Boot集成 Sentinel 实现接口流量控制

控制台操作介绍

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

Spring Boot集成 Sentinel 实现接口流量控制

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

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

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

Spring Boot集成 Sentinel 实现接口流量控制

实时监控

Spring Boot集成 Sentinel 实现接口流量控制

簇点链路

Spring Boot集成 Sentinel 实现接口流量控制

流控规则配置

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

Spring Boot集成 Sentinel 实现接口流量控制

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

Spring Boot集成 Sentinel 实现接口流量控制

降级规则配置

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

Spring Boot集成 Sentinel 实现接口流量控制

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

Spring Boot集成 Sentinel 实现接口流量控制

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

收藏
评论区

相关推荐

Java 开发者得力助手,深入实践 Spring Boot
![](https://static.oschina.net/uploads/space/2016/1207/153620_km1K_2720166.png) 简单易用的 Spring Boot,无疑是 Java 开发初学者的指路明灯,更是资深 Java 开发者的得力助手。快速开发是研发 Spring Boot 的初衷,这不但是一个开发团队的终生追求,也是
4.22 错误优化策略
本博客来自我的新书Java系统性能优化(暂定名),也欢迎阅读我的新书 [《Spring Boot 2 精髓 》](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.kancloud.cn%2Fxiandafu%2Fspringboot2-in-practice%2F "《Spring
Nepxion Discovery 5.5.10 发布
![](https://oscimg.oschina.net/oscnet/930a2da0-a7bd-473f-ba54-12f3681549bc.png) ### 发布日志 #### 版本更新: * 升级Spring Boot到2.1.11.RELEASE * 升级Sentinel到1.7.1 #### 功能更新:
Sentinel 1.7.2 发布,完善开源生态及扩展性
多样化的适配模块 -------- 到目前为止,Sentinel 已覆盖微服务、API Gateway 和 Service Mesh 三大板块的核心生态,同时多语言已推出 Java、C++、Go 三种语言的原生实现。 ![78636450_ef3a4b00_78da_11ea_89ce_c7a2b58c2deb](https://yqfile.alicd
Sentinel Getting Started And Integration of Spring Cloud Alibaba Tutorials
原文链接:[Sentinel Getting Started And Integration of Spring Cloud Alibaba Tutorials](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.javaspring.net%2Fsentinel%2Fsentinel
Sentinel
![9.28头图.png](https://ucc.alicdn.com/pic/developer-ecology/af7ab6c27c3c4c3aa5dc2cce3c9e8ab9.png) > \*\*导读:\*\*2020年,Sentinel 推出 Go 原生版本[Sentinel-Golang](https://www.oschina.net/ac
Spring Boot GraphQL 实战 02_增删改查和自定义标量
Spring Boot GraphQL 实战系列第二篇,使用 GraphQL 实现增删改查。 > hello,大叫好,我是小黑,又和大家见面啦~ > > 今天我们来继续学习 Spring Boot GraphQL 实战,我们使用的框架是 https://github.com/graphql-java-kickstart/graphql-spring-
Spring Boot demo系列(六):HTTPS
2021.2.24 更新 ============ 1 概述 ==== 本文演示了如何给`Spring Boot`应用加上`HTTPS`的过程。 2 证书 ==== 虽然证书能自己生成,使用`JDK`自带的`keytool`即可,但是生产环境是不可能使用自己生成的证书的,因此这里使用的证书是购买过来的,具体流程就不说了,去云厂商处购买即可。 3 配
Spring Boot 最核心的 3 个注解详解
最近面试一些 Java 开发者,他们其中有些在公司实际用过 Spring Boot, 有些是自己兴趣爱好在业余自己学习过。然而,当我问他们 Spring Boot 最核心的 3 个注解是什么,令我失望的是鲜有人能答上来,这样你能说你对 Spring Boot 很了解吗?这可能还会给你减分! 你所需具备的基础 -------- * [什么是 Sprin
Spring Boot 最流行的 16 条实践,Java 开发变得更加简单!
****![](https://oscimg.oschina.net/oscnet/42cd0348c854f21a6251057dca878e435dd.jpg)**** -------------------------------------------------------------------------------------- Sprin
Spring Boot日志集成
![](https://oscimg.oschina.net/oscnet/1bde8e8d-00e8-48be-8b84-e9d1d44c9e5c.jpg) Spring Boot日志框架 --------------- Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用star
Spring Security学习笔记(三)
之前提到过认证后怎么存放用户信息,令牌_**token**_是一种方式,_**session**_是另一种方式,这里介绍使用_**spring session data redis**_存储_**httpSession**_。 ![](https://img2018.cnblogs.com/blog/486512/201809/486512-2018092
Spring boot集成spring
1、创建Spring boot项目 ![](https://oscimg.oschina.net/oscnet/425ef6945bf5be71b4b7bb65f038f6d6cd8.png) ![](https://images2018.cnblogs.com/blog/656996/201805/656996-20180529215033756-23
SpringBoot学习之路:02.第一个程序Hello World及项目结构介绍
         上一篇我们介绍了Spring Boot项目的环境搭建和在idea下项目的创建过程,今天要说的是Spring Boot项目的下的第一个程序Hello World,及Spring Boot项目结构的分析。 首先打开Spring Boot初始项目: ![](https://static.oschina.net/uploads/space/20
SpringBoot学习之路:02.第一个程序Hello World及项目结构介绍
         上一篇我们介绍了Spring Boot项目的环境搭建和在idea下项目的创建过程,今天要说的是Spring Boot项目的下的第一个程序Hello World,及Spring Boot项目结构的分析。 首先打开Spring Boot初始项目: ![](https://static.oschina.net/uploads/space/20