dubbo超时时间设置?dubbo接口超时时间设置

牵着乌龟去散步 学知识 2 0

大家好,关于dubbo超时时间设置很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于dubbo接口超时时间设置的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文目录

  1. 如何获取dubbo上注册的referencebean
  2. dubbo线程池满了会超时吗
  3. Dubbo之限流分析
  4. dubbo超时时间设置过大有什么影响

一、如何获取dubbo上注册的referencebean

SimpleRegistryService本身也是作为一个dubbo服务暴露。

<dubbo:protocolport="9090"/>

<dubbo:service interface="com.alibaba.dubbo.registry.RegistryService"ref="registryService" registry="N/A" ondisconnect="disconnect"callbacks="1000">

<dubbo:methodname="subscribe"><dubbo:argument index="1" callback="true"/></dubbo:method>

<dubbo:methodname="unsubscribe"><dubbo:argument index="1" callback="false"/></dubbo:method>

<bean id="registryService"class="3242-8c79-9610-7547 com.alibaba.dubbo.registry. *** .SimpleRegistryService"/>

上面是暴露注册中心的dubbo服务配置,

发布RegistryService服务, registry属 *** 是”N/A” *** 不能获取注册中心,注册中心服务的发布也是一个普通的dubbo服务的发布,如果没有配置这个属 *** 它也会寻找注册中心,去通过注册中心发布,因为自己本身就是注册中心,直接对外发布服务,外部通过ip:port直接使用。

服务发布定义了回调接口,这里定义了subscribe的第二个入参类暴露的回调服务供注册中心回调,用来当注册的服务状态变更时反向推送到客户端。

Dubbo协议的注册中心的暴露以及调用过程过程跟普通的dubbo服务的其实是一样的,可能跟绝大多数服务的不同的是在SimpleRegistryService在被接收订阅请求subscribe的时候,同时会refer引用调用方暴露的NotifyListener服务,当有注册数据变更时自动推送

Dubbo协议向注册中心发布服务:当服务提供方,向dubbo协议的注册中心发布服务的时候,是如何获取,创建注册中心的,如何注册以及订阅服务的,下面我们来分析其流程。

<dubbo:registry protocol=”dubbo” address="127.0.0.1:9090"/>

<beanid="demoService" class="8c79-9610-7547-caea com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>

<dubbo:serviceinterface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>

1.指定了哪种的注册中心,是基于dubbo协议的,指定了注册中心的 *** 以及端口号

2.发布DemoService服务,服务的实现为DemoServiceImpl

每个<dubbo:service/>在spring内部都会生成一个ServiceBean实例,ServiceBean的实例化过程中调用export *** 来暴露服务

1.通过loadRegistries获取注册中心registryUrls

registry://127.0.0.1:9090/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.5.4-SNAPSHOT&owner=william&pid=7084®istry=dubbo×tamp=1415711791506

protocol=registry表示一个注册中心 *** l

调用注册中心的服务RegistryService

dubbo://1 *** .168.0.102:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=7084&side=provider×tamp=1415712331601

服务提供者的 *** 为1 *** .168.0.102:20880

发布的服务为com.alibaba.dubbo.demo.DemoService

3.遍历registryUrls向注册中心注册服务

给每个registryUrl添加属 *** key为export,value为上面的发布服务 *** l得到如下registryUrl

registry://127.0.0.1:9098/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.5.4-SNAPSHOT&export=dubbo%3A%2F%2F1 *** .168.0.102%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.5.4-SNAPSHOT%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26loadbalance%3Droundrobin%26methods%3DsayHello%26owner%3Dwilliam%26pid%3D7084%26side%3Dprovider%26timestamp%3D1415712331601&owner=william&pid=7084®istry=dubbo×tamp=1415711791506

4.由发布的服务实例,服务接口以及registryUrl为参数,通过 *** 工厂proxyFactory获取Invoker对象,Invoker对象是dubbo的核心模型,其他对象都向它靠拢或者转换成它。

5.通过Protocol对象暴露服务protocol.export(invoker)

通过DubboProtocol暴露服务的 *** (不是此节内容)

通过RegistryProtocol将服务 *** 发布到注册中心,并订阅此服务

RegistryProtocol.export(Invoker)暴露服务

1.调DubboProtocol暴露服务的 ***

2.获取注册中心getRegistry(Invoker)

URL转换,由Invoker获取的 *** l是registryURL它的协议属 *** 用来选择何种的Protocol实例如RegistryProtocol, DubboProtocol或者RedisProtocol等等。这里要通过URL去选择何种注册中心,所以根据registry=dubbo属 *** ,重新设置 *** l的协议属 *** 得registryUrl

dubbo://127.0.0.1:9098/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.5.4-SNAPSHOT& export=dubbo%3A%2F%2F1 *** .168.0.102%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.5.4-SNAPSHOT%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26loadbalance%3Droundrobin%26methods%3DsayHello%26owner%3Dwilliam%26pid%3D5040%26side%3Dprovider%26timestamp%3D1415715706560&owner=william&pid=5040×tamp=1415715706529

dubbo超时时间设置?dubbo接口超时时间设置-第1张图片-

RegistryFactory.getRegistry( *** l)通过工厂类创建注册中心,RegistryFactory通过dubbo的spi机制获取对应的工厂类,这里的是基于dubbo协议的注册中心,所以是DubboRegistryFactory

3.获取发布 *** l就是registryUrl的export参数的值

registryProviderUrl=dubbo://10.33.37.7:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=6976&side=provider×tamp=1415846958825

4. DubboRegistry.register(registryProviderUrl)

这里注意registryProviderUrl的并没有设置category属 *** ,在注册中心UrlUtils.i *** atch(conuumerUrl, providerUrl)比较的时候,providerUrl的category属 *** 取默认值providers,

这点消费者订阅的时候会指定订阅的 *** l的category=providers,去判断有没有注册的提供者。

5.构建订阅服务overrideProviderUrl,我们是发布服务

provider://10.33.37.7:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&category=config *** ators&check=false&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid= *** 32&side=provider×tamp=1415847417663

6.构建OverrideListener它实现与NotifyLisener,当注册中心的订阅的 *** l发生变化时回调重新export

7. registry.subscribe(overrideProviderUrl, OverrideListener),注册器向注册中心订阅overrideProviderUrl,同时将Override Listener暴露为回调服务,当注册中心的overrideProviderUrl数据发生变化时回调,

注册器DubboRegistry的registry,subscribe, unRegistry, unSubscribe都类似,是一个dubbo的远程服务调用

DubboRegistryFactory创建注册中心过程

dubbo://127.0.0.1:9098/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&callbacks=10000&connect.timeout=10000&dubbo=2.5.4-SNAPSHOT& interface=com.alibaba.dubbo.registry.RegistryService&lazy=true&methods=register,subscribe,unregister,unsubscribe,lookup&owner=william&pid=84 *** &reconnect=false&sticky=true&subscribe.1.callback=true&timeout=10000×tamp=1415783872554&unsubscribe.1.callback=false

2.根据 *** l注册服务接口构建注册目录对象RegistryDircectory,实现了NotiyfLisener,这里NotiyfLisener实现主要是根据 *** ls去refer引用远程服务RegistryService得到对应的Invoker,当 *** ls变化时重新refer;目录服务可以列出所有可以执行的Invoker

3.利用cluster的join *** ,将Dirctory的多个Invoker对象伪装成一个Invoker对象,这里默认集群策略得到FailoverClusterInvoker

4. FailoverClusterInvoker利用ProxyFactory获取到RegistryService服务的 *** 对象

5.由RegistryService服务的 *** 对象和FailoverClusterInvoker构建dubbo协议的注册中心注册器DubboRegistry

6. RegistryDircectory设置注册器DubboRegistry,设置dubbo的协议

7.调用 RegistryDircectory的notify( *** ls) ***

主要是根据registryUrls,引用各个注册中心的RegistryService服务实现,将引用的服务按key=menthodName/value=invoker缓存起来,目录服务Directory.list(Invocation)会列出所调用 *** 的所有Invoker,一个Invoker *** 对一个注册中心的调用实体。

8.订阅注册中心服务,服务的提供者调注册中心的服务RegistryService属于消费方,所以订阅服务的 *** l的协议是consumer

consumer://1 *** .168.0.102/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&callbacks=10000&connect.timeout=10000&dubbo=2.5.4-SNAPSHOT&interface=com.alibaba.dubbo.registry.RegistryService&lazy=true&methods=register,subscribe,unregister,unsubscribe,lookup&owner=william&pid=6960&reconnect=false&sticky=true&subscribe.1.callback=true&timeout=10000×tamp=14158007 *** 3 *** & unsubscribe.1.callback=false

订阅的目的在于在注册中心的数据发送变化的时候反向推送给订阅方

directory.subscribe( *** l)最终调用注册中心的RegsryService远程服务,它是一个普通的dubbo远程调用。要说跟绝大多数dubbo远程调用的区别: *** l的参数subscribe.1.callback=true它的意思是RegistryService的subscribe *** 的第二个参数NotifyListener暴露为回调服务; *** l的参数 unsubscribe.1.callback=false的意思是RegistryService的 unsubscribe *** 的第二个参数NotifyListener暴露的回调服务销毁。

这里dubbo协议的注册中心调注册中心的服务采用的默认集群调用策略是FailOver,选择一台注册中心,只有当失败的时候才重试其他服务器,注册中心实现也比较简单不具备集群功能,如果想要初步的集群功能可以选用BroadcastCluster它至少向每个注册中心遍历调用注册一遍

二、dubbo线程池满了会超时吗

1、在dubbo调用过程中被调用方有两个线程池:io线程池,业务线程池。

2、<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100"/>

3、all所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。

4、direct所有消息都不派发到线程池,全部在 IO线程上直接执行。

5、message只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在 IO线程上执行。

6、execution只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO线程上执行。

7、connection在 IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。

三、Dubbo之限流分析

1、在前面的一篇中分析了Dubbo是如何降级的,除了降级,有时限流也是一种很有效的解决高并发的 *** 能问题,那在本篇中开始分析Dubbo是如何限流的。我们知道限流主要是通过控制连接数来实现的,防止某一片段内请求处理过大,导致重要服务的失效。

2、 *** 当前提供者在使用dubbo协议最多接受10个消费者链接

3、 *** com.foo.BarService的每个 *** ,服务端并发执行(或占用线程池线程数)不能超过10个:

4、 *** com.foo.BarService的 sayHello *** ,服务器并发执行(或占用线程池线程数)不能超过10个。

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

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

7、长连接:表示当前的长连接最多可以处理的请求个数。与长连接的数量没有问题。

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

9、可以设置在提供端,也可以设置在消费者端。限定连接的个数。对于短连接,和actives相同。但对于长连接,表示长连接的个数。

10、一般情况下,会使connections与actives联用,让connections *** 长连接的个数,让actives *** 长连接中可以处理的请求个数。

11、 *** 客户端服务使用连接不能超过10个

12、如果<dubbo:service>和<dubbo:reference>都配置了connections,<dubbo:reference>优先。

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

14、我们已经讲解了如何设置控制链接数的,那么它们底层是如何实现的呢?

15、实际上上面的逻辑都是一个个Filter,所有的Filter会连接成一个过滤器链,每次请求都会经过整个链路中的每一个Filter。那它是在什么时候构造成一个过滤器链的呢。

16、在服务暴露的时候会调用 buildInvokerChain,将真正执行的 invoker放到过滤链的尾部,再执行 protocol.expert(buildInvokerChain(invoker,...)) *** 来进行服务暴露。

17、在服务引用的时候会调用 protocol.refer() *** 先生成 Invoker,再调用 buildInvokerChain(protocol.refer(type, *** l),...)来生成消费类型的调用链。

18、它用于 *** 每个服务中每个 *** 的更大并发数,有接口级别和 *** 级别的配置方式。

19、其基本原理:在框架中使用一个Conc *** rentMap缓存了并发数的计数器,为每个请求URL生成一个IdentityString,并以此为key;再将每个IdentityString生成一个RpcStatus对象,将此作为value。RpcStatus对象用于记录对应的并发数。在调用开始之前,会通过URL获得RpcStatus对象,把对象中的并发数计数器原子+1,在finally中再将原子减1。只要在计数器+1的时候,发现当前计数器比设置的并发数大时,就会抛出异常。

20、 TpsLimitFilter的限流是基于令牌的,即一段时间内只分配N个令牌,每次请求都会消耗一个令牌,耗完为止,后面再来的请求都会被拒绝。

21、具体的逻辑是在 DefaultTPSLimiter#isAllowable,会用这个 *** 判断是否触发限流。

22、在DefaultTPSLimiter内部用一个Conc *** rentHashMap缓存每个接口的令牌数,key是interface+group+version,value是一个StatItem对象,它包装了令牌刷新时间间隔、每次发放的令牌数等。首先判断当前时间减去上次发放令牌的时间是否超过了时间间隔,超过了就重新发放令牌,之前剩余的令牌会被直接覆盖掉。然后,通过CAS的方式减去1令牌,减掉后小于0就会触发限流。

23、和服务提供者的 ExecuteLimitFilter相似,它是消费者端的过滤器, *** 的是客户端的并发量。

24、但是它与 ExecuteLimitFilter有所不同,它不会直接抛出异常。而是当到达阈值的时候,会先加锁抢占当前接口的RpcStatus对象,然后通过wait *** 进行等待,等待是有时间的,因为请求是有 timeout属 *** 的。然后如果某个Invoker在调用结束后,并发把计数器减-1并触发一个notify,此时会有一个在wait状态的线程被唤醒并继续执行,判断现在是否超时,如果超时则抛出异常。如果当前并发数仍然超出阈值,则继续执行wait *** ;如果没有超出阈值在,则跳出循环,CAS+1,并调用invoke *** ,调用结束后CAS-1,最后通过notify唤醒另外一个线程。

25、 Dubbo之限流TpsLimitFilter源码分析

26、 Dubbo源码分析----过滤器之ActiveLimitFilter

四、dubbo超时时间设置过大有什么影响

客户端资源大量线程挂起。Dubbo是一个分布式服务框架,致力于提供高 *** 能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,如果超时时间设置得太短,复杂业务本来就需要很长时间完成,服务端无法在设定的超时时间内完成业务处理,如果超时时间设置太大,会由于服务端或者 *** 问题导致客户端资源大量线程挂起。需要严格把控时间。

关于dubbo超时时间设置和dubbo接口超时时间设置的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签: 超时 设置 时间 dubbo 接口

抱歉,评论功能暂时关闭!