dubbo内部通信用的啥协议
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo内部通信用的啥协议相关的知识,希望对你有一定的参考价值。
dubbo内部通信用的什么协议dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp协议)、http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持)、hessian(二进制序列化 + http协议)、WebServices (文本序列化 + http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化 + http协议)的支持。
有鉴于此,我们基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写),为dubbo提供了接近透明的REST调用支持。由于完全兼容Java标准API,所以为dubbo开发的所有REST服务,未来脱离dubbo或者任何特定的REST底层实现一般也可以正常运行。 参考技术A
dubbo内部通信用的什么协议
dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp协议)、http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持)、hessian(二进制序列化 + http协议)、WebServices (文本序列化 + http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化 + http协议)的支持。
有鉴于此,我们基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写),为dubbo提供了接近透明的REST调用支持。由于完全兼容Java标准API,所以为dubbo开发的所有REST服务,未来脱离dubbo或者任何特定的REST底层实现一般也可以正常运行。
Dubbo
达博市位于澳大利亚新南威尔士州西北部,是澳大利亚发展最快的内陆城市,人口38000,面积3321平方公里。全年气候温和湿润,年平均降雨量588毫米,冬天平均气温16℃,最低3.8℃;夏天平均31.2℃,最高38℃。地理位置优越,是新南威尔士州重要的公路、铁路和空中运输枢纽。
旅游业是达博经济的一个重要组成部分。境内旅游资源丰富,设施也较齐全。这里是人们去沿海旅游的一个重要驿站。市内有不少具有地方特色的旅游景点及历史文化遗迹,其中闻名世界的"西部平原动物园"是澳大利亚最大的露天动物园。
农业是达博经济的支柱产业,为俄勒那地区提供了20%的就业机会;达博的畜牧业发达,是澳大利亚东部最大的畜产销售中心;达博还是新南威尔士州俄勒那及远西地区的医疗服务中心和新南威尔士州重要的销售和服务中心,其原料产品和矿产物的出口占整个新南威尔士州的25%。
Dubbo服务 上传文件解决方案以及Hessian协议
协议支持
Dubbo支持多种协议,如下所示:
- Dubbo协议
- Hessian协议
- HTTP协议
- RMI协议
- WebService协议
- Thrift协议
- Memcached协议
- Redis协议
在通信过程中,不同的服务等级一般对应着不同的服务质量,那么选择合适的协议便是一件非常重要的事情。你可以根据你应用的创建来选择。例如,使用RMI协议,一般会受到防火墙的限制,所以对于外部与内部进行通信的场景,就不要使用RMI协议,而是基于HTTP协议或者Hessian协议。
dubbo服务不支持File文件类型的参数,远程调用是这样的:接口调用实际就是数据的发送过程,File 这样的类型是不能够序列化的,因为File 不是数据,只是一个磁盘文件的抽象。
解决方案:
- 使用hessian协议进行传输 (参照dubbo 官网,或者搜索dubbo hessian )
- 将文件转换成byte[]继续使用dubbo协议(这种情况一般用于上传文件跟业务有关联)
我们这里使用hessian协议进行传输(当然也可以转换成byte[]继续使用dubbo协议)
下面是需要进行的配置
customer
需要引入hessian的包
provider
pom.xml 需要引入 hessian,jetty的包(Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现)
provider.xml 需要配置hessian协议,并给service设置
其中 就是默认的 server="jetty", 如果设置server="servlet",则需要web容器支持,我们的provider是以jar方式运行的,所以不适用这种.
dubbo和hessiant特性
根据官方说明:Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况
Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务。适用场景:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。因此比较高效的做法是带上传下载文件的服务使用hessian协议,去普通的服务使用dubbo协议。
Hessian以InputStream 做参数注意事项
Hessian 以InputStream 做参数的原理: 首先hessian要求inputstream 参数只能是参数列表中的最后一个,客户端顺序发送各个参数,直到最后一个inputstream对象,读取其内容,并写入输出流。
服务端获取到请求输入流后,按参数顺序进行反序列化,直到遇到类型为InputStream的参数时,创建一个InputStream对象,实现InputStream的接口,其行为是从 输入流读取数据,该对象返回给开发者后就可以自由读取流中剩余的数据了(也就是传参时从inputstream读取出的所有数据)。
对于返回值是InputStream的情况,有两种,一种是返回值就是一个InputStream对象,则服务端从中读取数据并写入输出流,和输入参数为InputStream的情况类似。
另一种是返回一个对象,对象中包含InputStream类型的字段,这时一定要注意,InputStream字段一定是所有非基本类型字段里的最后一个,原因同入参的情况一样。 另外就是inputstream类型字段不能超过1个。
以上是关于dubbo内部通信用的啥协议的主要内容,如果未能解决你的问题,请参考以下文章
JavaWebHttp网络协议包 --- 网络协议包概述;Http请求协议包内部空间;Http响应协议包内部结构;第二版互联网通信流程图