SpringCloudAlibabaSentinel-Sentinel单机限流-《Java笔记》

admin 2025-10-19 06:01:28 编程 来源:ZONE.CI 全球网 0 阅读模式

Java SpringBoot

创建 SpringBoot 服务

首先创建一个 SpringBoot 服务,在 pom.xml 文件中增加下面的配置

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.alibaba.csp</groupId>
  7. <artifactId>sentinel-core</artifactId>
  8. <version>1.8.4</version>
  9. </dependency>

然后提供一个对外的 http 接口,通过访问接口来触发限流代码,接口代码如下代码如下:

  1. package com.example.demo.controller;
  2. import com.alibaba.csp.sentinel.SphO;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. /**
  6. * <br>
  7. * <b>Function:</b><br>
  8. * <b>Author:</b>@author Fcant<br>
  9. * <b>Date:</b>2022-05-08 12:56<br>
  10. * <b>Desc:</b>无<br>
  11. */
  12. @RestController
  13. public class LoginController {
  14. @GetMapping(value = "/login")
  15. public void login(String username, String password) {
  16. System.out.println("login");
  17. //模拟一百万条消息
  18. for (int i = 0; i < 1000000; i++) {
  19. boolean entry = false;
  20. try {
  21. entry = SphO.entry("HelloWorld");
  22. while (!entry) {
  23. try {
  24. Thread.sleep(50);
  25. System.out.println("entry false");
  26. entry = SphO.entry("HelloWorld");
  27. } catch (InterruptedException e) {
  28. }
  29. }
  30. System.out.println("entry true");
  31. } catch (Exception e) {
  32. } finally {
  33. if (entry) {
  34. SphO.exit();
  35. }
  36. }
  37. }
  38. }
  39. }

调用接口过后,通过循环一百万次来模拟大流量,这里要解释以下几个内容

  1. SphO.entry("HelloWorld"):是 Sentinel 的资源控制器,”HelloWord” 是资源的名称,资源 是 sentinel 的一个很重要的概念,所有的限流都是针对资源的操作;SphO.entry() 返回值是布尔值,为 true 表示资源可用,没有被限流,为 false 表示资源被限流;
  2. 这里模拟在被限流了过后,程序等待一段时间,再去判断是否限流,只有在资源未被限流的时候,才能继续处理;
  3. finally 里面需要进行 SphO.exit(); 操作,当被限流了以后,也就是SphO.entry() == true 后一定要执行 SphO.exit(); 否则代码会创建多个Entry 对象,程序运行时间长了过后会导致内存泄露,引发 FullGC。

这个时候启动一个服务,调用一下接口,可以看到效果如下,很快就会运行完,并没有达到限流的效果,那是因为此刻还没有配置限流规则,所以没有触发到限流的逻辑。Sentinel单机限流 - 图1

配置 sentinel 控制台

接下来安装一下 sentinel 的控制台,通过控制台来配置限流规则,从而达到限流的目的,控制台的搭建很简单,通过官方地址下载指定版本的 jar 然后本地运行即可。通过地址 https://github.com/alibaba/Sentinel/releases/download/1.8.4/sentinel-dashboard-1.8.4.jar 进行下载。然后通过命令java -Dserver.port=8081 -Dcsp.sentinel.dashboard.server=localhost:8081 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.4.jar 运行即可,如下所示Sentinel单机限流 - 图2这里通过指定 8081 端口,用于访问 sentinel,启动成功过后,通过浏览器可以进行登录,默认的初始账号和密码都是 sentinel。Sentinel单机限流 - 图3因为上面的命令指定了 sentinel-dashboard 项目,所以默认只会看到 sentinel-dashboard 这个项目,这个时候需要,修改代码,在 pom.xml 中增加下面的配置

  1. <dependency>
  2. <groupId>com.alibaba.csp</groupId>
  3. <artifactId>sentinel-transport-simple-http</artifactId>
  4. <version>1.8.4</version>
  5. </dependency>

然后在 JVM 的启动参数中增加-Dcsp.sentinel.dashboard.server=localhost:8081 指明 sentinel 的地址和端口号,再启动应用。启动完过后,要手动调用一下接口,然后就可以看到程序项目连接到 sentinel 了。不过此时只是程序和 sentinel 连接成功,还没有限流规则,接下来要配置一下限流规则。Sentinel单机限流 - 图4按照上图配置好了过后,再调用一次接口,可以看到此时处理速度明显慢了下来,每秒只有 20 个 QPS 能获取资源了,至此基于 sentinel 的单机限流QPS 20 的目标完成。Sentinel单机限流 - 图5

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  8