Spring Alibaba Sentinel实现集群限流demo

这篇具有很好参考价值的文章主要介绍了Spring Alibaba Sentinel实现集群限流demo。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.背景

1.什么是单机限流?

小伙伴们或许遇到过下图这样的限流配置

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

又或者是这样的Nacos动态配置限流规则:

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

 以上这些是什么限流?没错,就是单机限流,那么单机限流有什么弊端呢?

假设我们集群部署3台机器(NodeA/NodeB/NodeC),在某时刻,同时有25个请求进来,假设NodeA收到12个请求,NodeB 8个,NodeC 5个,并且每个单机限流qps=10,那么这个时候,NodeA将会触发限流,有两个请求BLOCK掉,这是由于可能发生的流量不均导致NodeA节点流量过高导致限流,这是因为每个机器都是自己管自己,有没有一种方法能够统筹调度呢?这就得提到集群限流了

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

 2.什么是集群限流

 集群限流就是,弄一台Token Server,每个客户端机器作为Token Client,有请求进来,Token Client就会向Token Server拿令牌,拿到令牌则不限流,反正则限流。其中Token Server可以作为独立运行的项目,也可以内嵌式内嵌至每个节点中(需将其中一台机器设置为Token Server,如果Token Server节点所在机器宕机,可以将其他Client节点设置成server,sentinel有相关api提供该操作)

例如上面的例子,集群内有3个节点,如果每个节点能承受10的请求,那么加起来就是3x10=30个请求。也就是说只要qps不超过30个请求都不会触发限流。

2.sentinel实现集群限流

1. 以spring-boot项目构建 sentinel-token-server

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion> 
	<groupId>com.lee.sentinel.tokenserver</groupId>
	<artifactId>sentinel-token-server</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>sentinel-token-server</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
		<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
	</properties>
	<dependencies>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
			<exclusions>
				<exclusion>
					<groupId>com.alibaba.spring</groupId>
					<artifactId>spring-context-support</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId> 
		</dependency>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		 
		<!--slf4j-->
		<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency> 
        
        <!--nacos配置中心-->
        <dependency>
			<groupId>com.alibaba.boot</groupId>
			<artifactId>nacos-config-spring-boot-starter</artifactId>
			<version>0.2.12</version>
			<!--由于jar包冲突,此处排除冲突jar,重新导入高版本jar-->
			<!--nacos-spring-context-1.1.1.jar需要比spring-context-support-1.0.8.jar更高版本的jar-->
			<exclusions>
				<exclusion>
					<groupId>com.alibaba.spring</groupId>
					<artifactId>spring-context-support</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		
		<!--重新引入jar包-->
		<dependency>
			<groupId>com.alibaba.spring</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>1.0.11</version>
		</dependency>
		
		<!--sentinel-cluster-->
		<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-cluster-server-default</artifactId>
            <version>1.8.5</version>
        </dependency> 
        <!--sentinel dashboard-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-transport-simple-http</artifactId>
            <version>1.8.5</version>
        </dependency>
        <!--sentinel dashboard -> nacos 配置动态感知-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.8.5</version>
        </dependency>
         
	</dependencies>

 	<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>
        </dependencies>
    </dependencyManagement>
    
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

application.properties

server.port=9009
#应用名称
spring.application.name=sentinel-token-server
#nacos config center
nacos.config.server-addr=192.168.1.105:8848

ClusterServer启动类


import java.util.HashSet;
import java.util.Set;

import com.alibaba.csp.sentinel.cluster.server.ClusterTokenServer;
import com.alibaba.csp.sentinel.cluster.server.SentinelDefaultTokenServer;
import com.alibaba.csp.sentinel.cluster.server.config.ClusterServerConfigManager;
import com.alibaba.csp.sentinel.cluster.server.config.ServerTransportConfig;

public class ClusterServer {
	 
	private static final int TOKEN_SERVER_PORT = 7777;
	private static final int IDLE_SECONDS = 600;
	
	public static void main(String[] args) throws Exception {
		ClusterTokenServer tokenServer = new SentinelDefaultTokenServer();
		ServerTransportConfig serverConfig = new ServerTransportConfig(TOKEN_SERVER_PORT, IDLE_SECONDS); 
		ClusterServerConfigManager.loadGlobalTransportConfig( serverConfig ); 
		 //可以设置多个namespace
		Set<String> namespaceSet = new HashSet<String>();
		namespaceSet.add("user-service"); //dataId=user-service-flow-rules
		ClusterServerConfigManager.loadServerNamespaceSet( namespaceSet ); 
		tokenServer.start();
	}
}

SpringBoot启动类:

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

 基于spring-boot SPI机制初始化限流规则:

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

ClusterTokenInitFunc:从

import java.util.List;

import com.alibaba.csp.sentinel.cluster.flow.rule.ClusterFlowRuleManager;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;

public class ClusterTokenInitFunc implements InitFunc {

	private String remoteAddress = "192.168.1.105:8848";// nacos配置中心地址
	private String groupId = "SENTINEL_GROUP";
	private String dataId_postfix = "-flow-rules";

	@Override
	public void init() throws Exception {
		// TODO Auto-generated method stub
		loadFlowRuleByNacos();
	}

	private void loadFlowRuleByNacos() {
		// TODO Auto-generated method stub
		// 从Nacos上获取配置进行加载
		ClusterFlowRuleManager.setPropertySupplier(namespace -> {
			// namespace在ClusterServer.java中已配置
			String dataId = namespace + dataId_postfix; // user-service-flow-rules、 coupon-service-flow-rules
			ReadableDataSource<String, List<FlowRule>> readableDataSource = new NacosDataSource<>(remoteAddress,
					groupId, dataId, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {
					}));
			return readableDataSource.getProperty();
		});
	}

}

其中,我的Nacos配置(dataId=user-service-flow-rules)设置如下:

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

[
    {
    "resource":"com.lee.demo.dubbo.demo.user.ISentinelService",
    "grade":1,
    "count":2,
    "clusterMode":true,
    "clusterConfig":{
        "flowId":"1001",
        "thresholdType":1,
        "fallbackToLocalWhenFail":true
    }
    },{
    "resource":"com.lee.demo.dubbo.demo.user.IHelloService",
    "grade":1,
    "count":30,
    "clusterMode":true,
    "clusterConfig":{
        "flowId":"1002",
        "thresholdType":1,
        "fallbackToLocalWhenFail":true
    }
    }
]

至此sentinel-token-server搭建完成,启动服务

2. 配置客户端Token Client

导包

        <!--nacos配置中心-->
        <dependency>
			<groupId>com.alibaba.boot</groupId>
			<artifactId>nacos-config-spring-boot-starter</artifactId>
			<version>0.2.12</version>
			<!--由于jar包冲突,此处排除冲突jar,重新导入高版本jar-->
			<!--nacos-spring-context-1.1.1.jar需要比spring-context-support-1.0.8.jar更高版本的jar-->
			<exclusions>
				<exclusion>
					<groupId>com.alibaba.spring</groupId>
					<artifactId>spring-context-support</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		
		<!--重新引入jar包-->
		<dependency>
			<groupId>com.alibaba.spring</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>1.0.11</version>
		</dependency>

        <!--sentinel-dubbo-adapter -->
        <dependency>
			 <groupId>com.alibaba.csp</groupId>
			 <artifactId>sentinel-apache-dubbo-adapter</artifactId>
			 <version>1.8.5</version>
		</dependency>
		<!--sentinel dashboard-->
		<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-transport-simple-http</artifactId>
            <version>1.8.5</version>
        </dependency>
        <!--sentinel dashboard -> nacos 配置动态感知-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.8.5</version>
        </dependency>
        <!--sentinel-token-cluster-->
		<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-cluster-client-default</artifactId>
            <version>1.8.5</version>
        </dependency> 

 加载集群流控规则:

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

 ClusterFlowRuleInitFunc.java

import java.util.List;

import com.alibaba.csp.sentinel.cluster.ClusterStateManager;
import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientAssignConfig;
import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientConfig;
import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientConfigManager;
import com.alibaba.csp.sentinel.datasource.Converter;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;

public class ClusterFlowRuleInitFunc implements InitFunc{

	private static final String CLUSTER_SERVER_HOST = "localhost";
	private static final int CLUSTER_SERVER_PORT = 7777;
	private static final int REQUEST_TIME_OUT = 20000;
	
	private static final String remoteAddress = "192.168.1.105:8848";
	private static final String groupId = "SENTINEL_GROUP";  
	private static final String FLOW_POSTFIX="-flow-rules";
    private static final String APP_NAME="user-service";
	
	@Override
	public void init() throws Exception {
		// TODO Auto-generated method stub
        //声明为Token Client
		ClusterStateManager.applyState(ClusterStateManager.CLUSTER_CLIENT);
		//加载集群限流Token Server 
		loadClusterClientConfig(); 
		//加载单机限流规则(如果Token Server不可用,退化到单机限流)
		initFlowRulesWithDatasource(); 
	}
	
	
	/**
	 * 集群限流规则
	 * */
	private void loadClusterClientConfig() {
		ClusterClientAssignConfig assignConfig  = new ClusterClientAssignConfig();
		assignConfig.setServerHost(CLUSTER_SERVER_HOST);
		assignConfig.setServerPort(CLUSTER_SERVER_PORT);
		ClusterClientConfigManager.applyNewAssignConfig(assignConfig);
		
		ClusterClientConfig clientConfig = new ClusterClientConfig();
		clientConfig.setRequestTimeout(REQUEST_TIME_OUT);
		ClusterClientConfigManager.applyNewConfig(clientConfig);
	}
	
	/**
	 * 单机限流规则
	 * */
	private void initFlowRulesWithDatasource() {  
		String dataId = APP_NAME + FLOW_POSTFIX;
//		ReadableDataSource<String, List<FlowRule>> readableDataSource = new NacosDataSource<>(
//				remoteAddress, groupId, dataId
//				,source->JSON.parseObject(source,new TypeReference<List<FlowRule>>() {}));
		ReadableDataSource<String, List<FlowRule>> readableDataSource = new NacosDataSource<>(
				remoteAddress, groupId, dataId, new Converter<String, List<FlowRule>>() { 
			@Override
			public List<FlowRule> convert(String source) {
				// TODO Auto-generated method stub
				System.out.println("source:"+source); 
				List<FlowRule> rules = JSON.parseObject(source,new TypeReference<List<FlowRule>>() {}); 
				return rules;
			}
		});    
		FlowRuleManager.register2Property(readableDataSource.getProperty());
	} 
	
}

Controller:

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

至此,Token Client配置完成。

接下来启动3个客户端,模拟集群:

 Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

 Sentinel-Dashboard上可以看到user-service有三台集群机器:

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

使用jmeter压测工具进行压测:

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

 压测结果如下,可以看到com.lee.demo.dubbo.demo.user.ISentinelService.testSentinel() 接口的qps一直不会超过6个请求,这个峰值是怎么计算的来的呢?因为我上面提到的Nacos集群限流配置dataId=user-service-flow-rules中配置com.lee.demo.dubbo.demo.user.ISentinelService的qps=2,而我们总共有3台机器,因此集群限流max qps:2x3=6

Spring Alibaba Sentinel实现集群限流demo,sentinel,sentinel集群限流,集群限流

 至此,sentinel上线集群限流demo已完成,如有疑问请在评论区评论。文章来源地址https://www.toymoban.com/news/detail-606483.html

到了这里,关于Spring Alibaba Sentinel实现集群限流demo的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringCloud-Alibaba之Sentinel熔断与限流

    一、下载安装运行 http://localhost:8080进行访问 登录账号和密码均为sentinel 二、创建工程,并注册到nacos服务中心 依赖spring-cloud-starter-alibaba-nacos-discovery,spring-cloud-starter-alibaba-sentinel sentine-datasource-nacos (持久化) 配置文件 启动类 业务类 三、启动sentinel java -jar sentinel-dashboard-1.7.0

    2024年02月16日
    浏览(44)
  • SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

    目录 一、Sentinel 与 Gateway 的限流有什么差别? 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1)固定窗口计数器算法 2)滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 1.1.1、Tips 限流, 就是指对服务器请求量做限制,避免因为突发的

    2024年01月25日
    浏览(49)
  • 【SpringCloud】11、Spring Cloud Gateway使用Sentinel实现服务限流

    1、关于 Sentinel Sentinel 是阿里巴巴开源的一个流量防卫防护组件,可以为微服务架构提供强大的流量防卫能力,包括流量控制、熔断降级等功能。Spring Cloud Gateway 与 Sentinel 结合,可以实现强大的限流功能。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近

    2024年02月01日
    浏览(57)
  • SpringCloud Alibaba Demo(Nacos,OpenFeign,Gatway,Sentinel)

    ma/springcloud-alibaba-demo 参考:https://www.cnblogs.com/zys2019/p/12682628.html SpringBoot、SpringCloud 、SpringCloud Alibaba 以及各种组件存在版本对应关系。可参考下面 版本对应 启动nacos.   ./startup.cmd -m standalone  登陆nacos官方 localhost:8848   nacos/nacos 创建父工程spring-cloud-alibaba pom.xml如下: Naco

    2024年02月06日
    浏览(42)
  • Spring Cloud Alibaba 之 Sentinel

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Spring Cloud Netflix 之 Hystrix 第九章 代码管理gitlab 使用 第十章 Spr

    2024年02月05日
    浏览(40)
  • 【Spring Cloud Alibaba】Sentinel运行原理

    本文基于sentinel-1.8.0版本 Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 sentinel整体设计的很精巧,只需要一个sentinel-core便可以运行,它提供了诸如

    2024年02月15日
    浏览(43)
  • Spring Cloud Gateway集成sentinel进行网关限流

    本文使用版本如下:

    2024年02月09日
    浏览(50)
  • Spring Cloud Alibaba-Sentinel规则

    流量控制,其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标,当达到指定的阈值时 对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。 第1步: 点击簇点链路,我们就可以看到访问过的接口地址,然后点击对应的流控按钮,进入流控规则

    2024年02月10日
    浏览(43)
  • 【Spring Cloud】Sentinel流量限流和熔断降级的讲解

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的加入,一起

    2024年01月23日
    浏览(47)
  • 【Spring Cloud Alibaba】Sentinel 服务熔断与流量控制

    目录 前言 一、Sentinel 入门 1.1 什么是 Sentinel ? 1.2 微服务集成 Sentinel  1.3 安装Sentinel控制台 二、Jmeter 压力测试工具 2.1 Jmeter 介绍  2.2 Jmeter 安装 2.3 接口测试 三、Sentinel 使用 3.1 限流规则 3.1.1 warm up(预热模式) 3.1.2 排队等待 3.1.3 关联 3.1.4 链路 3.2 熔断规则 3.3 服务降级     

    2024年02月01日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包