Dubbo-based RPC and RESTful performance comparison

Let's start with the conclusion: the efficiency of RPC requests is about 1.6 times that of HTTP requests, and the performance is significantly higher than HTTP requests.
Reason analysis: RESTful is based on the HTTP protocol for interaction. The HTTP protocol contains a large amount of request header and response header information. Dubbo is based on dubbo's custom binary protocol for transmission. The message body is relatively simple and the transmission data is much smaller.
Performance comparison
HTTP request code:

// 服务端基于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();
                }
            }
        }
    }
}

RPC code:

// 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();
                }
            }
        }
    }
}

Guess you like

Origin blog.csdn.net/fomeiherz/article/details/101523412