Commençons par la conclusion: l'efficacité des requêtes RPC est environ 1,6 fois supérieure à celle des requêtes HTTP et les performances sont nettement supérieures à celles des requêtes HTTP.
Analyse des raisons: RESTful est basé sur le protocole HTTP pour l'interaction. Le protocole HTTP contient une grande quantité d'informations d'en-tête de demande et d'en-tête de réponse. Dubbo est basé sur le protocole binaire personnalisé de dubbo pour la transmission. Le corps du message est relativement simple et les données de transmission sont beaucoup plus petites.
Code de requête HTTP:
// 服务端基于spring boot搭建
// 服务端代码
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping("/helloworld")
public String helloworld() {
return "hello world";
}
}
// 客户端代码
import org.springframework.util.StopWatch;
import org.springframework.web.client.RestTemplate;
public class HelloworldTest {
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
for (int j = 0; j < 10; j++) {
System.out.println("------------------");
for (int i = 1; i <= 10000; i++) {
restTemplate.getForObject("http://127.0.0.1/helloworld", String.class);
if (i % 1000 == 0) {
stopWatch.stop();
System.out.println(stopWatch.getTotalTimeSeconds());
stopWatch = new StopWatch();
stopWatch.start();
}
}
}
}
}
Code RPC:
// dubbo-demo工程的代码,详情请看:https://github.com/apache/dubbo/tree/master/dubbo-demo
// 服务端
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
}
}
// 客户端
public class Consumer {
public static void main(String[] args) {
//Prevent to get IPV6 address,this way only work in debug mode
//But you can pass use -Djava.net.preferIPv4Stack=true,then it work well whether in debug mode or not
System.setProperty("java.net.preferIPv4Stack", "true");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{
"META-INF/spring/dubbo-demo-consumer.xml"});
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy
StopWatch stopWatch = new StopWatch();
stopWatch.start();
for (int j = 0; j < 10; j++) {
System.out.println("-----------");
for (int i = 1; i <= 10000; i++) {
demoService.sayHello("world"); // call remote method
if (i % 1000 == 0) {
stopWatch.stop();
System.out.println(stopWatch.getTotalTimeSeconds());
stopWatch = new StopWatch();
stopWatch.start();
}
}
}
}
}