一、Dubbo概述

1.概念

    Dubbo是阿里开源的一个高性能、轻量级的Java RPC框架。致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案

2.架构图

    

二、Dubbo入门

1.Zookeeper安装

        Dubbo官方推荐使用Zookeeper作为注册中心。以下介绍在Linux中的/usr/local/zookeeper中安装Zookeeper:
(1)环境准备
        Zookeeper需要运行在JVM上,需要安装JDK7及以上版本。
(2)下载并上传安装包
(3)解压安装包至/usr/local/zookeeper目录
(4)进入conf目录,复制zoo_sample.cfg文件并重命名为zoo.cfg
(5)在/zookeeper中创建zkdata目录,用来存储数据
(6)vim zoo.cfg文件,将zkdata目录配置到如图位置
        
(7)启动、停止、查看状态命令
        在bin目录下执行如下命令:
./zkServer.sh start
./zkServer.sh stop
./zkServer.sh status

2.Dubbo的使用

(1)创建服务提供者Provider模块service-provider
(2)创建服务消费者Consumer模块web-consumer
(3)在service-provider模块中编写UserServiceImpl 提供服务
@Service //★与之前的@Service同名不同包(org.apache.dubbo.config.annotation.Service),以前的@Service是定义bean,这个注解的作用是:将该类提供的方法(服务)对外发布。将访问的地址(ip、端口、路径等)注册到注册中心。
public class UserServiceImpl implements UserService {
    public String sayHello() {
        return "hello dubbo...";
    }
}
(4)在service-provider模块中配置dubbo信息
<!--dubbo的配置-->
<!--1.配置项目名称,要唯一,一般与模块同名-->
<dubbo:application name="service-provider"/>
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://zookeeper服务器ip地址:2181"/>
<!--3.配置dubbo的包扫描-->
<dubbo:annotation package="service.Impl"/>
(5)在web-consumer模块中的UserController远程调用UserServiceImpl 提供的服务
/*
  @Reference的作用:
    1.从注册中心获取userService的访问url
    2.进行远程调用RPC
    3.将结果封装为一个代理对象,给变量赋值
 */
@Reference //远程注入
private UserService userService;

@RequestMapping("/sayHello")
public String sayHello(){
    return userService.sayHello();
}
(6)分别启动两个服务,测试

三、Dubbo高级特性

1.dubbo-admin管理平台

        dubbo-admin是一个管理平台,是图形化的服务管理页面。从注册中心中获取到所有的提供者 / 消费者进行配置管理。
(1)功能
        路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能。
(2)安装
        dubbo-admin是一个前后端分离的项目(前端使用vue,后端使用springboot),因此,安装 dubbo-admin 其实就是部署该项目。
        1)下载并安装node
                因为dubbo-admin前端是用Vue开发的,所以需要安装node.js,通过其自带的nmp来启动。官网下载:https://nodejs.org/en/
        2)下载dubbo-admin
        3)在dubbo-admin-server的配置文件中配置注册中心

2.序列化

        现在服务提供者(生产者)和服务消费者部署在两台服务器上,那么二者如何进行数据(Java对象)传输呢?——序列化

        

【注意】一个对象要想被序列化,该对象所在的类要实现Serializable接口,不然会抛出NotSerializableException异常。

3.地址缓存

        注册中心出问题了,服务是否可以正常访问?
        ——可以。因为dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。 但当服务提供者地址发生变化时,注册中心会通知服务消费者。

4.超时与重试机制

(1)问题提出
        服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,此时服务消费者会一直等待下去。 当有大量请求都在同时请求服务消费者时,会造成线程的大量堆积,势必会造成雪崩。
(2)超时机制
        dubbo利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。使用timeout属性配置超时时间,默认值1000单位毫秒
【tips】可以在生产者的@Service或消费者的@Reference中配置timeout属性。
(3)重试机制
        设置了超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。 如果出现网络抖动,则这一次请求就会失败。 Dubbo 提供重试机制来避免类似问题的发生。通过 retries 属性来设置重试次数,默认为再重试 2 次

5.多版本

        灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
        dubbo 在生产者的@Service中使用version属性来设置同一个接口的不同版本,在消费者的@Reference中使用version属性指定调用哪个版本。

6.负载均衡

        dubbo中的负载均衡策略:
(1)Random
        按权重随机,默认值。按权重设置随机概率。
(2)RoundRobin
        按权重轮询。
(3)LeastActive
        最少活跃调用数,相同活跃数的随机。
(4)ConsistentHash
        一致性 Hash,相同参数的请求总是发到同一提供者。
【tips】①上面的英文名对应的就是配置loadbalance属性时的四个值;
             ②在消费者的@Reference中配置想用的负载均衡策略。

7.集群容错

(1)Failover Cluster
        失败重试(默认值)。当出现失败,重试其它服务器 ,默认重试2次,使用 retries 配置。一般用于读操作。
(2)Failfast Cluster
        快速失败,只发起一次调用,失败立即报错。通常用于写操作。
(3)Failsafe Cluster
        失败安全,出现异常时,直接忽略。返回一个空结果。
(4)Failback Cluster
        失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
(5)Forking Cluster
        并行调用多个服务器,只要一个成功即返回。
(6)Broadcast Cluster
        广播调用所有提供者,逐个调用,任意一台报错则报错
【tips】①上面的英文名对应的就是配置cluster属性时的值;
             ②在消费者的@Reference中配置想用的集群容错模式。