服务调用效率比较

在一些较大规模的软件项目上,如果对用户体验要求较高,那就有必要对服务调用效率作个比较。

关于服务调用,无外乎有两种:本地调用(项目内)和远程调用(项目间)。

本地调用,在其他因素相同的情况下,由于不需要对外通信,其效率肯定最高。但问题是,随着业务的发展,当一台服务器无法满足时,我们必须远程调用。

远程通讯可能有很多,现比较一下,local,rabbitmq RPC ,WebAPI的效率。

环境是:本地电脑,满足硬件环境一致的要求;

分别启动 rabbitmq,WebAPI,使用同一算法,以保证所有的业务逻辑一致。为了最大限度的提高WebAPI的效率,不使用任何第三方框架。

如: 只实现Servlet接口

@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {    String val = servletRequest.getParameter("num");    int fibVal = 0;    try {        fibVal = fib(Integer.valueOf(val));

    } catch (Exception ex) {

    }    servletResponse.setContentType("text/html");    servletResponse.setCharacterEncoding("utf-8");    PrintWriter writer = servletResponse.getWriter();    writer.println(fibVal);    writer.flush();    writer.close();

}。请求端如下:
public static void main(String[] args) throws Exception {    String message = readStrFromConsole();    long start = System.currentTimeMillis();    int localVAl = fib(Integer.valueOf(message));    System.out.println("local:first:" + (System.currentTimeMillis() - start));    System.out.println(message + "‘s Fibo is " + localVAl);    start = System.currentTimeMillis();    RPCClient fiboRpc = new RPCClient();    String response = fiboRpc.call(message);    fiboRpc.close();    System.out.println("RPC:Second:" + (System.currentTimeMillis() - start));    System.out.println(message + "‘s Fibo is " + response);    start = System.currentTimeMillis();    String http_response = RemoteRequest.Get("http://localhost:8080/TestWeb/test?num=" + message);    System.out.println("HTTP:Second:" + (System.currentTimeMillis() - start));

    System.out.println(message + "‘s Fibo is " + http_response);}计算fib(41)的值,测试结果如下:

Connected to the target VM, address: ‘127.0.0.1:55175‘, transport: ‘socket‘
41
local:first:1017
41‘s Fibo is 165580141
RPC:Second:1207
41‘s Fibo is 165580141
Disconnected from the target VM, address: ‘127.0.0.1:55175‘, transport: ‘socket‘
HTTP:Third:2106
41‘s Fibo is 165580141

第二次运行:

41
local:first:1017
41‘s Fibo is 165580141
RPC:Second:1227
41‘s Fibo is 165580141
HTTP:Third:1963
41‘s Fibo is 165580141

第三次:

41
local:first:1022
41‘s Fibo is 165580141
RPC:Second:1193
41‘s Fibo is 165580141
Disconnected from the target VM, address: ‘127.0.0.1:55203‘, transport: ‘socket‘
HTTP:Third:1969
41‘s Fibo is 165580141

。。。

经过更多次的调用,你会发现:

local , 在1000ms 左右;

rabbitmq RPC ,在 1200ms 左右;

WebAPI,在 2000ms 左右。

由此来看,在远程调用中,rabbitmq RPC的效率要比WebAPI高很多。

但有一点限制,rabbitmq RPC 只能用于同一网段,不过对于跨网段的还是可以解决的。

时间: 2024-10-18 11:51:52

服务调用效率比较的相关文章

C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 外部服务调用、内部服务调用优化,面向服务化的

现在的信息系统越来越复杂,越来越庞大,不仅需要内部是一个整体,而且还需要提供很多对外的服务调用. 1:别人如何调用最方便?用不同的开发语言调用.2:服务的返回状态是什么样子的?有利于排查问题.3:服务的安全性.可过渡升级性.性能效率要有保障.4:服务也需要有完整的调用日志记录等. 下面是一个服务调用有效性判断的函数代码,供大家参考. 1 //----------------------------------------------------------------- 2 // All Rig

【第三章】声明式服务调用(Feign)

当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻.那么有没有更好的解决方案呢?答案是确定的有,Netflix已经为我们提供了一个框架:Feign. Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数.格

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

Freemarker商品详情页静态化服务调用处理

--------------------------------------------------------------------------------------------- [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/53151462 作者:朱培      ID:sdksdk0 ----------------------------------------------------

绑定服务调用远程服务中的方法

在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信.为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Se

Dubbo服务调用的动态代理和负载均衡

Dubbo服务调用的动态代理及负载均衡源码解析请参见:http://manzhizhen.iteye.com/blog/2314514

Spring Cloud 声明式服务调用 Feign

一.简介 在上一篇中,我们介绍注册中心Eureka,但是没有服务注册和服务调用,服务注册和服务调用本来应该在上一章就应该给出例子的,但是我觉得还是和Feign一起讲比较好,因为在实际项目中,都是使用声明式调用服务.而不会在客服端和服务端存储2份相同的model和api定义.Feign在RestTemplate的基础上对其封装,由它来帮助我们定义和实现依赖服务接口的定义.Spring Cloud Feign 基于Netflix Feign 实现的,整理Spring Cloud Ribbon 与 S

WCF系列之WCF服务调用方式

WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象进行服务调用. 通过SvcUtil.exe的方式调用服务 SvcUtil.exe是一个命令行工具,位于:C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin目录下,可以将SvcUtil.exe添加到VS2010中方便以后的运用,添加方式:在VS2010的Tools菜单中选择External T

vs自动生成的WebService配置文件在部署到IIs6后,服务调用失败的解决方法

近日,在项目中需要引用java发布的WebService,添加服务引用后,调用一切正常. 配置如下: <system.serviceModel> <bindings> <basicHttpBinding> <binding name="SecurityServiceImplServiceSoapBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize=&qu