当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来。

毕竟是多家不同的公司的产品,研发开发语言、采用技术框架基本上是百花齐放。

怎样让自家系统提供的服务具有跨平台、跨语言、跨各种防火墙,让其他公司的研发使用起来没障碍并且爽呢?

进过前期的技术调研和实践,最终将目光放在了轻量级 Web Services 服务上面。

1. Web Services 服务技术的关键点

  • XML:     做为 Web Services 的基本数据表示,特点即容易组织和分析,而且又与开发平台和语言无关。
  • SOAP:   做为 Web Services 的通讯协议,基于 XML能运行在任何传输协议 HTTP/TCP/UDP/ 上面,将程序中的对象编码为 XML 的规则,执行远程调用。

TCP/HTTP/UDP 传输协议可以理解为寄信时信封上的格式怎么写,贴什么邮票,SOAP 通讯协议使用 HTTP 来发送XML 格式的信息。

  • WSDL:  做为描述 Web Services 的语言,你能很清晰的知道提供的服务是什么、入参、返回的数据,机器和人都很容器进行阅读。

公司自己实现 Web Services 服务框架肯定是不现实的,如果你公司有一群热爱技术的大牛、有一颗想造轮子的匠心,有老总的支持,还是可以放手一战的。

目前已有的 Web Services 开发框架有:  Axis、Axis2、Xfire、CXF、JAX-WS。

除了 JAX-WS 为 JDK 1.6 发布的的 Web Services 开发框架以外,其余的都是第三方开源框架。

其中 Axis 和 XFire 随着技术更新和发展已经慢慢的谈出了人们的视线,并且官方已经有很长时间没有更新,这里暂且不表。

CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。

CXF 原型来源与 XFire + Client, 就像 Struts2 来自 WebWork 一样,当然你也能预言到 XFire 的命运会和 WebWork 一样,会淡出开发者的视线。

Axis2 是 Apache 下的一个重量级 Web Services框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是 Web Services 框架的集大成者。

Axis2 不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。这是它的优势所在。

丰满意味着臃肿和庞大,这样的优势也不可避免的导致了Axis2的复杂性,听使用过她的人,它所依赖的包数量和大小都是很惊人的,打包部署发布很麻烦。

源于对第三方开源框架的恐惧和颤抖,结合自身公司的业务复杂度,技术团队一致选定 JDK JAX-WS 作为公司的 Web Services 框架。

上述参考出处:

http://zhidao.baidu.com/link?url=H_CijOzBSzpLnZ

http://baike.baidu.com/link?url=OHYozkeWQkpZDmnKeDk9Ja

2. JAX-WS 服务端无 MVC 框架开发实践

我这里的说的无 MVC 框架指的是没有使用任何像 Struts/Spring MVC/WebWork....这些东西,Java EE 项目最纯真的 Servlet 时代。

在 main 函数中静态方式发布这里就不提了,确实有点 low,咱需要 Web Services 服务和 web 项目一起启动起来,同呼吸共命运。

main 静态发布方式参考:http://www.xuebuyuan.com/1955910.html

  • a.maven 依赖

        <dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.2.10</version>
</dependency>

如果是非 mavn的传统项目, 需要的 jar (大概 5M)

  • b.服务类和实现类

项目包结构

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface MyFirstWebService { /**
* 执行测试的WebService方法(有参)
*/
@WebMethod
String sayHi(@WebParam(name = "name") String name); }
@WebService(endpointInterface = "com.rambo.cwe.jws.inter.MyFirstWebService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class MyFirstWebServiceImpl implements MyFirstWebService { public String sayHi(String name) {
return "Hi, " + name + "! ";
}
}
  • c.web 项目的起点,web.xml 的配置

    <listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener> <servlet>
<servlet-name>MyFirstWebService</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyFirstWebService</servlet-name>
<url-pattern>/services/sayHi</url-pattern>
</servlet-mapping>
  • d.服务配置文件 sun-jaxws.xml,放置到 WEB-INF

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint name="myFirstWebService" implementation="com.rambo.cwe.jws.impl.MyFirstWebServiceImpl"
url-pattern="/services/sayHi"/>
</endpoints>

注意服务配置文件中的 url-pattern 和 servlet 中的 url-pattern 是一致的。

通过上面的4步的操作,启动 web 项目吧,不出什么意外的话,启动 web 容器打印日志是这样。

浏览器访问 http://localhost:5050/cwe/services/sayHi

示例项目: https://github.com/OrsonEx/cwe

3. JAX-WS 服务端与 Spring 集成开发实践

在 Spring 中集成相当简单,分分钟配置集成。

  • a.mavn 依赖需要添加的支持 jar(500K)

        <dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
  • b.Spring Bean 添加 Web Services 服务支持

     <bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
<property name="baseAddress" value="http://localhost:8089/services/"/>
</bean>

地址你随意,配置为和 web 项目一致也没问题。

  • c.服务实现类 Bean 配置

大体的意思是你得让 Spring 知道有这样一个服务实现类。

如果你比较传统,可以配置在 Spring-***.xml 中,像这样

    <bean id="myFirstWebServiceImpl" class="com.rambo.cwe.jws.impl.MyFirstWebServiceImpl">
...
</bean>

当然你也可以,使用注解,像这样

简单的三步之后,把你的 web 容器启动起来吧,Web Services 服务就发布成功了。

实例工程:https://github.com/OrsonEx/sme-jws

4. 客户端  JAX-WS 服务的调用

服务端编写好之后,使用 JDk 自带的 wsimport 工具生成客户端代理类。

wsimport 只需要指定 url 就能生成 java 调用的客户端,你完全不用去了解这个 WebServer 服务是用什么语言编写的。

wsimport -s f:  http://localhost:5050/cwe/services/sayHi?wsdl

wsimport 常用参数参考:

参数 说明
-p 定义客户端生成类的包名称
-s 指定客户端执行类的源文件存放目录
-d 指定客户端执行类的class文件的存放目录
-keep                                                      表示生成客户端执行类的源代码
-b 指定jaxws/jaxb绑定文件或额外的schemas
-extension 使用扩展来支持SOAP1.2

补充: 关于 wsimport 生成代理类:http://blog.csdn.net/aqsunkai/article/details/51711087

生成的代理类(生成姿势多种多样,自行参考上面常用参数,没有标准只有最适合):

将代理类放入客户端项目,只需要两行代码就能实现 Web Services 服务的调用,如下

            MyFirstWebServiceImplService service = MyFirstWebServiceImplService();
MyFirstWebService implPort = service.getMyFirstWebServiceImplPort();
System.out.println(implPort.sayHi("Orson"));

其实我一直想尝试,不往客户端添加任何代码,调用 Web Services 服务,很遗憾没能成功。

最接近的的是,在客户端放入服务端的接口类,代码可以这样写。

            URL url = new URL("http://localhost:5050/cwe/services/sayHi?wsdl");
QName serviceName = new QName("http://impl.jws.cwe.rambo.com/", "MyFirstWebServiceImplService");
QName portName = new QName("http://impl.jws.cwe.rambo.com/", "MyFirstWebServiceImplPort"); Service service = Service.create(url,serviceName);
MyFirstWebService servicePort = service.getPort(portName,MyFirstWebService.class);
System.out.println(servicePort.sayHi("Orson"));

自行定义连接地址、服务名称、、端口名称,生成服务实例进行访问,代码完全没有使用代理类那样清晰。

等下次,你们公司需要给其他公司提供服务时,只需要编写好 Web Services,抽象好接口,撸好实现层。

直接甩一个地址给其他公司,顺便可以把我这篇博客地址发过去,然后整个世界就安静了。

分分钟带你玩转 Web Services的更多相关文章

  1. 分分钟带你玩转 Web Services【2】CXF

    在实践中一直在使用 JAX-WS 构建 WebService 服务,服务还是非常稳定.高效的. 但还是比较好奇其他的 WebService 开源框架,比如:CXF/Axis2/Spring WS等. ...

  2. 分分钟带你玩转 Web Services【1】JAX-WS

    当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来. 毕竟是多家不同的公司的产品,研发开发语言.采用技术框架基本上是百花齐放. 怎样让自家系统提供的服务具有跨平台.跨语言.跨各种防 ...

  3. 老司机带你玩转web service

    当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来.毕竟是多家不同的公司的产品,研发开发语言.采用技术框架基本上是百花齐放.怎样让自家系统提供的服务具有跨平台.跨语言.跨各种防火墙 ...

  4. 带你玩转Visual Studio

    带你玩转Visual Studio 带你新建一个工程 工程目录下各文件的含义 解决方案与工程 在这之前先了解一个概念:解决方案与工程. 解决方案(Solution):一个大型项目的整体的工作环境: 工 ...

  5. RESTful Web Services初探

    RESTful Web Services初探 作者:杜刚 近几年,RESTful Web Services渐渐开始流行,大量用于解决异构系统间的通信问题.很多网站和应用提供的API,都是基于RESTf ...

  6. Jersey the RESTful Web Services in Java

    Jersey 是一个JAX-RS的实现, JAX-RS即Java API for RESTful Web Services, 支持按照表述性状态转移(REST)架构风格创建Web服务. REST 中最 ...

  7. (转) Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?

    Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么? 建站有很多技术,如 HTML.HTML5.XHT ...

  8. 利用WSCF进行契约先行的Web Services开发

    http://www.cnblogs.com/goody9807/archive/2007/06/05/772107.html 什么是契约先行(Contract-First)? 如果说一个新的软件开发 ...

  9. RESTful Web Services测试工具推荐

    命令行控的最爱:cURL cURL是一个很强大的支持各种协议的文件传输工具,用它来进行RESTful Web Services的测试简直是小菜一碟.这个工具基本上类Unix操作系统(各种Linux.M ...

随机推荐

  1. ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证

    原文:Model Validation 作者:Rachel Appel 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 在这篇文章中: 章节: 介绍模型验证 验证 Attribute 模型状态 处理 ...

  2. SQL Server 2012 清理日志 截断日志的方法

    MEDIA数据库名 ALTER DATABASE MEDIA SET RECOVERY SIMPLE WITH NO_WAIT ALTER DATABASE MEDIA SET RECOVERY SI ...

  3. 简述9种社交概念 SNS究竟用来干嘛?

    1.QQ 必备型交流工具基本上每一个网民最少有一个QQ,QQ已经成为网民的标配,网络生活中已经离不开QQ了.虽然大家嘴上一直在骂 QQ这个不好,那个不对,但是很少有人能彻底离开QQ.QQ属于IM软件, ...

  4. FunDA(2)- Streaming Data Operation:流式数据操作

    在上一集的讨论里我们介绍并实现了强类型返回结果行.使用强类型主要的目的是当我们把后端数据库SQL批次操作搬到内存里转变成数据流式按行操作时能更方便.准确.高效地选定数据字段.在上集讨论示范里我们用集合 ...

  5. linux grep命令

    linux grep命令1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expressio ...

  6. 读取数据库数据,并将数据整合成3D饼图在jsp中显示

    首先我将生成饼图的方法独立写成一个PieChar.java类,详细代码如下:(数据库需要自己建,如有需要的话) import java.io.IOException; import java.sql. ...

  7. Scala override

    var 变量不能在子类中重写,除非父类是抽象类 在抽象类中var变量不能赋初值 abstract class Person{ val name="" def name1=" ...

  8. Java中使用IO流实现大文件的分裂与合并

    文件分割应该算一个比较实用的功能,举例子说明吧比如说:你有一个3G的文件要从一台电脑Copy到另一台电脑, 但是你的存储设备(比如SD卡)只有1G ,这个时候就可以把这个文件切割成3个1G的文件 ,分 ...

  9. 小程序https Android 安卓可以发request请求,IOS 苹果 发请求失败问题

    如果一个机器可以发送成功,一个机器发送失败,那多半是是域名的https支持的问题 那就用腾讯云的这个ssl测试工具检测下 https://www.qcloud.com/product/ssl#user ...

  10. 蓝牙协议中的SBC编码

    一.从信息的传输说起  上图是一个典型的蓝牙耳机应用场景.手机上的音频信息经过编码以后通过蓝牙协议被蓝牙耳机接收,经过解码以后,蓝牙耳机成功获取手机上的音频信息,然后再转化为振动被人耳识别.这是一个 ...