zoukankan      html  css  js  c++  java
  • 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的包

    <dependency>
        <groupId>com.caucho</groupId>
        <artifactId>hessian</artifactId>
        <version>4.0.7</version>
    </dependency>

    provider

    pom.xml 需要引入 hessian,jetty的包(Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现)

    <dependency>
        <groupId>com.caucho</groupId>
        <artifactId>hessian</artifactId>
        <version>4.0.7</version>
    </dependency>
    <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty</artifactId>
        <version>6.1.26</version>
    </dependency>

    provider.xml 需要配置hessian协议,并给service设置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
        xsi:schemaLocation="http://www.springframework.org/schema/beans  
      http://www.springframework.org/schema/beans/spring-beans.xsd  
      http://code.alibabatech.com/schema/dubbo
      http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="provider" />
    
        <!-- 使用zookeeper注册中心暴露服务地址 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    
        <!-- 监控中心 -->
        <dubbo:monitor protocol="registry" />
    
        <!-- 暴露服务 -->
        <dubbo:protocol name="dubbo" port="20886" />
        <dubbo:protocol name="hessian" port="20887"/>
    
        <dubbo:service interface="com.dingcheng.user.facade.UserFacade" ref="userFacade" />
    
        <!-- 需要指定hessian协议,否则会在上面设置的协议中随机调用,就会一会成功一会失败 -->
        <dubbo:service protocol="hessian" interface="com.dingcheng.user.facade.UploadFacade" ref="uploadFacade" />
    </beans>

    其中 就是默认的 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个。

  • 相关阅读:
    二项式定理与组合恒等式
    「CEOI2020」象棋世界 题解
    矩阵 题解
    研一总结
    你明白transform中的skew属性是何如变换的吗?
    pip安装包
    Yaml中特殊符号"| > |+ |-"的作用
    使用ROOT用户运行Jenkins
    检查MySQL主从复制运行状态
    powerdesigner 怎么逆向生成 pdm文件
  • 原文地址:https://www.cnblogs.com/zhaixingzhu/p/12569156.html
Copyright © 2011-2022 走看看