老司机带你玩转web service

当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来。毕竟是多家不同的公司的产品,研发开发语言、采用技术框架基本上是百花齐放。怎样让自家系统提供的服务具有跨平台、跨语言、跨各种防火墙,让其他公司的研发用起来没障碍和爽呢?进过前期的技术调研和实践,最终将目光放在了轻量级 webService 服务上面

1. WebService 服务技术的关键点XML: 

做为 WebService 的基本数据表示,特点即容易组织和分析,而且又与开发平台无关。

SOAP: 做为 WebService 的传输协议,特定能运行在任何传输协议(TCP/UDP..)上面,将程序中的对象编码为 XML 的规则,执行远程调用。

WSDL: 做为描述 WebService 的语言,你能很清晰的知道提供的服务是什么、入参、返回的数据,机器和人都很容器进行阅读。 公司自己实现 WebService 服务铁定不现实,如果你公司有一群热爱技术的大牛、有一颗想造轮子的匠心,有老总的支持,还是可以放手一战的。

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

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

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

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

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

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

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

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

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

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

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

在 main 函数中静态方式防部的方式这里就不提了,咱需要 webServer 服务和 web 项目一起启动起来,同呼吸共命运。

maven 依赖

<dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.2.10</version> </dependency> 如果是jar包方式的话,

需要如下jar。

完整的项目结构如下:

@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 + "! "; } }

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>

服务配置文件 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 容器打印日志是这样。

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

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

<dependency>
 <groupId>org.springframework.ws</groupId> 
 <artifactId>spring-ws-core</artifactId> 
 <version>2.3.0.RELEASE</version>
 </dependency>

Spring Bean 添加 WebServer 服务支持

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

服务实现类 Bean 配置

大体的想法是你得让 Spring 知道有这样一个服务实现类。如果你比较传统,可以配置在 Spring-***.xml 中,像这样 ... 当然你也可以,使用注解,像这样

 客户端 JAX-WS 服务的调用

服务端编写好之后,使用 JDk 自带的 wsimport 工具生成客户端代理类。 wsimport 只需要指定 url 就能生成 java 调用的客户端,你完全不用去了解这个 WebServer 服务是用什么语言编写的。 生成客户端代理类之后,只需要两行代码就能,实现 webServer 服务的调用。 wsimport -s f: http://localhost:5050/cwe/services/sayHi?wsdl wsimport 常用参数参考 参数 说明 -p 定义客户端生成类的包名称 -s 指定客户端执行类的源文件存放目录 -d 指定客户端执行类的class文件的存放目录 -keep 表示生成客户端执行类的源代码 -b 指定jaxws/jaxb绑定文件或额外的schemas -extension 使用扩展来支持SOAP1.2 将代理类放入客户端,调用代码 MyFirstWebServiceImplService service = MyFirstWebServiceImplService; MyFirstWebService implPort = service.getMyFirstWebServiceImplPort; System.out.println(implPort.sayHi("Orson")); 其实我一直想尝试,不再客户端添加任何类调用 webServer 服务,很遗憾没能成功。 最接近的的是,在客户端放入服务端的 接口类,代码可以这样写。

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"));

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯Bugly的专栏

Android 开发必备知识:我和 Gradle 有个约会

0、讲个故事 0.1 Ant,我还真以为你是只蚂蚁 真正开始近距离接触编程其实是在2012年,年底的时候带我的大哥说,咱们这个 app 发布的时候手动构建耗时太...

36740
来自专栏aoho求索

Spring Cloud 微服务架构进阶

我今年年初的时候,筹划了一本技术书籍,即为这篇文章的标题《Spring Cloud 微服务架构进阶》。今天正式开始预售了,年初到现在正好十个月,实在不易。写这篇...

85920
来自专栏java思维导图

@Java 开发者,Spring Boot 最流行的 16 条实践解读!

Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这...

11310
来自专栏沃趣科技

ASM 翻译系列第二十九弹:ASM INTERNAL Free Space Table

原作者:Bane Radulovic 译者: 魏兴华 审核: 魏兴华 DBGeeK社群联合出品 Free Space Table 在进行创建文件或者...

41240
来自专栏SDNLAB

OpenFlow协议超时机制简介

作者简介: 陈俞辛,福州大学数计学院2016级计算机科学与技术本科生,目前研究方向为软件定义网络SDN,邮箱multhree @163.com。

13320
来自专栏IT可乐

Spring详解(一)------概述

  本系列教程我们将对 Spring 进行详解的介绍,相信你在看完后一定能够有所收获。 1、什么是 Spring ?   Spring是一个开源框架,Sprin...

22070
来自专栏java一日一条

java的三大版本,你知道吗

J2SE是java的基础,主要是运用到桌面应用程序的开发中。小编一直以为java中是没有那种能够编译成.exe运行文件的组件,知道今天我才发现,java在这方面...

10020
来自专栏landv

windows server 2012 R2 远程桌面授权模式尚未配置

61150
来自专栏Java后端技术

SpringBoot的幕后推手...

​  这两年随着微服务的盛行,SpringBoot框架水到渠成的得到了高曝光,作为程序猿的我们,现在要是不知道一点SpringBoot相关的东西,貌似出去找工作...

9520
来自专栏landv

windows server 2012 R2 远程桌面授权模式尚未配置

windows server 2012 R2 远程桌面授权模式尚未配置,远程桌面服务将在120天内停止工作。如何破解这个宽限期,目前企业7位协议号码均不包含20...

816100

扫码关注云+社区

领取腾讯云代金券