`
id.alex
  • 浏览: 22793 次
社区版块
存档分类
最新评论

Hessian, CXF, Spring httpinvoke 对比

    博客分类:
  • Java
阅读更多
做了一个 Hessian, CXF, Spring httpinvoke 速度对比

时间消耗  cxf > spring httpinvoke > hessian

顺序调用1W次所耗时间

hessian2652-2922
spring httpinvoke4080-4949
cxf9732-10432


并发为10, 调用1W次所耗时间
hessian1625-1753
spring httpinvoke3165-3338
cxf5709-5863


当然, 都知道 cxf 和 hessian 实现以及应用场景不太一样, 但差这么多还是很意外的..
另外在并发测试时, spring httpinvoke cpu 消耗明显更高.

=============================================================
测试代码:

服务端

public class Param implements Serializable {
	private static final long serialVersionUID = 7414597783500374225L;
	private Integer i;
	private String s;
	private Long l;
	private List<Param> list = new ArrayList<Param>();
	private boolean b;
......
}

public class Result implements Serializable {
	private static final long serialVersionUID = 2729153186117404170L;
	private Integer i;
	private String s;
	private Long l;
	private List<Result> list;
	private boolean b;
......
}


@WebService
public interface TestService {
	Result method(Param p);
}


@Service
@WebService(endpointInterface = "org.alex.test.webservice.TestService")
public class TestServiceImpl implements TestService {

	@Override
	public Result method(Param p) {
		Result r = new Result();
		BeanUtils.copyProperties(p, r);
		return r;
	}

}



	<!-- cxf -->
	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
	<jaxws:endpoint id="testCxfService" implementor="org.alex.test.webservice.TestServiceImpl" address="/cxf" />


	<bean id="testServiceImpl" class="org.alex.test.webservice.TestServiceImpl" />

	<!-- hessian -->
	<bean name="/hes" class="org.springframework.remoting.caucho.HessianServiceExporter">
		<property name="service" ref="testServiceImpl" />
		<property name="serviceInterface" value="org.alex.test.webservice.TestService" />
	</bean>

	<!-- spring http invoke -->
	<bean name="/spr" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
		<property name="service" ref="testServiceImpl" />
		<property name="serviceInterface" value="org.alex.test.webservice.TestService" />
	</bean>


客户端

public class Client {

	static String CXF = "cxfService";
	static String HESSIAN = "hesService";
	static String SPRING = "sprService";

	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("client.xml");

		TestService service = (TestService) ac.getBean(SPRING);

		Param p = new Param();
		p.setI(100);
		p.setB(true);
		p.setL(1000L);
		p.setS("123456789123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()_\r\n\\\t");
		p.getList().add(new Param());
		p.getList().add(new Param());
		p.getList().add(new Param());
		service.method(p);

		long now = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			service.method(p);
		}
		System.out.println(System.currentTimeMillis() - now);
	}
}


public class MultiThreadClient {

	static String CXF = "cxfService";
	static String HESSIAN = "hesService";
	static String SPRING = "sprService";

	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("client.xml");

		TestService service = (TestService) ac.getBean(HESSIAN);

		Param p = new Param();
		p.setI(100);
		p.setB(true);
		p.setL(1000L);
		p.setS("123456789123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()_\r\n\\\t");
		p.getList().add(new Param());
		p.getList().add(new Param());
		p.getList().add(new Param());
		service.method(p);

		ExecutorService exe = Executors.newFixedThreadPool(10);
		Task task = new Task(service, p);

		long now = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			exe.submit(task);
		}
		exe.shutdown();
		while (!exe.isTerminated()) {
		}
		System.out.println(System.currentTimeMillis() - now);

	}

	private static class Task implements Runnable {

		TestService service;
		Param p;

		public Task(TestService service, Param p) {
			this.service = service;
			this.p = p;
		}

		@Override
		public void run() {
			service.method(p);
		}
	}
}



	<jaxws:client id="cxfService" serviceClass="org.alex.test.webservice.TestService" address="http://localhost:8080/webservice/cxf/cxf?wsdl" />

	<bean id="hesService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
		<property name="serviceUrl" value="http://localhost:8080/webservice/app/hes" />
		<property name="serviceInterface" value="org.alex.test.webservice.TestService" />
	</bean>

	<bean id="sprService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
		<property name="serviceUrl" value="http://localhost:8080/webservice/app/spr" />
		<property name="serviceInterface" value="org.alex.test.webservice.TestService" />
	</bean>



分享到:
评论

相关推荐

    Dubbo 19道面试题及答案.docx

    - **HTTP协议**:使用Spring的Httpinvoke实现,适合JS调用或给Web应用使用。 - **Hessian协议**:基于HTTP通讯,提供与Hessian服务的互操作,适合中等大小的数据传输。 - **Memcache和Redis协议**:基于这两个数据库...

    Dubbo服务框架面试题及答案.pdf

    - 使用Spring的HttpInvoke实现,适合提供者数量多于消费者的场景,尤其是需要为应用程序和浏览器JS调用的情况。基于HTTP的短连接传输。 5. **Hessian协议**: - 基于HTTP通讯,使用Servlet暴露服务,Dubbo内嵌...

    Java Dubbo面试及答案

    4. HTTP 协议:基于 Http 表单提交的远程调用协议,使用 Spring 的 HttpInvoke 实现。多个短连接,传输协议 HTTP,传入参数大小混合,提供者个数多于消费者,需要给应用程序和浏览器 JS 调用。 5. Hessian 协议:...

    JAVA面试_Dubbo常问面试题30个.pdf

    - 基于Http表单提交,使用Spring的HttpInvoke实现。 - 多个短连接,通过HTTP传输,适用于提供者多于消费者的场景,如Web应用和JavaScript调用。 5. **hessian协议**: - 集成了Hessian服务,基于HTTP通讯,使用...

    Dubbo面试及答案(上).pdf

    4. **http协议**:基于Http表单提交,使用Spring的HttpInvoke实现,适用于提供者数量多于消费者的场景,适合应用程序和浏览器JS调用。 5. **hessian协议**:集成了Hessian服务,基于HTTP通讯,使用Servlet暴露服务...

    Dubbo面试.pdf

    4. http协议:使用基于Http表单提交的远程调用协议,通过Spring的HttpInvoke实现。它支持HTTP协议,适用于提供者数量多于消费者,需要支持应用程序和浏览器JS调用的场景。 5. hessian协议:基于Hessian服务,采用...

    2021Java字节跳动面试题——面向字节_Dubbo(上).pdf

    - **特点**:基于Http表单提交的远程调用协议,使用Spring的HttpInvoke实现。 - **传输协议**:HTTP - **应用场景**:适用于需要给应用程序和浏览器JS调用的场景。 - **优点**:易于理解和使用。 - **缺点**:性能...

Global site tag (gtag.js) - Google Analytics