木朵 發表於 2025-5-6 10:53:00

SpringBoot集成Sentinel实战:从依赖到自定义限流与监控

<p>本文已收录在Github,<strong>关注我,紧跟本系列专栏文章,咱们下篇再续!</strong></p>
<ul>
<li>🚀 魔都架构师 | 全网30W技术追随者</li>
<li>🔧 大厂分布式系统/数据中台实战专家</li>
<li>🏆 主导交易系统百万级流量调优 &amp; 车联网平台架构</li>
<li>🧠 AIGC应用开发先行者 | 区块链落地实践者</li>
<li>🌍 以技术驱动创新,我们的征途是改变世界!</li>
<li>👉 实战干货:编程严选网</li>
</ul>
<h2 id="1-添加依赖">1 添加依赖</h2>
<h3 id="11-jdk8">1.1 JDK8</h3>
<pre><code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;com.alibaba.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-starter-alibaba-sentinel&lt;/artifactId&gt;
    &lt;version&gt;2.2.10-RC1&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<blockquote>
<p>groupId也可为 org.springframework.cloud。</p>
</blockquote>
<p>涵盖依赖包:</p>
<h3 id="12-jdk21">1.2 JDK21</h3>
<p>我使用的 JDK23+SpringBoot3.4.1:</p>
<pre><code class="language-xml">&lt;!-- Sentinel 依赖--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.alibaba.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-starter-alibaba-sentinel&lt;/artifactId&gt;
    &lt;version&gt;2023.0.3.2&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<h2 id="2-暴露端点">2 暴露端点</h2>
<p>整合成功后,会暴露actuator/Sentinel端点,所以再添依赖:</p>
<pre><code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-actuator&lt;/artifactId&gt;
&lt;/dependency&gt;
</code></pre>
<p>还需配置才能暴露端点(默认不暴露):</p>
<pre><code class="language-yml">management:
endpoints:
    web:
      exposure:
      include: '*'
</code></pre>
<h2 id="3-配置文件">3 配置文件</h2>
<p>连接Sentinel控制台的地址信息配置</p>
<pre><code class="language-yml">spinrg:
cloud:
sentinel:
    transport:
      dashboard: localhost:8080
</code></pre>
<h2 id="4-sentinel-自定义限流响应与实时监控">4 Sentinel 自定义限流响应与实时监控</h2>
<h3 id="sentinel-自定义资源与限流规则">Sentinel 自定义资源与限流规则</h3>
<p>如针对接口限流:</p>
<pre><code class="language-java">@RestController
@RequestMapping("/pilot")
public class PilotController {

    @SentinelResource(value = "pilot_list",
                     blockHandler = "blockHandler")
    @GetMapping("/getList")
    public ResultBody list() {
      Map&lt;String, List&lt;Pilot&gt;&gt; pilotServiceList = pilotService.getList();
      return ResultBody.success(pilotServiceList);
    }

    // 限流降级方法
    public ResultBody blockHandler(BlockException e) {
      log.warn("触发限流", e);
      return ResultBody.error("服务繁忙,请稍后再试");
    }
}
</code></pre>
<p>value对应的资源名称:</p>
<p><img alt="" loading="lazy" src="https://img2024.cnblogs.com/other/1097393/202505/1097393-20250506105241545-1489897494.png" class="lazyload"></p>
<pre><code class="language-java">@Configuration
public class SentinelConfig implements BlockExceptionHandler {
   
    @PostConstruct
    private void initFlowRules() {
      List&lt;FlowRule&gt; rules = new ArrayList&lt;&gt;();
      
      // 创建流控规则
      FlowRule rule = new FlowRule();
      // 设置受保护的资源
      rule.setResource("pilot_list");
      // 设置流控规则 QPS
      rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
      // 设置受保护的资源阈值
      rule.setCount(1);
      rules.add(rule);
      
      // 加载规则
      FlowRuleManager.loadRules(rules);
    }

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

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, String resourceName, BlockException e) throws Exception {
      response.setStatus(429);
      response.getWriter().write("访问过于频繁,请稍后再试");
    }
}
</code></pre>
<p>限流效果:</p>
<p><img alt="" loading="lazy" src="https://p.ipic.vip/o69cp4.png" class="lazyload"></p>
<h2 id="注意">注意</h2>
<p>升级后,注意验证规则是否失效,避免版本差异bug。</p>
<p>参考:</p>
<ul>
<li>https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明</li>
</ul>
<blockquote>
<p>本文由博客一文多发平台 OpenWrite 发布!</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/JavaEdge/p/18861134
頁: [1]
查看完整版本: SpringBoot集成Sentinel实战:从依赖到自定义限流与监控