Dubbo基础知识总结

Dubbo 简介

官网
源码
SpringBoot整合示例

Dubbo是一款高性能、轻量级的开源 Java RPC 分布式服务框架。提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。

Dubbo 架构及核心组件

架构

在这里插入图片描述

核心组件

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

调用关系说明

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

Dubbo 负载均衡

策略

1. Random:随机(默认)

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

2. RoundRobin:轮询

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

3. LeastActive:最少活跃调用数

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

4. ConsistentHash:一致性 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" />
配置

配置

将上面4种策略名称改小写即可

服务级别配置

  • 服务提供者配置 application.yml
dubbo:
  provider:
    loadbalance:roundrobin
  • 服务消费者配置 application.yml
dubbo:
  consumer:
    loadbalance:roundrobin

方法级别配置

Dubbo 序列化机制

  • dubbo序列化:阿里尚未开发成熟的高效java序列化实现,阿里不建议在生产环境使用它
  • hessian2序列化:hessian是一种跨语言的高效二进制序列化方式。但这里实际不是原生的hessian2序列化,而是阿里修改过的hessian lite,它是dubbo RPC默认启用的序列化方式
  • json序列化:目前有两种实现,一种是采用的阿里的fastjson库,另一种是采用dubbo中自己实现的简单json库,但其实现都不是特别成熟,而且json这种文本序列化性能一般不如上面两种二进制序列化。
  • java序列化:主要是采用JDK自带的Java序列化实现,性能很不理想。

在通常情况下,这四种主要序列化方式的性能从上到下依次递减。对于dubbo RPC这种追求高性能的远程调用方式来说,实际上只有1、2两种高效序列化方式比较般配,而第1个dubbo序列化由于还不成熟,所以实际只剩下2可用,所以dubbo RPC默认采用hessian2序列化。

但hessian是一个比较老的序列化实现了,而且它是跨语言的,所以不是单独针对java进行优化的。而dubbo RPC实际上完全是一种Java to Java的远程调用,其实没有必要采用跨语言的序列化方式(当然肯定也不排斥跨语言的序列化)。

最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括:
专门针对Java语言的:Kryo,FST等等
跨语言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等
这些序列化方式的性能多数都显著优于hessian2(甚至包括尚未成熟的dubbo序列化)。

有鉴于此,我们为dubbo引入Kryo和FST这两种高效Java序列化实现,来逐步取代hessian2。

其中,Kryo是一种非常成熟的序列化实现,已经在Twitter、Groupon、Yahoo以及多个著名开源项目(如Hive、Storm)中广泛的使用。而FST是一种较新的序列化实现,目前还缺乏足够多的成熟使用案例,但我认为它还是非常有前途的。

在面向生产环境的应用中,我建议目前更优先选择Kryo

启用Kryo或FST

1. 在 pom 中引入 Kryo 的依赖
<!-- https://mvnrepository.com/artifact/de.javakaffee/kryo-serializers -->
<dependency>
    <groupId>de.javakaffee</groupId>
    <artifactId>kryo-serializers</artifactId>
    <version>0.45</version>
</dependency>
2. 在 application.yml 中配置序列化方式
<dubbo:protocol name="dubbo" serialization="kryo"/>
dubbo:
  protocol:
    serialization: kryo
3. 注册序列化类(可以不做)

由于注册被序列化的类仅仅是出于性能优化的目的,所以即使你忘记注册某些类也没有关系。事实上,即使不注册任何类,Kryo和FST的性能依然普遍优于hessian和dubbo序列化。
要让Kryo和FST完全发挥出高性能,最好将那些需要被序列化的类注册到dubbo系统中,例如,我们可以实现如下回调接口:

public class SerializationOptimizerImpl implements SerializationOptimizer {

    public Collection<Class> getSerializableClasses() {
        List<Class> classes = new LinkedList<Class>();
        classes.add(BidRequest.class);
        classes.add(BidResponse.class);
        classes.add(Device.class);
        classes.add(Geo.class);
        classes.add(Impression.class);
        classes.add(SeatBid.class);
        return classes;
    }
}

然后在XML或YML配置中添加:

<dubbo:protocol name="dubbo" serialization="kryo" optimizer="org.apache.dubbo.demo.SerializationOptimizerImpl"/>
dubbo:
  protocol:
    serialization: kryo
    optimizer: org.apache.dubbo.demo.SerializationOptimizerImpl

在注册这些类后,序列化的性能可能被大大提升,特别针对小数量的嵌套对象的时候。

当然,在对一个类做序列化的时候,可能还级联引用到很多类,比如Java集合类。针对这种情况,我们已经自动将JDK中的常用类进行了注册,所以你不需要重复注册它们(当然你重复注册了也没有任何影响),包括:

GregorianCalendar
InvocationHandler
BigDecimal
BigInteger
Pattern
BitSet
URI
UUID
HashMap
ArrayList
LinkedList
HashSet
TreeSet
Hashtable
Date
Calendar
ConcurrentHashMap
SimpleDateFormat
Vector
BitSet
StringBuffer
StringBuilder
Object
Object[]
String[]
byte[]
char[]
int[]
float[]
double[]

如果被序列化的类中不包含无参的构造函数,则在Kryo的序列化中,性能将会大打折扣,因为此时我们在底层将用Java的序列化来透明的取代Kryo序列化。所以,尽可能为每一个被序列化的类添加无参构造函数是一种最佳实践(当然一个java类如果不自定义构造函数,默认就有无参构造函数)。

另外,Kryo和FST本来都不需要被序列化都类实现Serializable接口,但我们还是建议每个被序列化类都去实现它,因为这样可以保持和Java序列化以及dubbo序列化的兼容性,另外也使我们未来采用上述某些自动注册机制带来可能。

Dubbo 服务治理

在这里插入图片描述

特性描述
透明远程调用像调用本地方法一样调用远程方法
负载均衡机制Client端LB,可在内网替代F5等硬件负载均衡器
容错重试机制服务Mock数据,重试次数,超时机制等
自动注册发现注册中心基于接口名查询服务提供者的IP地址,能够平滑添加或删除服务提供者
性能监控日志Monitor统计服务的调用次数和调用时间的监控中心
服务治理中心路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡、等手动配置
自动治理中心无,比如:熔断限流机制、自动权重调整

附:Dubbo基础配置(整合SpringBoot)

服务提供者 application.yml

spring:
  application:
    name:hello-dubbo-provider # 指定服务名称
hello:
  server:
    version:1.0.0 #指定服务版本号,自定义的属性
dubbo:
  scan:
    basePackages:com.shybd.hello.dubbo.provider.service #配置dubbo的扫描包
  application:
    id:hello-dubbo-provider
    name:hello-dubbo-provider
    qos-port:22222 #运维端口
    qos-enable:true #开启运维
  protocol:
    id:dubbo #指定dubbo使用什么协议
    name:dubbo #协议名称
    port:20880 #协议端口号
    status:server #指明是dubbo服务的提供者
  registry:
    id:zookeeper
    address:zookeeper://192.168.30.123:2181?backup=192.168.30.124:2182,192.168.30.125:2183 #zookeeper集群配置
#dubbo健康检查配置
management:
  endpoint:
    dubbo:
      enabled:true
    dubbo-shutdown:
      enabled:true
    dubbo-configs:
      enabled:true
    dubbo-services:
      enabled:true
    dubbo-references:
      enabled:true
    dubbo-properties:
      enabled:true
  health:
    dubbo:
      status:
        defaults:memory
        extras:load,threadpool

服务消费者 application.yml

spring:
  application:
    name:hello-dubbo-consumer# 指定服务名称
hello:
  server:
    version:1.0.0 #指定服务版本号,自定义的属性
dubbo:
  scan:
    basePackages:com.shybd.hello.dubbo.consumer.controller#配置dubbo的扫描包
  application:
    id:hello-dubbo-consumer
    name:hello-dubbo-consumer
    qos-port:22223 #运维端口
    qos-enable:true #开启运维
  protocol:
    id:dubbo #指定dubbo使用什么协议
    name:dubbo #协议名称
    port:20880 #协议端口号 要与提供者一致
  registry:
    id:zookeeper
    address:zookeeper://192.168.30.123:2181?backup=192.168.30.124:2182,192.168.30.125:2183 #zookeeper集群配置
#dubbo健康检查配置
management:
  endpoint:
    dubbo:
      enabled:true
    dubbo-shutdown:
      enabled:true
    dubbo-configs:
      enabled:true
    dubbo-services:
      enabled:true
    dubbo-references:
      enabled:true
    dubbo-properties:
      enabled:true
  health:
    dubbo:
      status:
        defaults:memory
        extras:load,threadpool
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值