参考dubbo用户手册,方法调用的默认超时时间为1s,但是具体的超时时间受限于服务端方法性能、服务端个数、客户端的并发数等因素,所以超时时间需要根据不同的场景进行调试。
基本步骤为:
- 测试服务端的TPS,单位为 任务数或线程个数/S,即每秒能够处理的任务数。TPS能够表示出每秒能够处理的任务个数。
- 根据客户端的并发量要求和服务端的服务能力设置超时时间。例如客户端并发量为R,单个服务端的服务能力为T,服务端的个数为N,那么超时时间 = R/(T*N) 。
具体调试步骤参考如下:
-
使用多线程机制测试服务端接口的TPS。我使用单元测试进行的测试,UserTestInstance可以用作中使用的XXXService可以使用dubbo接口的服务注入,也可以注入服务端的服务。
package tps; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import tps.support.DubboFutureTask; import tps.support.DubboThread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by admin on 2015-12-27. */ public class UserTestInstance { @Autowired private XXXService xxxService ; private static int num = 500 ; //默认使用和线程个数相同的线程池,避免线程等待的时间 private ExecutorService executorService = Executors.newFixedThreadPool(num); //存储线程任务 private List<DubboFutureTask> futureTasks = new ArrayList<>(num) ; private long startTime ; @Before public void startTime(){ System.out.println() ; System.out.println("初始化调用线程。"); for (int i=0 ; i<num ; i++){ DubboThread dubboThread = new DubboThread() ; dubboThread.setXXXService(xxxService) ; dubboThread.setName("thread->"+(i+1)); //创建异步任务 DubboFutureTask futureTask = new DubboFutureTask(dubboThread) ; futureTasks.add(futureTask) ; } //创建完任务之后,开始计时 startTime = System.currentTimeMillis() ; } @After public void endTime(){ boolean flag = true ; while (flag){ flag = false ; for (DubboFutureTask futureTask : futureTasks) { //如果有一个没完成,则继续执行 if(!futureTask.isDone()){ flag = true ; break ; } } } //等待所有任务完成之后,停止计时 double consumeTime = (System.currentTimeMillis() - startTime)/1000.0 ; System.out.println("线程数:"+futureTasks.size()+" , 共消耗时间:"+consumeTime+"s" +" , 异常数量:"+DubboThread.TIMEOUT_NUM.get()); System.out.println("TPS:"+num/consumeTime); } @Test public void testTPS(){ //提交任务请求到线程池 for (DubboFutureTask futureTask : futureTasks) { executorService.submit(futureTask) ; } } }
package tps.support; import lombok.Getter; import lombok.Setter; import java.util.concurrent.FutureTask; /** * Created by admin on 2015-12-27. */ @Setter @Getter public class DubboFutureTask extends FutureTask<Object> { private DubboThread dubboThread ; public DubboFutureTask(DubboThread dubboThread) { super(dubboThread) ; this.dubboThread = dubboThread ; } }
package tps.support; import com.glodon.framework.common.util.JsonMapper; import lombok.Getter; import lombok.Setter; import java.util.concurrent.Callable; import java.util.concurrent.atomic.AtomicInteger; /** * Created by admin on 2015-12-21. */ @Setter @Getter public class DubboThread implements Callable<Object> { public static final AtomicInteger TIMEOUT_NUM = new AtomicInteger(0) ; private XXXService xxxService ; private String name ; @Override public Object call() throws Exception { XXXEntity xxx = null ; try { xxx= xxxService.login("superman" , "123456") ; System.out.println("线程名称-> "+getName()+" -> "+ JsonMapper.toJSONString(xxx)); }catch (Exception e){ //异常数量 TIMEOUT_NUM.incrementAndGet() ; e.printStackTrace(); } return xxx ; } }
- 根据服务端性能、个数和客户端的并发要求,就可以计算出具体的timeout的值了。
注:
- dubbo用户手册 : http://dubbo.io/User+Guide-zh.htm
相关推荐
1、Dubbo 远程调用实现 2、内带zookeeper-3.4.5消息服务 3、直接导入myeclipse运行:dubbo-server导入tomcat中运行 4、dubbo-client 运行测试类/dubbo-client/src/com/fengjx/main/Consumer.java
Dubbo调用java接口程序
nodejs 使用原生的 dubbo (dubbo head hessian body) 协议打通了 dubbo 的 rpc 方法调用 .
springboot+dubbo timeout retries 验证 原文地址 https://blog.csdn.net/u013151053/article/details/116949588
dubbo服务端可以定义其接口、以便其他dubbo客户端调用其接口方法。
对原有的dubbo远程调用的异步的缺陷性进行了优化方案
针对dubbo分布式调用链系统实现_3
dubbo提供与调用方配置文件,及web配置,涉及主要用于dubbo
dubbo实现服务调用、超时、重试、服务降级、服务熔断的功能。
Dubbo异步调用的优化共20页.pdf.zip
5-42 业务系统集成Dubbo异步调用实现(2).mp4
针对dubbo分布式调用链系统实现_1
针对dubbo分布式调用链系统实现_4
针对dubbo分布式调用链系统实现_5
针对dubbo分布式调用链系统实现_6
增加依赖:通过调用maven命令,下载jar包和热加载到系统,主要用来分析接口方法参数,主要作用在普通模式。 依赖列表:通过分析pom文件,展示已经加载的jar包。 其它特性 springboot 整合 redis,支持spring el ...
spring boot 调用dubbo实例,可以运行,需要安装dubbo服务器。
spring-cloud-alibaba+dubbo+nacos内部服务调用