dubbo的高级应用
- 负载均衡
- 集群容错
- dubbo泛化
- 服务降级
- 常见配置
- 多序列化的支持
- 性能调优的参数
- dubbo缓存文件
- Dubbo admin的使用
负载均衡
dubbo提供了5种负载均衡策略,默认的是随机,源码包是在 dubbo-cluster 下
1、加权随机
例如三个节点,有三个不同的权重,对应三个区间,随机产生的随机数落在其中的一个区间即某个节点上,权重大的可能性较大
2、轮询
轮流分配给N个节点,实际场景中有的机器性能不一样,所以可以进行加权,调控每台服务器的负载
3、一致性hash负载
根据参数hash取模,默认是根据第一个参数
{hash(parameter)%3} = 0,1,2
{hash(parameter)%6} = 0,1,2,3,4,5
4、最小活跃度
处理器性能高的权重越高,性能低的权重越低
根据处理吞吐量->发起请求,计数器+1,处理完,计数器-1,然后比较计数器大小
5、最端响应时间
最短响应负载均衡算法
筛选成功响应时间最短的调用程序的数量,计算这些调用程序的权重和数量。根据响应时间长短来分配目标服务的权重
集群容错
客户端请求报错了怎么办,重试还是重新发起请求,多次请求时要考虑幂等问题
1、Failover(默认)
失败自动重试
cluster='failover' retires=2
2、failfast cluster
快速失败
3、failsafe cluster
失败安全,出现异常,吞掉异常
4、failback cluster
失败自动恢复,记录失败请求,定时重发
5、forking cluster
并行调用多个服务节点,只要其中一个成功返回,直接返回结果
6、broadcast cluster
广播调用,一个请求调用所有的服务提供者,只要有一个节点报错,那么就认为这个请求失败
dubbo泛化
dubbo的一般调用方式是通过api调用,因为RPC设计的初衷就是面向接口编程
某些特定情况下可以不使用api的也能调用dubbo服务,如跨语言调用,PHP调用java,不可能一一定义接口。
简而言之就是消费者不需要定义接口,也能正常调用dubbo服务
泛化的方式,配置consumer.xml时加一个 generic="true"/
<dubbo:reference id="permissionService" interface="com.alibaba.dubbo.demo.DemoService" generic="true"/>
具体的细节可查看这篇文章:Dubbo基本特性之泛化调用
服务降级
解决高并发的三把利器:降级、限流、缓存
降级:服务器压力剧增,可以限制某些低级别服务,保证重要服务的正常进行
Dubbo的服务降级采用的是mock机制
调用被降级的服务时会返回null或者简单的提示
<dubbo:reference id="xxService" check="false" interface="com.xx.XxService" timeout="3000" mock="return null" />
<dubbo:reference id="xxService2" check="false" interface="com.xx.XxService2" timeout="3000" mock="return 1234" />
常见配置
1、启动检查 check=true/false
2、主机绑定问题
--> 查找环境变量中是否存在启动参数 [DUBBO_IP_TO_BIND] =服务注册的ip
--> 读取配置文件, dubbo.protocols.dubbo.host= 服务注册的ip
--> InetAddress.getLocalHost().getHostAddress() 获得本机ip地址
--> 通过Socket去连接注册中心,从而获取本机IP
--> 会轮询本机的网卡,直到找到合适的IP地址
--> 上面获取到的ip地址是bindip,如果需要作为服务注册中心的ip, DUBBO_IP_TO_REGISTRY -
dDUBBO_IP_TO_REGISTRY=ip
3、配置的优先级
方法层面的配置>接口层面的配置>全局层面的配置
级别一样,客户端配置>服务端配置
多序列化的支持
不同的协议用的序列化方法
gRPC->用的protobuf做序列化,支持json/xml
dubbo 用的hession
webserice /xml
fst/kryo
添加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
性能调优的参数
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=10
dubbo.registries.hunan.preferred=true
dubbo.registries.hunan.file=${user.home}/dubbo_hunan.cache
生成的是empty协议的服务,注册中心挂掉之后仍能保持服务调用
Dubbo admin的使用