首页 > 技术文章 > Dubbo(六)限流之accepts参数

ralgo 2020-11-15 10:21 原文

示例代码在:https://github.com/ralgond/dubbo-example/releases/tag/v0.0.6

accepts隶属于dubbo:protocol标签,官方文档对其的定义是:“服务提供方最大可接受连接数”。

我们修改下示例代码,首先修改dubbo-example-provider的provider.xml的dubbo:protocol标签如下:

<dubbo:protocol name="dubbo" port="20880" accepts="1"/>

启动com.github.ralgond.de.provider.ApiProvider2,等待Console打印出“server started.”。

修改dubbo-example-consumer的consumer.xml成如下:

<dubbo:reference id="greetingService" interface="com.github.ralgond.de.sdk.GreetingService" group="dubbo" version="0.0.1"
    	timeout="30000" connections="1" check="false"/>

快速地启动项目dubbo-example-consumer的com.github.ralgond.de.consumer.ApiSleepConsumer两次,等待结果。

我们可以看到第一个ApiSleepConsumer是执行成功的。而第二个ApiSleepConsumer则执行失败,它的Console则打印出如下信息:

Exception in thread "main" org.apache.dubbo.rpc.RpcException: Failed to invoke the method sleepMs in the service com.github.ralgond.de.sdk.GreetingService. Tried 3 times of the providers [192.168.0.105:20880] (1/1) from the registry 127.0.0.1:2181 on the consumer 192.168.0.105 using the dubbo version 2.7.1. Last error is: Failed to invoke remote method: sleepMs, provider: dubbo://192.168.0.105:20880/com.github.ralgond.de.sdk.GreetingService?accepts=1&anyhost=true&application=consumer-of-helloworld-app&bean.name=com.github.ralgond.de.sdk.GreetingService&check=false&connections=1&default.deprecated=false&default.dynamic=false&default.lazy=false&default.register=true&default.sticky=false&deprecated=false&dubbo=2.0.2&dynamic=false&generic=false&group=dubbo&interface=com.github.ralgond.de.sdk.GreetingService&lazy=false&methods=sayHello,throwRuntimeException,sleepMs&pid=1552&register=true&register.ip=192.168.0.105&release=2.7.1&remote.application=first-dubbo-provider&remote.timestamp=1605405841820&revision=0.0.1&side=consumer&sticky=false&timeout=30000&timestamp=1605406027347&version=0.0.1, cause: message can not send, because channel is closed . url:dubbo://192.168.0.105:20880/com.github.ralgond.de.sdk.GreetingService?accepts=1&anyhost=true&application=consumer-of-helloworld-app&bean.name=com.github.ralgond.de.sdk.GreetingService&check=false&codec=dubbo&connections=1&default.deprecated=false&default.dynamic=false&default.lazy=false&default.register=true&default.sticky=false&deprecated=false&dubbo=2.0.2&dynamic=false&generic=false&group=dubbo&heartbeat=60000&interface=com.github.ralgond.de.sdk.GreetingService&lazy=false&methods=sayHello,throwRuntimeException,sleepMs&pid=1552&register=true&register.ip=192.168.0.105&release=2.7.1&remote.application=first-dubbo-provider&remote.timestamp=1605405841820&revision=0.0.1&side=consumer&sticky=false&timeout=30000&timestamp=1605406027347&version=0.0.1
	at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:111)
	at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:242)
	at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:76)
	at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:57)
	at org.apache.dubbo.common.bytecode.proxy0.sleepMs(proxy0.java)
	at com.github.ralgond.de.consumer.ApiSleepConsumer.main(ApiSleepConsumer.java:15)
Caused by: org.apache.dubbo.remoting.RemotingException: message can not send, because channel is closed . url:dubbo://192.168.0.105:20880/com.github.ralgond.de.sdk.GreetingService?accepts=1&anyhost=true&application=consumer-of-helloworld-app&bean.name=com.github.ralgond.de.sdk.GreetingService&check=false&codec=dubbo&connections=1&default.deprecated=false&default.dynamic=false&default.lazy=false&default.register=true&default.sticky=false&deprecated=false&dubbo=2.0.2&dynamic=false&generic=false&group=dubbo&heartbeat=60000&interface=com.github.ralgond.de.sdk.GreetingService&lazy=false&methods=sayHello,throwRuntimeException,sleepMs&pid=1552&register=true&register.ip=192.168.0.105&release=2.7.1&remote.application=first-dubbo-provider&remote.timestamp=1605405841820&revision=0.0.1&side=consumer&sticky=false&timeout=30000&timestamp=1605406027347&version=0.0.1
	at org.apache.dubbo.remoting.transport.AbstractClient.send(AbstractClient.java:171)
	at org.apache.dubbo.remoting.transport.AbstractPeer.send(AbstractPeer.java:53)
	at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeChannel.request(HeaderExchangeChannel.java:116)
	at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeClient.request(HeaderExchangeClient.java:81)
	at org.apache.dubbo.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:108)
	at org.apache.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:157)
	at org.apache.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:78)
	at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:88)
	at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:73)
	at org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:49)
	at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:73)
	at org.apache.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:54)
	at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:73)
	at org.apache.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56)
	at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:80)
	... 5 more

我们看到异常的原因是:“message can not send, because channel is closed.”,可以看出当连接数超过accepts参数所指定的值时,服务端会主动关闭超出的部分连接。

推荐阅读