CXF是Apache的顶级项目,也是目前Java社区中用来实现WebService流行的一个开源框架(尤其是收编了xfire后)。基于CXF可以非常简单地以WebService的方式来实现Java甚至是跨语言的远程调用,CXF的工作原理如图1.4所示:
![]() |
(点击查看大图)图1.4 CXF工作原理 |
CXF对于WebService的服务器端并没做多少封装,它仍然采用目前Java SE本身的WebService方式,只是提供了一个JaxWsServerFactoryBean类,从而可以在WebService被调用时增加一些拦截器的处理。客户端方面CXF则增加了封装,以便能够直接以接口的方式来调用远程的WebService,简化了调用WebService的复杂性,CXF提供的类为JaxWsProxyFactoryBean,通过此类将WebService的接口类以及WebService的地址放入,即可获取对应接口的代理类了,基于CXF实现示例中的服务器端代码如下:
接口类:
- @WebService
- public interface Business {
- public String echo(String message);
- }
业务实现类:
- @WebService(serviceName="BusinessService", endpointInterface="book.chapter1.cxf.Business")
- public class BusinessImpl implements Business {
- public String echo(String message) {
- if("quit".equalsIgnoreCase(message.toString())){
- System.out.println("Server will be shutdown!");
- System.exit(0);
- }
- System.out.println("Message from client: "+message);
- return "Server response: "+message;
- }
- }
调用CXF类完成WebService的发布:
- public static void main(String[] args) throws Exception{
- Business service=new BusinessImpl();
- JaxWsServerFactoryBean svrFactory=new JaxWsServerFactoryBean();
- svrFactory.setServiceClass(Business.class);
- svrFactory.setAddress("http://localhost:9527/business");
- svrFactory.setServiceBean(service);
- svrFactory.create();
- }
客户端由于CXF提供了良好的封装,调用WebService就比直接用Java的方式简单多了,关键代码如下:
- JaxWsProxyFactoryBean factory=new JaxWsProxyFactoryBean();
- factory.setServiceClass(Business.class);
- factory.setAddress("http://localhost:9527/business");
- Business business=(Business)factory.create();
类似CXF这样的WebService框架在开源界中还有不少,例如Axis。这些开源WebService框架除了对Java WebService的使用方式进行封装,提升了易用性外,还增加了多种协议来调用WebService,例如TCP/IP和JMS等。
以上的章节讲解了Java中实现系统间通信的相关技术、基本原理及使用方法。由此也可看出,构建分布式的Java应用比构建集中式的复杂不少,要掌握的知识点多了很多。本章并未面面俱到地介绍Java中可用来实现系统间通信的技术。例如JMS、EJB等,这些技术通常是基于以上所描述的原理进一步扩展,以提升对于不同场景的需求满足度及易用性。在实际使用中不用拘泥于这些现有技术,可以选择已有原理来自行构建更为适合需求的框架,例如可以基于RMI原理来构建更为轻量级的远程调用框架。
在大型的应用中,分布式的概念不仅仅是上面的跨JVM或跨机器的系统间通信,还会涵盖如集群、负载均衡、分布式缓存、分布式文件系统等多方面的内容。这些将在后续的章节中进一步讲解,接下来先看看一个大型的分布式Java应用会是多大的规模,将面对哪些方面的挑战。