学好分布式架构=4=-webservice

今天咱们一起探索一下webservice这个技术。

想要解锁更多新姿势?请访问我的博客

什么是webservice

webservice也可以叫xml web service webservice(在javax.jws), 轻量级的独立的通讯技术

  1. 基于web的服务:服务端提供的服务接口让客户端访问

  2. 跨平台、跨语言的整合方案

为什么要使用webservice

相比RMI,它是以前比较好的跨语言调用的解决方案

就譬如说,一个电商平台,订单可以查看物流状态。,这可能就是.net实现的webservice服务接口。

webservice中的一些概念

WSDL(web service definition language webservice 定义语言)

webservice服务需要通过wsdl文件来说明自己有什么服务可以对外调用。并且有哪些方法、方法里面有哪些参数

wsdl基于XML(可扩展标记语言)去定义了

  1. 对应一个.wsdl的文件类型

  2. 定义了webservice的服务器端和客户端应用进行交互的传递数据和响应数据格式和方式

  3. 一个webservice对应唯一一个wsdl文档

SOAP(simple object access protocal简单对象访问协议)

差不多就是http+xml,什么意思呢?webservice通过http协议发送和接收请求时, 发送的内容(请求报文)和接收的内容(响应报文)都是采用xml格式进行封装,这些特定的HTTP消息头和XML内容格式就是SOAP协议。

一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:

• Envelope 元素,标识XML 文档一条 SOAP 消息

• Header 元素,包含头部信息的XML标签

• Body 元素,包含所有的调用和响应的主体信息的标签

• Fault 元素,错误信息标签。

插一句嘴,现在的呢,基于RESTful接口的都是http+json

回到主题,什么是soap?

  1. 一种简单、基于HTTP和XML的协议

  2. soap消息:请求和响应消息

  3. http+xml报文

SEI(webservice endpoint interface webservice的终端接口)

webservice服务端用来处理请求的接口,也就是发布出去的接口。

Demo

如何实现呢?写一个小demo

首先是服务端的接口

1
2
3
4
5
6
@WebService//SEI以及实现类
public interface ISayHello {

@WebMethod//sei中的方法
public String sayHello();
}

具体实现类

1
2
3
4
5
6
7
8
9
@WebService
public class SayHello implements ISayHello{

@Override
public String sayHello() {
return "hello";

}
}

启动类

1
2
3
4
5
6
7
8
public class Bootstrap {
public static void main(String[] args) {
//终端发布~
Endpoint.publish("http://localhost:8888/tech/hello",new SayHello());
System.out.println("发布成功~");

}
}

接着我们启动程序。到浏览器输入url+”?wsdl”就可以查看wsdl文档了

1532855168339

接下来在IDEA中打开terminal或者直接进入cmd,调用wsimport工具,输入命令:

1
wsimport -keep http://localhost:8888/tech/hello?wsdl

这里简介一下參数:

  1. -d 表示输出的文件夹。文件夹必须事先存在,否则导出失败。
  2. -keep 表示导出webservice的class文件时是否也导出源码java文件。
  3. -verbose verbose表示具体信息。

1532857279266

这时候生成的客户端代码

1532857770651

迁移到IDEA打开,新建一个demo

1
2
3
4
5
6
7
public class Demo {
public static void main(String[] args) {
SayHelloService service=new SayHelloService();
SayHello sayHello= (SayHello) service.getSayHelloPort();
System.out.println();
}
}

demo完成~!

关于WSDL文档

下面说说wsdl文档各个标签的含义

wsdl

Types标签

定义整服务端的数据报文

Schema标签

为了实现最大的互操作性(interoperability)和平台中立性(neutrality),WSDL选用XML Schema DataTypes,简称XSD作为标准类型系统,并将它作为固有类型系统。

图中的是数据定义部分,该部分定义了两个元素,一个是sayHello,一个是sayHelloResponse:

  • sayHello:定义了一个复杂类型,仅仅包含一个简单的字符串,将来用来描述操作的参入传入部分;
  • sayHelloResponse:定义了一个复杂类型,仅仅包含一个简单的字符串,将来用来描述操作的返回值;

Message标签

定义元素数据类型

Porttype

定义服务器端的SEI

input/output属性:指定输入输出的数据类型

Binding标签

type属性:引用PortType

service标签

表示服务器端的一个webservice容器

name属性:制定客户端属性

prot属性:指定客户端的容器类

address:大部分全部webservice的地址

1532860870497

过去的Webservice工具

发个名字留作备份,因为现在早已不用复杂的webservice了

cxf

celtix+xfire

axis

结束
此片完了~ 想要了解更多精彩新姿势?
请访问我的个人博客 本篇为原创内容,已在个人博客率先发表,随后CSDN,segmentfault,掘金,简书,开源中国同步发出。如有雷同,缘分呢兄弟。赶快加个好友,咱们两个想个号码, 买个彩票,先挣他个几百万😝

-------------本稿が終わる感谢您的阅读-------------