Dubbo

1)分布式通信的两种方式:(面试)

  1. 在分布式架构中,分布式通信的两种方式:**RPC通信、HTTP通信;**
  2. RPC通信的效率要高于HTTP通信。(详情看CSDN

2)图解分布式架构:

        特点:将项目根据不同的功能和应用场景划分为不同的独立的模块,各个模块之间可以进行互相的调用。(**针对负载较大的模块,可以给它加上集群,再利用负载均衡的策略,使得每个服务器的负载都差不多,以解决服务器压力过大、瘫痪宕机的问题**)。

3_Dubbo - 图1

                           ![](mdpic/wps2.jpg#alt=img)

3)架构的演进:

1单体架构 2垂直架构 3分布式架构 4流式架构

3_Dubbo - 图2

4)dubbo的体系结构图:(面试)

这里的Container容器指的其实就是我们的Spring容器;


第1步:编写,并启动提供者。(启动的时候将提供者的信息注册到注册中心,异步的方式); 


第2步:编写,并启动消费者;
         (启动的时候,消费者会去注册中心订阅指定的服务,
           同时:注册中心返回 提供者的地址列表 给消费者);

第3步:消费者从提供者地址列表中,基于负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

第4步,在内存中累计`服务调用的信息`(即,服务调用的次数和时间),并且定时每分钟 异步的发送一次 服务调用的信息 到监控中心。

3_Dubbo - 图3

5) Monitor监控中心

    Monitor在整个架构中 是可选的 (图中的虚线并不是可选的意思),Monitor挂掉并不会影响服务的调用。
    在moniter监控中心中,可以监控到注册中心的各种信息和活动。

6)dubbo的5大特点:(面试)

1>面向接口的远程方法调用;
        服务之间仅需通过 方法的调用 便完成了rpc远程过程调用。为开发者屏蔽了RPC远程过程调用的底层细节。

2>智能容错与负载均衡;
        所有的应用都需要在注册中心注册,注册中心会根据流量情况,智能的为请求挑选合适的服务器。

3>服务的自动注册与发现;

4>支持多种协议;
         默认是dubbo协议;
         还支持RMI、Hessian、HTTP、Redis、Memcached等多种协议。

7)RPC(远程过程调用)框架的底层原理:(面试)

影响RPC远程调用的性能的两个点:
    1. 序列化和反序列化的速度;
    2. 建立Socket连接和传输数据的时间;

RPC远程过程调用流程:
远程过程调用包含如下步骤:

1)消费者(client)请求服务,开始调用 (client stub)消费者存根/助手; 

2)(client stub)消费者助手收到调用后,将请求数据进行序列化(序列化成二进制的文件); 

3)然后,消费者助手通过Socket端口,将请求数据发送到 提供者端的Socket端口; 

4)(server stub)提供者助手,通过Socket端口收到数据后,将请求数据进行 反序列化; 

5)然后(server stub)提供者助手将 请求数据 交给提供者;

6)提供者处理请求后,将响应结果 返回给(server stub)提供者助手; 

7)(server stub)提供者助手 将响应结果序列化(序列化成二进制的文件),并通过Socket端口 发送给消费者端的Socket端口; 
8)(client stub)消费者助手 通过Socket端口收到响应数据后,将响应数据进行反序列化; 

9)然后(client stub)消费者助手将响应结果交给 消费者。

   结束。

dubbo为开发者封装了RPC远程过程调用的底层细节。

3_Dubbo - 图4

@1:注意:

在两个socket端口之间进行通讯,即传递数据,用的是NIO。

3_Dubbo - 图5

@2:注意:
消费者和提供者,是需要我们自己写的   

2(即消费者存根/助手、提供者存根/助手、Socket端口这些)是dubbo给封装好的,不扒源码是看不到的,

3_Dubbo - 图6

5)dubbo可以有多个注册中心

dubbo 这几个都可以作为注册中心,但dubbo官方推荐的是zookeeper

3_Dubbo - 图7

8) dubbo的4种负载均衡策略.(面试)

1. 负载均衡机制.
一共四种方式:
           - 随机(按权重设置)
           - 轮询(按权重设置)
           - 最少活跃调用数
           - 一致性哈希

---------------------------------

1、随机,Random LoadBalance
    随机,按权重设置随机概率。
    调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
    比如: 三台服务提供者,权重分别为100、200、50,按照基于权重的随机负载均衡机制,请求这三个服务的概率分别为2/7,4/7和1/7。 

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

3、最少活跃调用数,LeastActive LoadBalance
    最少活跃调用数, 
    使慢的提供者收到更少的请求。
    哪台机器处理快,就将请求交给哪台提供者.

4、一致性哈希,ConsistentHash LoadBalance
    一致性 Hash,相同消费者的请求总是发到同一提供者。
    当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

3)Dubbo的6种集群容错策略

        - 失败重试(Failover Cluster)--默认策略

        - 快速失败(Failfast Cluster)--失败了就失败了

          - 失败安全(Failsafe Cluster)--即,忽略失败

          - 失败自动恢复(Failback Cluster)--记录失败,后期再重试

          - 并行调用(Forking Cluster)--一台成功则成功

          - 广播调用(Broadcast Cluster)--一台失败则失败
Failover Cluster:失败重试
    当服务消费方调用服务提供者失败后,自动切换到其他服务提供者服务器进行重试。这通常用于读操作或者具有幂等的写操作,需要注意的是重试会带来更长延迟。
    可通过 retries="2" 来设置重试次数(不含第一次)。如上配置,当服务消费方调用服务失败后,会再重试两次,也就是说最多会做三次重试。


Failfast Cluster:快速失败
    当服务消费方调用服务提供者失败后,立即报错,也就是只调用一次。通常这种模式用于非幂等性的写操作。


Failsafe Cluster:失败安全
    当服务消费者调用服务出现异常时,直接忽略异常。这种模式通常用于写入审计日志等操作。


Failback Cluster:失败自动恢复
    当服务消费端用服务出现异常后,在后台记录失败的请求,并按照一定的策略,后期再进行重试。这种模式通常用于消息通知操作。


Forking Cluster:并行调用
    消费方会并行调用多个服务提供者的服务,只要一个成功即返回。这种模式通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。


Broadcast Cluster:广播调用
    消费者会逐个调用所有的服务提供者,一台出现异常,就标志这次调用失败。这种模式通常用于通知所有提供者更新缓存或日志等本地资源信息。