Dubbo

Dubbo多协议

Dubbo支持的远程通信协议

远程通信需要指定通信双方所约定的协议,在保证通信双方理解协议语义的基础上,还要保证高效、稳定的消息传输。Dubbo继承了当前主流的网络通信框架,主要包括如下几个:

  • Mina
  • Netty(默认)
  • Grizzly

Dubbo支持的远程调用协议

  • Dubbo协议(默认)
  • Hessian协议
  • HTTP协议
  • RMI协议
  • WebService协议
  • Thrift协议
  • Memcached协议
  • Redis协议

常用协议概括:

默认的是dubbo协议

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

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

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

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

5、webservice协议:
基于 WebService 的远程调用协议。
连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:SOAP 文本序列化
适用场景:系统集成,跨语言调用

Dubbo的客户端负载均衡

dubbo的负载均衡机制原理上来说是客户端负载均衡,也就是dubbo消费者客户端根据服务提供者列表进行算法分配,来选择调用的服务端。

Dubbo提供了四种负载均衡策略

负载均衡算法名称

效果说明

Random LodBalance

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

RoundRobin LoadBalance

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

LeastActive LoadBalance

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

ConsistentHash LoadBalance

一致性Hash,相同参数的请求总是发送同一提供者。当某一台提供者"挂"时,原本发往该提供者的请求,基于虚拟节点,会平摊到其他提供者,不会引起剧烈变动。默认只对第一个参数"Hash",如果要修改,则配置<dubbo:parameter key=“hash.arguments” value=“0, 1” />默认使用160份虚拟节点,如果要修改,则配置<dubo:parameter key=“hash.nodes” value=“320”/>

四种负载均衡算法都继承自同一个抽象类,使用的也是模板模式,抽象父类中已经把通用的逻辑完成,留了一个抽象的doSelect方法给子类实现。

dubbo默认的协议 dubbo使用的协议_dubbo默认的协议

客户端负载均衡的配置

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

Dubbo的配置

配置方式的覆盖策略

  • JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
  • XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
  • Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。

配置方式

  • XML配置

标签

用途

解释

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:

<?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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo
       http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <dubbo:application name="demo-provider" />

    <dubbo:registry id="nacos_service"  address="nacos://127.0.0.1:8848" timeout="15"/>

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo"  port="20880"  threads="1000" />

    <!-- dubbo监控配置 -->
    <dubbo:monitor protocol="registry" />

    <!-- dubbo管理平台接口 -->
    <bean id="UserService" class="com.luo.producer.service.impl.UserServiceImpl" />
    <dubbo:service interface="com.luo.api.service.IUserService" ref="UserService"  cluster="failfast"
                   registry="nacos_service"   />

</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="nacos://127.0.0.1:8848"/>
    <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.samples.basic.api.DemoService"/>
</beans>
  • 注解配置
  • @DubboComponentScan 作为 Dubbo2.5.7中 新增的 Annotation,也是XML 元素 <dubbo:annotation package=“com.alibaba.dubbo.test.service” />的替代方案(注意:Dubbo2.5.7及以上才支持该注解)。其主要功能在于处理 Dubbo @Service类暴露 Dubbo 服务外,还有帮助 Spring Bean中 @Reference字段或者方法注入 Dubbo 服务代理。
  • @DubboComponentScan如果没有指定basePackages扫描,这种情况会将当前类当做 basePackageClasses,即扫描当前类所属的 package 以及子 package。
  • 属性配置
    如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个 Spring 容器想共享配置,可以使用 dubbo.properties 作为缺省配置。一般情况下 properties 都是用来配置一些公共的信息,比如可能一个应用需要调用多个注册中心的服务,这时候它们的 application.name、dubbo.protocol.name等都是相同的,那么你可以用 properties 来配置这些公共信息。
    Dubbo 将自动加载 classpath 根目录下的 dubbo.properties
  • JavaAPI配置