Dubbo应用(二)之高级特性

1.前言

上一篇文章介绍了如何快速构建一个dubbo的简单应用,以及配合nacos注册中心实现服务的注册。是最基本的应用,这一篇文章学习Dubbo的高级特性.

本篇文章知识让自己知道有这些特性,如果要详细使用,还是要看官网

2.Dubbo的高级特性

2.1 dubbo支持多协议

dubbo远程通信服务不仅支持自身的dubbo协议,他还支持配置多种协议(场景主要用在老项目切换到dubbo框架,但是老的服务协议还不能变,新的服务要使用dubbo协议)如下:

  • dubbo
  • rest
  • hessian
  • thrift

2.2 dubbo的负载均衡

dubbo自身就支持负载均衡,当provider有多个服务时,可以配置dubbo的负载均衡规则,让请求分发到不同的服务器上

  • Random:随机负载均衡 (默认的)

它的算法思想很简单。假设我们有一组服务器servers = [A, B, C],他们对应的权重为weights = [5, 3,2],权重总和为10。现在把这些权重值平铺在一维坐标值上,[0, 5)区间属于服务器A,[5, 8)区间属于服务器B,[8, 10)区间属于服务器C。接下来通过随机数生成器生成一个范围在[0, 10)之间的随机数,然后计算这个随机数会落到哪个区间上。比如数字3会落到服务器A对应的区间上,此时返回服务器A即可。权重越大的机器,在坐标轴上对应的区间范围就越大,因此随机数生成器生成的数字就会有更大的概率落到此区间内。只要随机数生成器产生的随机数分布性很好,在经过多次选择后,每个服务器被选中的次数比例接近其权重比例。

  • roundRobin:轮询

所谓轮询是指将请求轮流分配给每台服务器。举个例子,我们有三台服务器A、B、C。我们将第一个请求分配给服务器A,第二个请求分配给服务器B,第三个请求分配给服务器C,第四个请求再次分配给服务器A。这个过程就叫做轮询。轮询是一种无状态负载均衡算法,实现简单,适用于每台服务器性能相近的场景下。但现实情况下,我们并不能保证每台服务器性能均相近。如果我们将等量的请求分配给性能较差的服务器,这显然是不合理的。因此,这个时候我们需要对轮询过程进行加权,以调控每台服务器的负载。经过加权后,每台服务器能够得到的请求数比例,接近或等于他们的权重比。比如服务器A、B、C权重比为5:2:1。那么在8次请求中,服务器A将收到其中的5次请求,服务器B会收到其中的2次请求,服务器C则收到其中的1次请求

  • 一致性hash:
    主要使用场景是:当需要同一个客户端的请求落到一个固定的服务器上时,使用一致性hash算法,同一个客户端无论调用多少次,请求都会落到同一个服务器上。
    在这里插入图片描述

  • 最小活跃度:

根据目标集群服务器列表,处理性能最高的,权重也越高。处理性能较低的,权重也比较低根据请求处理的吞吐量->发起一次请求(开始),计数器+1、一次请求处理完成,计数器-1。当一个服务器的计数器维持在较低水平(比如5),那么说明这个服务器处理性能高

  • 最短响应时间shortestResponse LoadBalance:

最短响应时间负载均衡算法,筛选成功调用响应时间最短的调用程序的数量,并计算这些调用程序的权重和数量。然后根据响应时间的长短来分配目标服务的路由权重。

2.3 服务器集群容错

当客户端发起一次请求,这次请求的状态只有三种:成功、失败、未知

  • Failover(默认)
    失败自动重试(重试其他服务器)失败自动切换
    @DubboService(cluster="failover",retires=2)
  • failfast cluster
    快速失败,立马报错
  • failsafe cluster
    失败安全,出现异常,直接吞掉
  • failback cluster
    失败自动恢复,记录失败请求,定时重发
  • forking cluster
    并行调用多个服务节点, 只要其中一个成功返回, 那么就直接返回结果.
  • broadcast cluster
    广播调用。
    一个请求调用所有的服务提供者。 只要其中一个节点报错, 那么就认为这个请求失败

2.4 Dubbo泛化

习惯上,每次去发布一个服务,必然会先定义一个接口,并且把这个接口放在一个api的jar包中,给到服务调用方来使用。本质上,对于开发者来说仍然是面向接口编程,而且对于使用者来说,可以不需要关心甚至不需要知道这个接口到底是怎么触发调用的。而泛化调用就是服务消费者和服务提供者之间并没有这样的公共服务接口

2.5 服务降级

当一个服务不可用时,调用另一个备用服务,这里的MockSayHelloService就是备用服务

@RestController
public class SayController {

    @DubboReference(registry = {"shanghai", "beijing"},
            protocol = "dubbo",
            loadbalance = "consistenthash",
            mock = "com.xhc.springboot.dubbo.springbootdubbosampleconsumer.MockSayHelloService",
            timeout = 500,
            cluster = "failfast", check = false, methods = {
            @Method(loadbalance = "", name = "")
    }, retries = 5)
    ISayHelloService sayHelloService;

    @GetMapping("/say")
    public String say() {
        return sayHelloService.sayHello("你好");
    }

}

2.6 多序列化支持

(gRPC)protobuf / json / xml …
dubbo hessian(2)
webservice / xml
fst / kryo / protostuf / gson /avro。。。

  • 添加jar包支持
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>de.javakaffee</groupId>
<artifactId>kryo-serializers</artifactId>
<version>0.45</version>
</dependency>
  • 添加序列化支持
    dubbo.protocol.serialization=kryo

2.7 Dubbo性能调优参数

见官网

2.8 Dubbo缓存文件

配置服务地址的缓存,避免注册中心挂了之后对于服务通信的影响

dubbo.registries.shanghai.zone=shanghai
dubbo.registries.shanghai.weight=100
dubbo.registries.shanghai.file=${user.home}/dubbo_shanghai.cache

dubbo.registries.hunan.address=nacos://192.168.216.128:8848
dubbo.registries.hunan.weight=10dubbo.registries.hunan.preferred=true
dubbo.registries.hunan.file=${user.home}/dubbo_hunan.cache

2.9 Dubbo qos 运维平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值