package top.hh.consumer.service;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
import top.hh.service.UserServiceApi;
import java.util.List;
@Service
public class LoginServiceImpl {
//failfast快速失效,只发起一次调用,失败立即报错
@Reference(cluster = "failfast", retries = 0, interfaceClass = UserServiceApi.class, lazy = true, check = false, timeout = 50000)
UserServiceApi userServiceApi;
/**
* 测试rpc直接传参数耗时 1秒
*/
public String testprc1() {
String s1 = rpc1("1");
String s2 = rpc2("2");
long start = System.currentTimeMillis();
String str = userServiceApi.getTest(s1, s2);
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
return "" + (end - start);
}
/**
* 测试rpc参数为方法耗时 3秒
*/
public String testprc2() {
long start = System.currentTimeMillis();
String str = userServiceApi.getTest(rpc1("1"), rpc2("2"));
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
return "" + (end - start);
}
/**
* 测试本地参数为方法耗时 2秒
*/
public String test3() {
long start = System.currentTimeMillis();
test(rpc1("1"), rpc2("2"));
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
return "" + (end - start);
}
public static void main(String[] args) {
new LoginServiceImpl().testprc2();//耗时:2006
}
private String test(String str1, String str2) {
return "";
}
private String rpc1(String str) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "rpc1";
}
private String rpc2(String str) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "rpc2";
}
}
总结:如果是本地调用方法中参数为方法,大不了执行这些参数方法并发执行,执行整体的方法为参数方法执行完成后执行,没什么问题就是串行化呗。
但是如果RPC调用多增加一些不必要的耗时有可能使方法超时失败。而且这些参数中方法为RPC调用,最好是在上边赋值给变量,不然多个参数并发执行顺序可能会有问题。
来源:oschina
链接:https://my.oschina.net/u/3730149/blog/3158254