微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

01节-初学dubbo

文章目录

1. dubbo架构

节点角色说明

dubbo架构中存在4种(5种)角色,如下图所示:

dubbo-architucture

节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数调用间的监控中心
Container 服务运行容器

节点启动流程

@H_404_184@
  • 服务容器负责启动,加载,运行服务提供者
  • 服务提供者在启动时,向注册中心注册自己提供的服务
  • 服务消费者在启动时,向注册中心订阅自己所需的服务
  • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  • 服务消费者,从提供者地址列表中,基于负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
  • 服务消费者和提供者,在内存中累计调用次数调用时间,定时每分钟发送一次统计数据到监控中心。
  • 思考的问题

    生产者和消费者都连接注册中心,注册中心的压力不会大吗?

    注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在**启动时注册中心交互,注册中心不转发请求**,压力较小

    注册中心宕机后,消费者和生产者还能够正常通信吗?

    注册中心全部宕机,不影响**已运行的提供者和消费者,消费者在本地缓存了提供者列表,生产者不能注册新的服务**。

    其余问题可以参考dubbo官方文档中, 连通性、健壮性、伸缩性、可升级性 的详细介绍。

    2. XML配置

    dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 dubbo 的配置即可,dubbo 基于 Spring 的 Schema 扩展进行加载。

    有关 XML 的详细配置项,请参见:配置参考手册。如果不想使用 Spring 配置,而希望通过 API 的方式进行调用,请参见:API配置

    请在此查看文档描述的完整示例

    XML Schema

    首先,需要引入XML Schema: http://dubbo.apache.org/schema/dubbo/dubbo.xsd。

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
        
       <!-- Todo -->
        
    </beans>
    

    标签

    接下来duboo的标签如下:

    标签 用途 解释
    <dubbo:service/> 服务配置 用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心
    <dubbo:reference/> 引用配置 用于创建一个远程服务代理,一个引用可以指向多个注册中心
    <dubbo:protocol/> 协议配置 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受
    <dubbo:application/> 应用配置 用于配置当前应用信息,不管该应用是提供者还是消费者
    <dubbo:module/> 模块配置 用于配置当前模块信息,可选
    <dubbo:registry/> 注册中心配置 用于配置连接注册中心相关信息
    <dubbo:monitor/> 监控中心配置 用于配置连接监控中心相关信息,可选
    <dubbo:provider/> 提供方配置 当 ProtocolConfig 和 ServiceConfig属性没有配置时,采用此缺省值,可选
    <dubbo:consumer/> 消费方配置 当 ReferenceConfig属性没有配置时,采用此缺省值,可选
    <dubbo:method/> 方法配置 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息
    <dubbo:argument/> 参数配置 用于指定方法参数配置

    具体各个标签中的属性配置,参考官方文档

    示例

    provider.xml 示例

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
        <dubbo:application name="demo-provider"/>
        <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
        <dubbo:protocol name="dubbo" port="20890"/>
        <bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
        <dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>
    </beans>
    

    consumer.xml示例

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
        <dubbo:application name="demo-consumer"/>
        <dubbo:registry group="aaa" address="zookeeper://127.0.0.1:2181"/>
        <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.samples.basic.api.DemoService"/>
    </beans>
    

    不同粒度配置的覆盖关系

    以 timeout 为例,下图显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似:

    • 方法级优先,接口级次之,全局配置再次之
    • 如果级别一样,则消费方优先,提供方次之

    其中,服务提供方配置,通过 URL 经由注册中心传递给消费方。

    3. 常用功能

    隐式传参

    可以通过 RpcContext 上的 setAttachmentgetAttachment 在服务消费方和提供方之间进行参数的隐式传递。

    在服务消费方端设置隐式参数

    setAttachment 设置的 KV 对,在完成下面一次远程调用会被清空,即多次远程调用要多次设置。

    // 隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,用于框架集成,不建议常规业务使用
    RpcContext.getContext().setAttachment("index", "1"); 
    // 远程调用
    xxxService.xxx(); 
    // ...
    

    在服务提供方端获取隐式参数

    public class XxxServiceImpl implements XxxService {
     
        public void xxx() {
            // 获取客户端隐式传入的参数,用于框架集成,不建议常规业务使用
            String index = RpcContext.getContext().getAttachment("index"); 
        }
    }
    

    注意:path, group, version, dubbo, token, timeout 几个 key 是保留字段,请使用其它值

    参数验证

    参数验证功能是基于 JSR303 实现的,用户只需标识 JSR303 标准的验证 annotation,并通过声明 filter 来实现验证。

    Maven 依赖

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.0.0.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>4.2.0.Final</version>
    </dependency>
    

    参数标注示例

    import java.io.Serializable;
    import java.util.Date;
     
    import javax.validation.constraints.Future;
    import javax.validation.constraints.Max;
    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Past;
    import javax.validation.constraints.Pattern;
    import javax.validation.constraints.Size;
     
    public class ValidationParameter implements Serializable {
        private static final long serialVersionUID = 7158911668568000392L;
     
        @NotNull // 不允许为空
        @Size(min = 1, max = 20) // 长度或大小范围
        private String name;
     
        @NotNull(groups = ValidationService.Save.class) // 保存时不允许为空,更新时允许为空 ,表示不更新该字段
        @Pattern(regexp = "^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$")
        private String email;
     
        @Min(18) // 最小值
        @Max(100) // 最大值
        private int age;
     
        @Past // 必须为一个过去的时间
        private Date loginDate;
     
        @Future // 必须为一个未来的时间
        private Date expiryDate;
     
        // set get
    }
    

    分组验证示例

    public interface ValidationService { // 缺省可按服务接口区分验证场景,如:@NotNull(groups = ValidationService.class)   
        @interface Save{} // 与方法同名接口,首字母大写,用于区分验证场景,如:@NotNull(groups = ValidationService.Save.class),可选
        void save(ValidationParameter parameter);
        void update(ValidationParameter parameter);
    }
    

    关联验证示例

    import javax.validation.GroupSequence;
     
    public interface ValidationService {   
        @GroupSequence(Update.class) // 同时验证Update组规则
        @interface Save{}
        void save(ValidationParameter parameter);
     
        @interface Update{} 
        void update(ValidationParameter parameter);
    }
    

    参数验证示例

    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotNull;
     
    public interface ValidationService {
        void save(@NotNull ValidationParameter parameter); // 验证参数不为空
        void delete(@Min(1) int id); // 直接对基本类型参数验证
    }
    

    在客户端验证参数

    <dubbo:reference id="validationService" interface="org.apache.dubbo.examples.validation.api.ValidationService" validation="true" />
    

    在服务器端验证参数

    <dubbo:service interface="org.apache.dubbo.examples.validation.api.ValidationService" ref="validationService" validation="true" />
    

    验证异常信息

    import javax.validation.ConstraintViolationException;
    import javax.validation.ConstraintViolationException;
     
    import org.springframework.context.support.ClasspathXmlApplicationContext;
     
    import org.apache.dubbo.examples.validation.api.ValidationParameter;
    import org.apache.dubbo.examples.validation.api.ValidationService;
    import org.apache.dubbo.rpc.RpcException;
     
    public class ValidationConsumer {   
        public static void main(String[] args) throws Exception {
            String config = ValidationConsumer.class.getPackage().getName().replace('.', '/') + "/validation-consumer.xml";
            ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext(config);
            context.start();
            ValidationService validationService = (ValidationService)context.getBean("validationService");
            // Error
            try {
                parameter = new ValidationParameter();
                validationService.save(parameter);
                System.out.println("Validation ERROR");
            } catch (RpcException e) { // 抛出的是RpcException
                ConstraintViolationException ve = (ConstraintViolationException) e.getCause(); // 里面嵌了一个ConstraintViolationException
                Set<ConstraintViolation<?>> violations = ve.getConstraintViolations(); // 可以拿到一个验证错误详细信息的集合
                System.out.println(violations);
            }
        } 
    }
    

    过滤器

    扩展说明

    服务提供方和服务消费方调用过程拦截dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响。

    约定:

    • 用户自定义 filter 认在内置 filter 之后。
    • 特殊值 default,表示缺省扩展点插入的位置。比如:filter="xxx,default,yyy",表示 xxx 在缺省 filter 之前,yyy 在缺省 filter 之后。
    • 特殊符号 -,表示剔除。比如:filter="-foo1",剔除添加缺省扩展点 foo1。比如:filter="-default",剔除添加所有缺省扩展点。
    • provider 和 service 同时配置的 filter 时,累加所有 filter,而不是覆盖。比如:<dubbo:provider filter="xxx,yyy"/><dubbo:service filter="aaa,bbb" />,则 xxx,yyy,aaa,bbb 均会生效。如果要覆盖,需配置:<dubbo:service filter="-xxx,-yyy,aaa,bbb" />

    扩展接口

    org.apache.dubbo.rpc.Filter
    

    扩展配置

    <!-- 消费方调用过程拦截 -->
    <dubbo:reference filter="xxx,yyy" />
    <!-- 消费方调用过程缺省拦截器,将拦截所有reference -->
    <dubbo:consumer filter="xxx,yyy"/>
    <!-- 提供方调用过程拦截 -->
    <dubbo:service filter="xxx,yyy" />
    <!-- 提供方调用过程缺省拦截器,将拦截所有service -->
    <dubbo:provider filter="xxx,yyy"/>
    

    已知扩展

    • org.apache.dubbo.rpc.filter.EchoFilter
    • org.apache.dubbo.rpc.filter.GenericFilter
    • org.apache.dubbo.rpc.filter.GenericImplFilter
    • org.apache.dubbo.rpc.filter.TokenFilter
    • org.apache.dubbo.rpc.filter.AccessLogFilter
    • org.apache.dubbo.rpc.filter.CountFilter
    • org.apache.dubbo.rpc.filter.ActiveLimitFilter
    • org.apache.dubbo.rpc.filter.ClassLoaderFilter
    • org.apache.dubbo.rpc.filter.ContextFilter
    • org.apache.dubbo.rpc.filter.ConsumerContextFilter
    • org.apache.dubbo.rpc.filter.ExceptionFilter
    • org.apache.dubbo.rpc.filter.ExecuteLimitFilter
    • org.apache.dubbo.rpc.filter.DeprecatedFilter

    扩展示例

    Maven 项目结构:

    src
     |-main
        |-java
            |-com
                |-xxx
                    |-XxxFilter.java (实现Filter接口)
        |-resources
            |-meta-inf
                |-dubbo
                    |-org.apache.dubbo.rpc.Filter (纯文本文件内容为:xxx=com.xxx.XxxFilter)
    

    XxxFilter.java:

    package com.xxx;
     
    import org.apache.dubbo.rpc.Filter;
    import org.apache.dubbo.rpc.Invoker;
    import org.apache.dubbo.rpc.Invocation;
    import org.apache.dubbo.rpc.Result;
    import org.apache.dubbo.rpc.RpcException;
     
    public class XxxFilter implements Filter {
        public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
            // before filter ...
            Result result = invoker.invoke(invocation);
            // after filter ...
            return result;
        }
    }
    

    meta-inf/dubbo/org.apache.dubbo.rpc.Filter:

    xxx=com.xxx.XxxFilter
    

    异步调用(V2.7三大新特性之一)

    Consumer异步调用

    从v2.7.0开始,dubbo的所有异步编程接口开始以CompletableFuture为基础,基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。

    [外链图片转存失败(img-pRViVkeF-1562632091737)(https://github.com/bye500/image/blob/master/dubbo/future.jpg?raw=true)]

    使用CompletableFuture签名的接口

    需要服务提供者事先定义CompletableFuture签名的服务,具体参见服务端异步执行接口定义:

    public interface AsyncService {
        CompletableFuture<String> sayHello(String name);
    }
    

    注意接口的返回类型是CompletableFuture<String>

    XML引用服务:

    <dubbo:reference id="asyncService" timeout="10000" interface="com.alibaba.dubbo.samples.async.api.AsyncService"/>
    

    调用远程服务:

    // 调用直接返回CompletableFuture
    CompletableFuture<String> future = asyncService.sayHello("async call request");
    // 增加回调
    future.whenComplete((v, t) -> {
        if (t != null) {
            t.printstacktrace();
        } else {
            System.out.println("Response: " + v);
        }
    });
    // 早于结果输出
    System.out.println("Executed before response return.");
    
    使用RpcContext

    在 consumer.xml 中配置:

    <dubbo:reference id="asyncService" interface="org.apache.dubbo.samples.governance.api.AsyncService">
          <dubbo:method name="sayHello" async="true" />
    </dubbo:reference>
    

    调用代码:

    // 此调用会立即返回null
    asyncService.sayHello("world");
    // 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future
    CompletableFuture<String> helloFuture = RpcContext.getContext().getCompletableFuture();
    // 为Future添加回调
    helloFuture.whenComplete((retValue, exception) -> {
        if (exception == null) {
            System.out.println(retValue);
        } else {
            exception.printstacktrace();
        }
    });
    

    或者,你也可以这样做异步调用:

    CompletableFuture<String> future = RpcContext.getContext().asyncCall(
        () -> {
            asyncService.sayHello("oneway call request1");
        }
    );
    
    future.get();
    
    重载服务接口

    如果你只有这样的同步服务定义,而又不喜欢RpcContext的异步使用方式。

    public interface GreetingsService {
        String sayHi(String name);
    }
    

    那还有一种方式,就是利用Java 8提供的default接口实现,重载一个带有带有CompletableFuture签名的方法

    有两种方式来实现:

    @H_404_184@
  • 提供方或消费方自己修改接口签名
  • public interface GreetingsService {
        String sayHi(String name);
        
        // AsyncSignal is totally optional, you can use any parameter type as long as java allows your to do that.
        default CompletableFuture<String> sayHi(String name, AsyncSignal signal) {
            return CompletableFuture.completedFuture(sayHi(name));
        }
    }
    
    @H_404_184@
  • dubbo官方提供compiler hacker,编译期自动重写同步方法,请在此讨论和跟进具体进展。
  • 你也可以设置是否等待消息发出: [1]

    • sent="true" 等待消息发出,消息发送失败将抛出异常。
    • sent="false" 不等待消息发出,将消息放入 IO 队列,即刻返回。
    <dubbo:method name="findFoo" async="true" sent="true" />
    

    如果你只是想异步,完全忽略返回值,可以配置 return="false",以减少 Future 对象的创建和管理成本:

    <dubbo:method name="findFoo" async="true" return="false" />
    

    Provider端异步执行将阻塞的业务从dubbo内部线程池切换到业务自定义线程,避免dubbo线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无益于节省资源或提升RPC响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。

    注意:Provider端异步执行和Consumer端异步调用是相互独立的,你可以任意正交组合两端配置

    • Consumer同步 - Provider同步
    • Consumer异步 - Provider同步
    • Consumer同步 - Provider异步
    • Consumer异步 - Provider异步

    Provider异步执行

    定义CompletableFuture签名的接口

    服务接口定义:

    public interface AsyncService {
        CompletableFuture<String> sayHello(String name);
    }
    

    服务实现:

    public class AsyncServiceImpl implements AsyncService {
        @Override
        public CompletableFuture<String> sayHello(String name) {
            RpcContext savedContext = RpcContext.getContext();
            // 建议为supplyAsync提供自定义线程池,避免使用JDK公用线程池
            return CompletableFuture.supplyAsync(() -> {
                System.out.println(savedContext.getAttachment("consumer-key1"));
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printstacktrace();
                }
                return "async response from provider.";
            });
        }
    }
    

    通过return CompletableFuture.supplyAsync(),业务执行已从dubbo线程切换到业务线程,避免了对dubbo线程池的阻塞。

    使用AsyncContext

    dubbo提供了一个类似Serverlet 3.0的异步接口AsyncContext,在没有CompletableFuture签名接口的情况下,也可以实现Provider端的异步执行。

    服务接口定义:

    public interface AsyncService {
        String sayHello(String name);
    }
    

    服务暴露,和普通服务完全一致:

    <bean id="asyncService" class="org.apache.dubbo.samples.governance.impl.AsyncServiceImpl"/>
    <dubbo:service interface="org.apache.dubbo.samples.governance.api.AsyncService" ref="asyncService"/>
    

    服务实现:

    public class AsyncServiceImpl implements AsyncService {
        public String sayHello(String name) {
            final AsyncContext asyncContext = RpcContext.startAsync();
            new Thread(() -> {
                // 如果要使用上下文,则必须要放在第一句执行
                asyncContext.signalContextSwitch();
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printstacktrace();
                }
                // 写回响应
                asyncContext.write("Hello " + name + ", response from provider.");
            }).start();
            return null;
        }
    }
    

    其他功能

    其他功能参考官方文档

    4. 负载均衡

    集群负载均衡时,dubbo 提供了多种均衡策略,共有4种。

    @H_404_184@
  • Random LoadBalance:随机
  • RoundRobin LoadBalance:轮询
  • LeastActive LoadBalance:最少活跃调用
  • ConsistentHash LoadBalance:一致性hash
  • 缺省为 random 随机调用各个算法源码阅读点这里负载均衡扩展示例点这里

    Random LoadBalance

    • 随机,按权重设置随机概率。
    • 一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

    RoundRobin LoadBalance

    • 轮询,按公约后的权重设置轮询比率。
    • 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

    LeastActive LoadBalance

    • 最少活跃调用,相同活跃数的随机,活跃数指调用前后计数差。
    • 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

    ConsistentHash LoadBalance

    • 一致性 Hash,相同参数的请求总是发到同一提供者。
    • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
    • 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing
    • 缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" />
    • 缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />

    配置示例

    服务端服务级别

    <dubbo:service interface="..." loadbalance="roundrobin" />
    

    客户端服务级别

    <dubbo:reference interface="..." loadbalance="roundrobin" />
    

    服务端方法级别

    <dubbo:service interface="...">
        <dubbo:method name="..." loadbalance="roundrobin"/>
    </dubbo:service>
    

    客户端方法级别

    <dubbo:reference interface="...">
        <dubbo:method name="..." loadbalance="roundrobin"/>
    </dubbo:reference>
    

    5. 协议

    dubbo支持9中协议,

    @H_404_184@
  • dubbo
  • rmi
  • hessian
  • http
  • webservice
  • thrift
  • memcached
  • redis
  • rest
  • 缺省为dubbo://协议,协议扩展示例点这里各个协议的配置示例点这里

    dubbo://

    dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。反之,dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。

    该协议使用基于 mina 1.1.7 和 hessian 3.2.1 的 tbremoting 交互,特征如下:

    • 连接个数:单连接
    • 连接方式:长连接
    • 传输协议:TCP
    • 传输方式:NIO 异步传输
    • 序列化:Hessian 二进制序列化
    • 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。
    • 适用场景:常规远程服务方法调用

    后面也会针对dubbo协议进行深入的学习

    rmi://

    RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。

    注意:如果正在使用 RMI 提供服务给外部访问 (公司内网环境应该不会有攻击风险),同时应用里依赖了老的 common-collections 包(dubbo 不会依赖这个包,请排查自己的应用有没有使用)的情况下,存在反序列化安全风险(请检查应用:将 commons-collections3 请升级3.2.2;将 commons-collections4 请升级4.1。新版本的 commons-collections 解决了该问题)。

    其特性如下:

    • 连接个数:多连接
    • 连接方式:短连接
    • 传输协议:TCP
    • 传输方式:同步传输
    • 序列化:Java 标准二进制序列化
    • 适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件
    • 适用场景:常规远程服务方法调用,与原生RMI服务互操作。

    hessian://

    Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,dubbo 缺省内嵌 Jetty 作为服务器实现。

    dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作,即:

    • 提供者用 dubbo 的 Hessian 协议暴露服务,消费者直接用标准 Hessian 接口调用
    • 或者提供方用标准 Hessian 暴露服务,消费方用 dubbo 的 Hessian 协议调用

    其特征如下:

    • 连接个数:多连接
    • 连接方式:短连接
    • 传输协议:HTTP
    • 传输方式:同步传输
    • 序列化:Hessian二进制序列化
    • 适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件
    • 适用场景:页面传输,文件传输,或与原生hessian服务互操作

    http://

    基于 HTTP 表单的远程调用协议,采用 Spring 的 httpinvoker 实现(2.3.0 以上版本支持 ),其特征如下:

    • 连接个数:多连接
    • 连接方式:短连接
    • 传输协议:HTTP
    • 传输方式:同步传输
    • 序列化:表单序列化
    • 适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持文件
    • 适用场景:需同时给应用程序和浏览器 JS 使用的服务。

    webservice://

    基于 WebService 的远程调用协议,基于 Apache CXF的 frontend-simpletransports-http 实现。

    可以和原生 WebService 服务互操作,即:

    • 提供者用 dubbo 的 WebService 协议暴露服务,消费者直接用标准 WebService 接口调用
    • 或者提供方用标准 WebService 暴露服务,消费方用 dubbo 的 WebService 协议调用

    特征如下:

    • 连接个数:多连接
    • 连接方式:短连接
    • 传输协议:HTTP
    • 传输方式:同步传输
    • 序列化:SOAP 文本序列化
    • 适用场景:系统集成,跨语言调用

    thrift://

    当前 dubbo 支持 [1]的 thrift 协议是对 thrift 原生协议 [2] 的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。

    使用 dubbo thrift 协议同样需要使用 thrift 的 idl compiler 编译生成相应的 java 代码,后续版本中会在这方面做一些增强。

    memcached://

    基于 memcached [1] 实现的 RPC 协议 [2]

    redis://

    基于 Redis [1] 实现的 RPC 协议 [2]

    rest://

    基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

    相关推荐