分布式RPC系统框架Dubbo-13服务限流

        为了防止某个消费者的QPS或是所有消费者的QPS总和突然飙升而导致的重要服务的失效,系统可以对访问流量进行控制,这种对集群的保护措施称为服务限流; Dubbo中能够实现服务限流的方式较多,可以划分为两类:直接限流与间接限流;

  • 直接限流:通过对连接数量直接进行限制来达到限流的目的;

  • 间接限流:通过一些非连接数量设置来达到限制流量的目的;

1 直接限流

        创建一个简单的dubbo生产消费环境,可以通过https://blog.csdn.net/zxylwj/article/details/108542567中的项目进行设置;

(1) executes限流

        该属性仅能设置在提供者端;可以设置为接口级别,也可以设置为方法级别,限制的是服务(方法)并发执行数量;

<!-- 暴露服务:executes限流-->
	<dubbo:service interface="com.zxy.service.SomeService" ref="someService" executes="3"/>

(2) accepts限流

        该属性仅可设置在提供者端的dubbo:provider/与dubbo:protocol/,用于对指定协议的连接数量进行限制。

<!-- 限制当前提供者在使用dubbo协议时最多接受10个消费者连接 -->
	<dubbo:protocol name="dubbo" port="20880" accepts="10"/>

<!-- 限制当前提供者在使用dubbo协议时最多接受1个消费者连接 -->
	<dubbo:provider protocol="dubbo" accepts="10"/>

(3) actives限流

        该限流方式与前两种不同的是,其可以设置在提供者端,也可以设置在消费者端,可以设置为接口级别,也可以设置为方法级别。

A、提供者端限流

        根据消费者与提供者间建立的连接类型的不同,其意义也不同:

  • 长连接:表示当前长连接最多可以处理的请求个数。与长连接的数量没有关系。

  • 短连接:表示当前服务可以同时处理的短连接数量。

<!-- 暴露服务:actives限流 服务级别-->
	<dubbo:service interface="com.zxy.service.SomeService" ref="someService" actives="3"/>
	
	<!-- 暴露服务:actives限流 方法级别
	<dubbo:service interface="com.zxy.service.SomeService" ref="someService"> 
		<dubbo:method name="helloDubbo" actives="3"/>
	</dubbo:service>-->

B、消费者端限流 根据消费者与提供者间建立的连接类型的不同,其意义也不同:

  • 长连接:表示当前消费者所发出的长连接中最多可以提交的请求个数,与长连接的数量没有关系。

  • 短连接:表示当前消费者可以提交的短连接数量。

<!-- 服务消费者端  actives限流  服务级别-->
	<dubbo:reference id="someService" check="false" actives="2"
					 interface="com.zxy.service.SomeService"/>	
					 
	<!-- 服务消费者端  actives限流  方法级别
	<dubbo:reference id="someService" check="false"
					 interface="com.zxy.service.SomeService">	
		<dubbo:method name="helloDubbo" actives="2"/>
	</dubbo:reference>	-->

(4) connections限流

        可以设置在提供者端,也可以设置在消费者端,限定连接的个数,对于短连接,该属性效果与actives相同,但对于长连接,其限制的是长连接的个数; 一般情况下,会使connectons与actives联用,让connections限制长连接个数,让actives限制一个长连接中可以处理的请求个数,注意联用前提,使用默认的Dubbo服务暴露协议。

A、提供者端限流

<!-- 暴露服务:connections限流:限制当前接口中每个方法的并发连接数不能超出3个 服务级别-->
	<dubbo:service interface="com.zxy.service.SomeService" ref="someService" connections="3"/>
	
	<!-- 暴露服务:connections限流:限制当前接口中helloDubbo()方法的并发连接数不能超出3个 方法级别
	<dubbo:service interface="com.zxy.service.SomeService" ref="someService"> 
		<dubbo:method name="helloDubbo" connections="3"/>
	</dubbo:service>-->

B、消费者端限流

<!-- 服务消费者端  connections限流:设置当前消费者对指定接口的每一个方法发出的请求连接数不能超出2个  服务级别-->
	<dubbo:reference id="someService" check="false" connections="2"
					 interface="com.zxy.service.SomeService"/>	
					 
	<!-- 服务消费者端  connections限流:设置当前消费者对指定接口的helloDubbo()方法发出的连接数不能超过2个  方法级别
	<dubbo:reference id="someService" check="false"
					 interface="com.zxy.service.SomeService">	
		<dubbo:method name="helloDubbo" connections="2"/>
	</dubbo:reference>	-->	

2 间接限流

(1) 延迟连接

        仅可设置在消费者端,且不能设置为方法级别,仅作用于Dubbo服务暴露协议,将长连接的建立推迟到消费者真正调用提供者时,可以减少长连接的数量。

<!--设置当前消费者对指定接口发出的每一个连接请求均采用延迟连接(即调用时连接)-->
	<dubbo:reference id="someService" check="false" lazy="true"
					 interface="com.zxy.service.SomeService"/>

(2) 粘连连接

        仅能设置在消费者端,其可以设置为接口级别,也可以设置为方法级别,仅作用于Dubbo服务暴露协议; 其会使客户端尽量向同一个提供者发起调用,除非该提供者宕机,其会连接其他服务,只要启用了粘连连接,其就会自动启用延迟连接;此设置限制的是流向,而非流量

<!--设置当前消费者对指定接口的每一个方法均开启粘连连接-->
	<dubbo:reference id="someService" check="false" sticky="true"
					 interface="com.zxy.service.SomeService"/>	
					 
	<!-- 设置当前消费者对指定接口的helloDubbo()方法开启粘连连接
	<dubbo:reference id="someService" check="false"
					 interface="com.zxy.service.SomeService">	
		<dubbo:method name="helloDubbo" connections="2"/>
	</dubbo:reference>	-->	

(3) 负载均衡

        可以设置在消费者端,亦可设置在提供者端;可以设置在接口级别,亦可设置在方法级别,其限制的是流向,而非流量。

<!-- 通过指定负载均衡策略为leastactive(最少活跃策略)来达到限流的目的-->
	<dubbo:service interface="com.zxy.service.SomeService" 
			ref="someService" loadbalance="leastacitve"/>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值