关于dubbo的RPC和RESTful性能及对比
作者:fomeiherz 发布时间:2023-05-23 02:55:14
标签: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();
}
}
}
}
}
来源:https://blog.csdn.net/fomeiherz/article/details/101523412


猜你喜欢
- 作为java中的一个重要理念,说起面向对象也是老生常谈了。在找资料的时候多是很专业的术语,又或者很多框架的知识点合集,其实大部分人刚看资料的
- 在构建RESTful数据服务过程中,我们定义了controller、repositories,并用一些注解修饰它们,但是到现在为止我们还没执
- 意义:由于每个应用进程都有自己的独立进程空间,在android平台上,一个进程通常不能访问另一个进程的内存空间,而我们经常需要夸进程传递对象
- 在我们应用程序的业务逻辑中,经常会碰到参数校验的情况,手动的在代码层上面进行校验就会带来很不好的体验,阅读、维护的成本会大大增加,造成冗余。
- 队列在编程语言中是如何定义的呢?小编与大家分享自己的经验。队列的定义队列是限制结点插入操作固定在一端进行,而结点的删除操作固定在另一端进行的
- 关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListVie
- 下面由我来给大家展示用spring aop实现 * 的例子(电脑打印)下面就看一下具体的代码:先定义一个打印机的接口package aop
- 注意:要先导入javamail的mail.jar包。以下三段代码是我的全部代码,朋友们如果想用,直接复制即可。第一个类:MailSender
- 好了下面进入正题,我们先看一下实现效果吧:下面来介绍一下代码: 本思路就是:1.先到手机中扫描jpeg和png的图片2.获取导图片
- 本例子演示如何添加一个简单的单页导航,在此基础上,再演示如何在第2个页面中显示第1个页面中拨打过的所有电话号码。(1)通过该例子理解Andr
- Android startActivityForResult实例详解startActivityForResult用于两个activity之间
- 调用和回调机制在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种:1.同步调用同步调用是最基本并且最简
- 前言数据驱动测试是相同的测试脚本使用不同的测试数据执行,测试数据和测试行为完全分离。数据驱动是做自动化测试中很重要的一部分,数据源的方案也是
- 1、 WIFI网卡的状态WIFI网卡的状态信息都以整型变量的形式存放在 android.net.wifi.WifiManager 类中,有以
- 本文实例讲述了Android开发实现的标准体重计算器功能。分享给大家供大家参考,具体如下:运行结果界面: 界面设计<Rela
- 本文实例讲述了C#利用原图和水印图的重叠简单实现水印的方法。分享给大家供大家参考,具体如下:图片操作类/// <summary>
- 新建线程新建线程很简单。只需要使用new关键字创建一个线程对象,然后调用它的start()启动线程即可。Thread thread1 = n
- 在项目中经常会遇到对按钮、自定义控件的 Item 等防止多次重复的点击的问题,下面做一个小结。方法1:使用 RxJava 的 throttl
- <?xml version="1.0" encoding="utf-8"?> <L
- 项目中最近用到各种图表,本来打算用第三方的,例如MPAndroid,这是一个十分强大的图表库,应用起来十分方便,但是最终发现和设计不太一样,