美文网首页
Dubbo 整理

Dubbo 整理

作者: SlowGO | 来源:发表于2019-02-16 16:03 被阅读12次

    一、基础知识

    RPC 远程服务调用

    dubbo 是一个高性能的Java RPC框架,阿里开源。

    特性:

    1. 面向接口的高性能RPC调用。
    2. 智能负载均衡
    3. 注册中心,服务注册发现
    4. 高度可扩展能力
    5. 运行期流量调度,轻松实现灰度发布
    6. 可视化服务治理与运维

    设计架构

    image

    注册中心、服务提供者、服务消费者、监控中心。

    容器启动,提供者注册到注册中心,消费者订阅注册中心,得到提供者列表,提供者的变动会及时通知到消费者,调用信息、服务信息等都会定时的发送到监控中心,监控统计整体运行状态。

    二、实践

    步骤:

    1. 搭建 zk 注册中心。
    2. 开发 provider,注册到中心。
    3. 开发 consumer,调用 provider。

    三、高可用

    zookeeper 注册中心本身是高可用集群模式,某台服务器出现问题后,会自动切换,整体宕掉的可能性极低,即使注册中心不可用了,服务提供者和消费者仍能通过本地缓存通讯,dubbo 还支持直连调用,完全可以不通过注册中心。

    服务提供者是无状态的,某个宕掉后,还可以调用其他的,除非全部无法使用。

    负载均衡

    (1)Random LoadBalance

    基于权重的随机负载均衡机制。

    例如 userService 这个服务启动了3个节点,A的权重为 100,B的权重为 200,C的权重为50,那么就相当于 A 的访问概率为 2/7,B 的访问概率为 4/7,C 的访问概率为 1/7,每次访问时不一定是哪个,但整体的概率分布式这样的。

    (2)RoundRobin LoadBalance

    基于权重的轮询负载均衡机制。

    例如 userService 这个服务启动了3个节点,A的权重为 100,B的权重为 200,C的权重为50,那么就相当于 A 的访问概率为 2/7,B 的访问概率为 4/7,C 的访问概率为 1/7。每次访问是顺序轮询的,并判断权重,例如:

    1. 第1次A
    2. 第2次B
    3. 第3次C
    4. 第4次轮到A了,因为A的概率为 2/7,所以可以选择A
    5. 第5次轮到B了,其概率为 4/7,所以可以选择B
    6. 第6次轮到C了,其概率为 1/7,7次访问之内已经选择过一次C了,那么这次就不能选了,轮到下一个,A,A的概率为 2/7,也已经满了,继续往下轮,轮到B,其概率为 4/7,已经选过2次,没有超出,所以可以选B。
    7. 第7次轮到C了,同样的逻辑,最后还是选B。

    (3)LeastActive LoadBalance

    最少活跃数负载均衡机制。

    每个服务都有一个计数器,接收请求后,计数器+1,处理完成后,计数器-1。

    选择计数器值最小的,如相同则随机。

    例如 userService 这个服务启动了2个节点,初始时A、B的计数器都为0,这时随机选择A,A接收到请求后,计数器+1,在A处理完成之前又有新的请求,这次就选B,B计数器+1,如果B先于A处理完成,B的计数器-1变为0,之后新的请求还会选B。

    (3)ConsistentHash LoadBalance

    一致性hash负载均衡机制。

    例如有4个节点 A B C D,通过规则计算得到每个节点的一个整数值(假设为 3、5、8、10),将其分布到一个时钟原型上。现在有一个请求,对其参数进行计算,得到一个整数值(假设为 6),沿着顺时针的方向找离其最近的那个节点,就是8,对应的是节点 C,就选择它。每个请求都根据这样的规则为其分配节点,所以,参数相同的请求,总是会分配到相同的节点上。

    服务降级

    当服务器压力剧增的时候,根据实际业务情况,对某些服务或者页面有策略的不处理或者简单处理,从而释放服务器资源,以保证核心业务正常运作,就是通过牺牲局部利益来保证全局利益。

    例如一台服务器中运行着A B C 3个服务,在访问激增的时候,服务器压力巨大,3个服务都不能很好的响应,这时可以根据业务情况,选择暂时停掉某个服务,来保证其他服务正常运行。

    dubbo提供了2种服务降级的方式:

    1. consumer 不发起实际的远程调用,直接返回 null。
    2. consumer 调用失败后,不再重试,返回 null。

    在控制台即可对服务进行屏蔽,实现服务降级。

    集群容错

    服务调用失败时,dubbo提供了多种容错方案,缺省为 failover 重试。

    • failover cluster

    失败自动切换,当出现失败,重试其他服务。适合读操作。

    • failfast

    快速失败,只发起一次调用,失败后立即报错。通常用于非幂等性的写操作,比如新增记录。

    • failsafe

    失败安全,出现异常时,直接忽略。通常用于写日志等操作。

    • failback

    失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

    例如 A 调用 B 失败了,这个调用要求必须成功,那么就使用此容错方式,定时重发。

    • forking

    并行调用多个服务器,主要一个成功即返回。通常用于实时性要求较高的读操作,这种方式会浪费更多的服务资源。可以通过 forks=2 来设置最大并行数。

    • broadcast

    广播调用所有提供者,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等操作。

    例如 A 调用 B,B 有4个节点,那么会请求每个节点,全部正常响应才算调用成功,只要有一个失败就报错。

    实现方式是通过整合 hystrix。

    四、原理

    1. RPC原理

    image

    调用流程:

    1. 服务消费⽅方(client)调⽤用以本地调⽤用⽅方式调⽤用服务;

    2. client stub接收到调⽤用后负责将⽅方法、参数等组装成能够进⾏行行⽹网络传输的消息体;

    3. client stub找到服务地址,并将消息发送到服务端;

    4. server stub收到消息后进⾏行行解码;

    5. server stub根据解码结果调⽤用本地的服务;

    6. 本地服务执⾏行行并将结果返回给server stub;

    7. server stub将返回结果打包成消息并发送⾄至消费⽅方;

    8. client stub接收到消息,并进⾏行行解码;

    9. 服务消费⽅方得到最终结果

      RPC框架的⽬目标就是要2~8这些步骤都封装起来,这些细节对⽤用户来说是透明的,不不可⻅见的。

    2. netty 通信原理

    netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,极大的简化了网络编程。

    netty 是基于 NIO 模型的,NIO 如下:

    image

    netty 模型:

    image

    官网地址:http://dubbo.apache.org/zh-cn/

    相关文章

      网友评论

          本文标题:Dubbo 整理

          本文链接:https://www.haomeiwen.com/subject/qaxieqtx.html