超详细的Sentinel入门

本文详细介绍了Sentinel作为分布式系统流量防卫兵的角色,对比了它与Hystrix的区别,并展示了Sentinel的核心组件和特性。文章通过实例演示了Sentinel的Hello World、规则定义、多种限流方式(抛出异常、返回布尔值、注解)以及熔断降级功能。还详细讲解了Sentinel控制台的使用,包括客户端接入、动态规则管理(拉模式和推模式)。Sentinel的动态规则确保了实时性和一致性,适配多种数据源,如Nacos。最后,文章强调了Sentinel在微服务稳定性中的重要性,并鼓励读者深入探索其更多功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary

一、什么是Sentinel

Sentinel定位是分布式系统的流量防卫兵。目前互联网应用基本上都使用微服务,微服务的稳定性是一个很重要的问题,而限流、熔断降级是微服务保持稳定的一个重要的手段。

下面看官网的一张图,了解一下Sentinel的主要特性:
在这里插入图片描述
在Sentinel之前其实就有Hystrix做熔断降级的事情,我们都知道出现新的事物肯定是原来的东西有不足的地方。

那Hystrix有什么不足之处呢?

  • Hystrix常用的线程池隔离会造成线程上下切换的overhead比较大。
  • Hystrix没有监控平台,需要我们自己搭建。
  • Hystrix支持的熔断降级维度较少,不够细粒,而且缺少管理控制台。

Sentinel有哪些组成部分?

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

Sentinel有哪些特征?

  • 丰富的应用场景。控制突发流量在可控制的范围内,消息削峰填谷,集群流量控制,实时熔断下游不可用的应用等等。

  • 完备的实时监控。Sentinel 提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。

  • 广泛的开源生态。Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

  • 完善的 SPI 扩展点。Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

二、Hello World

一般要学一种没接触过的技术框架,肯定要先做个Hello World熟悉一下。

引入Maven依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.1</version>
</dependency>

需要提醒一下,Sentinel仅支持JDK 1.8或者以上的版本

定义规则

通过定义规则来控制该资源每秒允许通过的请求次数,例如下面的代码定义了资源 HelloWorld 每秒最多只能通过 20 个请求。

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);
}

编写Hello World代码

其实代码编写很简单,首先需要定义一个资源entry,然后用SphU.entry("HelloWorld")entry.exit()把需要流量控制的代码包围起来。代码如下:

public static void main(String[] args) throws Exception {
   
    initFlowRules();
    while (true) {
   
        Entry entry = null;
        try {
   
            entry = SphU.entry("HelloWorld");
            /*您的业务逻辑 - 开始*/
            System.out.println("hello world");
            /*您的业务逻辑 - 结束*/
        } catch (BlockException e1) {
   
            /*流控逻辑处理 - 开始*/
            System.out.println("block!");
            /*流控逻辑处理 - 结束*/
        } finally {
   
            if (entry != null) {
   
                entry.exit();
            }
        }
    }
}

运行结果如下:
在这里插入图片描述
我们根据目录查看日志,文件名格式为${appName}-metrics.log.xxx:

|--timestamp-|------date time----|-resource-|p |block|s |e|rt
1616607101000|2021-03-25 01:31:41|HelloWorld|20|11373|20|0|1|0|0|0
1616607102000|2021-03-25 01:31:42|HelloWorld|20|24236|20|0|0|0|0|0

p 代表通过的请求。

block 代表被阻止的请求。

s 代表成功执行完成的请求个数。

e 代表用户自定义的异常。

rt 代表平均响应时长。

三、使用Sentinel的方式

下面结合实际案例,写一个Controller接口进行示范练习。

@RestController
@RequestMapping("/user")
public class UserController {
   
    @Resource
    private UserService userService;

    @RequestMapping("/list")
    public List<User> getUserList() {
   
        return userService.getList();
    }
}

@Service
public class UserServiceImpl implements UserService {
   
    //模拟查询数据库数据,返回结果
    @Override
    public List<User> getList() {
   
        List<User> userList = new ArrayList<>();
        userList.add(new User("1", 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值