这几天在对接一个传统企业的项目,没错,就是我一直以来最鄙视的JAVA EE企业开发项目。看了两天的文档,Oracle、IBM、Mule等等ESB知识,和SOAP、XML、XSLT等知识。很多笔记都在公司的电脑里没带出来(并不是不能带,只是为了公司安全起见,不带),所以这里只记载一些记得住的想法。

关于ESB

大企业的项目用的是ESB(Enterprises Service Bus)中间件进行通信,类似于网络中的一个hub,可以将不同架构、不同语言的接口统一成相互之间都可以通信的形式,一般是用XML。

SOAP即简单对象访问协议

(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。例如,你可以使用 SMTP,即因特网电子邮件协议来传递SOAP消息,这可是很有诱惑力的。在传输层之间的头是不同的,但XML有效负载保持相同。

调用RPC与消息传递

Web Service本身其实是在实现应用程序间的通信。我们有两种应用程序通信的方法:RPC远程过程调用 和消息传递。使用RPC的时候,客户端的概念是调用服务器上的远程过程,通常方式为实例化一个远程对象并调用其方法和属性。RPC系统试图达到一种位置上的透明性:服务器暴露出远程对象的接口,而客户端就好像在本地使用的这些对象的接口一样,这样就隐藏了底层的信息,客户端也就根本不需要知道对象是在哪台机器上。

什么是Web Service

对这个问题,我们至少有两种答案。从表面上看,Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。例如,你想创建一个Web service ,它的作用是返回当前的天气情况。那么你可以建立一个ASP页面,它接受邮政编码作为查询字符串,然后返回一个由逗号隔开的字符串,包含了当前的气温和天气。要调用这个ASP页面,客户端需要发送下面的这个HTTP GET
返回的数据就应该是这样:
这个ASP页面就应该可以算作是Web service 了。因为它基于HTTP GET请求,暴露出了一个可以通过Web调用的API。当然,Web service 还有更多的东西。
下面是对Web service 更精确的解释: Web services是建立可互操作的分布式应用程序的新平台。作为一个Windows程序员,你可能已经用COM或DCOM建立过基于组件的分布式应用程序。COM是一个非常好的组件技术,但是我们也很容易举出COM并不能满足要求的情况。
Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。

python 进行SOAP通信, 使用Zeep

python 有很多包可以进行soap通信,即后缀是以?wsdl结尾的url接口。查阅了一大堆资料后,选择了zeep这个模块,它对soap进行了很好的封装。
官网代码大致如下:

from zeep import Client

client = Client('http://www.webservicex.net/ConvertSpeed.asmx?WSDL')
result = client.service.ConvertSpeed(
    100, 'kilometersPerhour', 'milesPerhour')

assert result == 62.137

可以看到,非常地简单,其中ConvertSpeed是wsdl中描述的传入服务接口(应该是称之为接口吧?毕竟我还没实现过soap服务,但我的理解就是如此,一个wsdl文件可以包含有多个接口,传入其指定的参数,可以获得相应的响应)

在企业开发中,不需要考虑大并发,假设企业中有10000个人对一个接口有需求,每个人一天请求5次,那么一天也才50000次请求,分散在24小时==86400s中,平均不到1s/1次,所以只要接口有异常处理,不会因为数据不对而崩溃即可,不需要进行什么高并发的优化。用nginx进行负载均衡就够了。