关于dubbo的RPC和RESTful性能及对比

 更新时间:2022年12月19日 10:04:44   作者:fomeiherz  
这篇文章主要介绍了关于dubbo的RPC和RESTful性能及对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

先上结论

RPC请求的效率是HTTP请求的1.6倍左右,性能明显比HTTP请求要高很多。

原因分析

RESTful是基于HTTP协议进行交互的,HTTP协议包含大量的请求头、响应头信息。

而dubbo是基于dubbo自定义的二进制协议进行传输,消息体比较简单,传输数据要小很多。

性能对比

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

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决Nacos在执行startup.cmd的时候出现闪退的问题

    解决Nacos在执行startup.cmd的时候出现闪退的问题

    因为在工作中的项目中需要使用到nacos作为注册中心,但是在使用nacos的过程中运行startup.cmd的时候出现了闪退的情况,运行startup.cmd闪一下就没有了,我把解决这个问题的全过程理了一下,希望能帮到您,需要的朋友可以参考下
    2023-12-12
  • SpringBoot 缓存预热的实现

    SpringBoot 缓存预热的实现

    本文主要介绍了SpringBoot 缓存预热的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2007-11-11
  • Spring Boot Jar 包部署脚本的实例讲解

    Spring Boot Jar 包部署脚本的实例讲解

    在本篇文章里小编给大家整理的是一篇关于Spring Boot Jar 包部署脚本的实例讲解内容,对此有兴趣的朋友们可以跟着学习下。
    2021-12-12
  • Java多线程之深入理解ReentrantLock

    Java多线程之深入理解ReentrantLock

    这篇文章主要介绍了Java多线程之深入理解ReentrantLock,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java一个简单的红包生成算法

    Java一个简单的红包生成算法

    今天小编就为大家分享一篇关于Java一个简单的红包生成算法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java由浅入深全面讲解方法的使用

    Java由浅入深全面讲解方法的使用

    方法,也称函数,如果想要重复一段或者多段代码块的使用,可以将这些代码封装成一个方法,方法具体表现为某种行为,使用方法可以提高代码的复用性
    2022-04-04
  • 如何解决EasyExcel导出文件LocalDateTime报错问题

    如何解决EasyExcel导出文件LocalDateTime报错问题

    这篇文章主要介绍了如何解决EasyExcel导出文件LocalDateTime报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 基于java内部类作用的深入分析

    基于java内部类作用的深入分析

    本篇文章介绍了,基于java内部类作用的深入分析。需要的朋友参考下
    2013-05-05
  • 详解Java使用JDBC连接MySQL数据库

    详解Java使用JDBC连接MySQL数据库

    本文详细讲解了Java使用JDBC连接MySQL数据库的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • Java Swing JButton按钮的实现示例

    Java Swing JButton按钮的实现示例

    这篇文章主要介绍了Java Swing JButton按钮的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论