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

总结

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

相关文章

  • Java延迟队列DelayQueue原理详解

    Java延迟队列DelayQueue原理详解

    这篇文章主要介绍了Java延迟队列DelayQueue原理详解,DelayQueue 是一个通过PriorityBlockingQueue实现延迟获取元素的无界队列无界阻塞队列,其中添加进该队列的元素必须实现Delayed接口,而且只有在延迟期满后才能从中提取元素,需要的朋友可以参考下
    2023-12-12
  • Java排序算法总结之堆排序

    Java排序算法总结之堆排序

    这篇文章主要介绍了Java排序算法总结之堆排序,详细分析了堆排序的原理与java实现技巧,需要的朋友可以参考下
    2015-05-05
  • Java中JSON字符串与java对象的互换实例详解

    Java中JSON字符串与java对象的互换实例详解

    这篇文章主要介绍了在java中,JSON字符串与java对象的相互转换实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • SpringBoot整合阿里云OSS对象存储服务的实现

    SpringBoot整合阿里云OSS对象存储服务的实现

    这篇文章主要介绍了SpringBoot整合阿里云OSS对象存储服务的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • mybatis对象List<String> List<Integer>属性映射方式

    mybatis对象List<String> List<Integer>属性映射方式

    这篇文章主要介绍了mybatis对象List<String> List<Integer>属性映射方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java常用工具类 XML工具类、数据验证工具类

    java常用工具类 XML工具类、数据验证工具类

    这篇文章主要为大家详细介绍了java常用工具类,包括XML工具类、数据验证工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 使用自定义注解实现redisson分布式锁

    使用自定义注解实现redisson分布式锁

    这篇文章主要介绍了使用自定义注解实现redisson分布式锁,具有很好的参考价值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • spring boot 防止重复提交实现方法详解

    spring boot 防止重复提交实现方法详解

    这篇文章主要介绍了spring boot 防止重复提交实现方法,结合实例形式详细分析了spring boot 防止重复提交具体配置、实现方法及操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Mybatis-Plus最优化持久层开发过程

    Mybatis-Plus最优化持久层开发过程

    Mybatis-plus(简称MP)是一个Mybatis的增强工具,在mybatis的基础上只做增强不做改变,提高效率,自动生成单表的CRUD功能,这篇文章主要介绍了Mybatis-Plus最优化持久层开发,需要的朋友可以参考下
    2024-07-07
  • Java如何Mock FileInputStream问题

    Java如何Mock FileInputStream问题

    这篇文章主要介绍了Java如何Mock FileInputStream问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论