很多RPC技术都会使用中间语言来定义接口描述,比如Web Service常用的WSDL, Thrift使用的IDL。

这类文件都是接口定义/描述语言 (Interface Definition/Description Language),有几个特点:

1. 采用中间语言来描述接口,以及接口使用到的数据结构(类)

2. 一般都采用文本文件,方便传递

3. 语法上可以使用XML,也可以自定义格式。使用XML的话有一堆工具可以进行读写和直接映射到类/对象。使用自定义格式的话需要自己写解析

需要理解的是,从RPC调用的过程来说,IDL不是RPC的必要组件,它的存在主要是为了支持跨语言调用,通过IDL,可以使用工具生成不同平台下的接口定义和相关的类定义,从本质上说IDL只是描述接口的数据结构的一种方式,更通俗的说,是描述消息的一种方式。

因为RPC本质上来说就是不同主机之间的消息传递,只是这种消息是一个方法而已。所以通过IDL可以让不同语言下的程序拿到统一含义的消息描述。

如果不是跨语言的RPC调用,根本不需要IDL来描述接口,可以直接把定义接口和相关数据结构的类打包,比如取名叫api.jar,服务发布方把api.jar直接发布出去。服务消费者拿到api.jar之后实际上就拿到了消息的数据结构,可以在本地直接使用这些数据结构,保证服务消费者向服务提供方发送的消息是符合约定的。

当然,使用IDL的话,可以让组织外部或者不方便拿到api.jar的人根据IDL来生产接口的数据结构,但请记住,IDL不是RPC的必要组件,它只是为了提供一种描述接口的数据结构,让服务的消费者可以根据它来生成本地的数据结构,从而发送正确格式的消息。

使用Web Service来举例,服务发布方直接使用POJO定义一个HelloService服务,不需要WSDL来描述接口

package test;public interface HelloService {public String sayHello(String name);}

服务发布方实现HelloService 服务

package test;import java.text.SimpleDateFormat;
import java.util.Date;import org.apache.cxf.frontend.ServerFactoryBean;public class HelloServiceImpl implements HelloService{public String sayHello(String name) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("sayHello()... name:" + name);return sdf.format(new Date()) + " hello " + name;}public static void main(String[] args) {ServerFactoryBean bean = new ServerFactoryBean();// 服务的发布地址bean.setAddress("http://localhost:9001/HelloService");// 提供服务的类的类型bean.setServiceClass(HelloService.class);// 提供服务的实例bean.setServiceBean(new HelloServiceImpl());// 发布服务 publish()...bean.create();System.out.println("server ready...");}
}

服务消费方拿到服务发布方给的HelloService.class类,可以直接用HelloService的类型在本地生成代理,不需要先使用WSDL在本地来生成HelloService的数据结构。

package test;import org.apache.cxf.frontend.ClientProxyFactoryBean;public class HelloServiceClient {public static void main(String[] args) {// 创建WebService客户端代理工厂ClientProxyFactoryBean factory = new ClientProxyFactoryBean();// 注册WebService接口factory.setServiceClass(HelloService.class);// 设置WebService地址factory.setAddress("http://localhost:9001/HelloService");HelloService iHelloWorld = (HelloService) factory.create();System.out.println("invoke webservice");System.out.println("message context is:" + iHelloWorld.sayHello("Josen"));System.exit(0);}
}

执行结果:

理解WSDL,IDL相关推荐

  1. ONVIF协议网络摄像机(IPC)客户端程序开发(3):理解什么是Web Services

    ONVIF协议网络摄像机(IPC)客户端程序开发(3):理解什么是Web Services 1. 专栏导读 本专栏第一篇文章「专栏开篇」列出了专栏的完整目录,按目录顺序阅读,有助于你的理解,专栏前面文 ...

  2. Java应用通过wsdl文件调用webservice

    当远程webservice提供的wsdl文件不规范,你使用各种webservice客户端框架工具都调用失败时,不妨采用最原始的调用方式,这种方式让你拥有最高的控制权和灵活度,一定能为你解决webser ...

  3. Onvif协议:理解什么是Web Services

    ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供.要理解什么是ONVIF,就必须先知道什么是Web Services.所以,开始介绍ONVIF之前,我单独整理了一篇 ...

  4. Web服务和WSDL简介

    在"使用 WSDL 部署 Web 服务"系列中,Bilal 将研究创建.部署和发布 Web 服务的所有主要技术方面 - 从 Web 服务描述语言(WSDL),到简单对象访问协议(S ...

  5. 描述 Web 服务:WSDL

    Web 服务描述语言(Web Services Description Language,WSDL)是一种基于 XML 的格式,它正在成为一种业界标准,用于以与实现无关的方式描述 Web 服务.将创建 ...

  6. 使用suds-py3调用webservice WSDL接口

    使用suds-py3调用webservice WSDL接口 应用场景:我们需要通过Python调用webservice的接口,这需要使用到第三方库suds,这篇文章介绍使用suds-py3调用webs ...

  7. WebService初入

    WebService 1. WebService基本认识 WebService最早是微软提出了一种以XML为载体网络信息传输的规范,现在几乎所有的语言与平台都支持,带有状态机制,不依赖于容器,可以发送 ...

  8. MVC面试问题与答案

    读这篇文章不意味着你一定要去并且能搞定MVC面试.这篇文章的目的是在面试之前让你快速复习MVC知识.这篇文章也不是MVC培训课程. 如果你想学习MVC,从这儿开始 Learn MVC ( Model ...

  9. WebService 及java网络编程等基础概念(一)

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/u014401141/article/ ...

最新文章

  1. css 背景样式学习
  2. python读取文件名-Python获取指定文件夹下的文件名的方法
  3. 无法安装ie8,因为其他程序或更新正在等待重启您的计算机,ie8 因为其他程序或更新正在等待重新启...
  4. Spring Boot 配置加载顺序详解
  5. php图片变成代码怎么解决,一段图片处理代码PHP代码转C#代码,该怎么解决
  6. python入门系列:深入Python的set和dict
  7. 社区出入登记源码1.0.53完整安装包+小程序前端+公众号
  8. eclipse中设置编码格式
  9. 技术提升为管理,最重要的能力是什么?
  10. 数据挖掘:数据预处理相关概念
  11. R语言基于ggplot绘制多条ROC曲线
  12. 自动定量包装机机械及控制系统设计(PLC控制)
  13. 基于 Spark 的文本情感分析
  14. 在Ubuntu服务器中挂载Google网络硬盘
  15. 科研伦理与学术规范期末考试1题库
  16. 中央大学计算机学什么,中央大学讲解
  17. python实现视频ai换脸_Python如何实现AI换脸功能 Python实现AI换脸功能代码
  18. Android基础——Alarm
  19. 图片裁剪指定矩形区域(Python)
  20. 第三章微分中值定理及导数应用(方程的根)

热门文章

  1. VisualSVN server 备份恢复
  2. 昨晚深夜听到清青门前有个女生在哭
  3. 用视频编辑软件给音频降噪的方法
  4. 新鸟初入PHP行业6个月总结心得
  5. mysql using temporary_执行计划中Using filesort,Using temporary相关语句的优化解决_MySQL
  6. ( 杰理 AC695x ) 板级文件的配置
  7. 用百行Python代码写一个关于德州扑克的类
  8. 人在旅途——》张家界之旅:20180418
  9. 部署ceph分布式存储集群
  10. linux显示文件的第一行数据库,Linux练习题