【愚公系列】2023年06月 Java教学课程 145-Dubbo的高级特性
一、dubbo高级特性
1.序列化
Dubbo的序列化框架有四种:Hessian2、Kryo、Java自带的序列化和FST序列化。其中,Kryo是效率最高的序列化框架,但不支持所有Java类的序列化,Hessian2和Java自带的序列化具有较好的兼容性,FST序列化是目前Dubbo默认的序列化方式。
下面主要讲解Java自带的序列化
1. dubbo内部已经将序列化和反序列化的过程内部封装了
2. 只需要在定义pojo类时实现Serializable接口即可
3. 一般会定义一 个公共的pojo模块,让生产者和消费者都依赖该模块
package com.itheima.pojo;
import java.io.Serializable;
/**
* 注意!!!
* 将来所有的pojo类都需要实现Serializable接口
*/
public class User implements Serializable {
private int id;
private String username;
private String password;
public User() {
}
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2.地址缓存
Dubbo 的地址缓存是指 Dubbo 在初始化时会将注册中心的地址缓存下来,避免频繁访问注册中心导致性能下降。当注册中心的地址发生变化时,Dubbo 会重新从注册中心获取地址并更新缓存。
3.超时与重试
Dubbo的超时和重试机制是通过给每个服务提供者设置超时时间和重试次数来实现的。当服务消费者调用服务提供者时,如果返回结果的时间超过了设置的超时时间,Dubbo就会自动重试,直到达到设置的重试次数或者成功返回结果。这样可以有效地提高服务的可用性和稳定性。
//timeout 超时时间 单位毫秒 retries 重试次数
@Service(timeout = 3000,retries=0)
4.多版本
灰度发布: 当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
dubbo中使用version属性来设置和调用同一个接口的不同版本
生产者配置
@Service(version="v2.0")
public class UserServiceImp12 implements UserService {...}
消费者配置
@Reference(version = "v2.0")//远程注入
private UserService userService;
5.负载均衡
Dubbo的负载均衡策略有四种:随机负载均衡、最小活跃数负载均衡、一致性Hash负载均衡以及轮询负载均衡。
• Random:随机负载均衡会随机选择一个可用的服务提供者。
• LeastActive:最小活跃数负载均衡会选择最小负载的服务提供者。
• ConsistentHash:一致性Hash负载均衡会根据请求的参数计算哈希值,在哈希环上选择服务提供者。
• RoundRobin:轮询负载均衡会按照顺序依次选择服务提供者。
这些负载均衡策略可以根据实际情况进行选择和配置。
服务提供者配置
@Service(weight = 100)
public class UserServiceImp12 implements UserService {...}
application.xml 配置parameter key
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--<context:component-scan base-package="com.itheima.service" />-->
<dubbo:protocol port="20883" />
<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dubbo-service">
<dubbo:parameter key="qos.port" value="55555"/>
</dubbo:application>
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://192.168.149.135:2181"/>
<!--3.配置dubbo包扫描-->
<dubbo:annotation package="com.itheima.service.impl" />
<!-- 元数据配置 -->
<dubbo:metadata-report address="zookeeper://192.168.149.135:2181" />
</beans>
消费者配置
//@Reference(loadbalance = "roundrobin")
//@Reference(loadbalance = "leastactive")
//@Reference(loadbalance = "consistenthash")
@Reference(loadbalance = "random")//默认 按权重随机
private UserService userService;
6.集群容错
包括Failover、Failfast、Failsafe、Failback和Forking。
• Failover是默认的集群容错模式,它的作用是在某个服务提供者宕机时自动切换到其它可用的提供者
• Failfast是快速失败的模式,它的作用是只要一个服务提供者失败,就立即返回异常
• Failsafe是安全失败的模式,它的作用是在遇到异常时返回一个缺省值
• Failback是自动恢复的模式,它的作用是在一个服务提供者恢复后自动恢复调用
• Forking是并行调用的模式,它的作用是同时调用所有可用的服务提供者,只要有一个成功返回结果就立即返回
消费者配置
@Reference(cluster = "failover")//远程注入
private UserService userService;
7.服务降级
Dubbo的服务降级是在高并发场景下,为了保证核心服务的可用性,降低对次要服务的依赖而采取的一种策略。当次要服务出现问题无法提供正常服务时,Dubbo可以通过服务降级切断对次要服务的依赖,从而保证核心服务的正常运行。
Dubbo的服务降级方式有3种:
• 基于留言状态的服务降级:当服务提供者出现问题时,消费者将收到一个提示信息,表示该服务无法提供服务。
• 基于Mock数据的服务降级:当服务提供者无法提供真实数据时,Dubbo允许建立一个Mock服务,以防止在消费端出错。
• 基于容错策略的服务降级:当服务提供者出现错误时,Dubbo将自动尝试进行容错处理,如重试、缓存、降级等,以确保服务的高可用性。
基于Mock数据的服务降级方式:
• mock= force:return null:表示消费方对该服务的方法调用都直接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
• mock=fail:return null:表示消费方对该服务的方法调用在失败后,再返回null值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
消费方配置
//远程注入
@Reference(mock =“ force :return null")//不再调用userService的服务
private UserService userService;
- 点赞
- 收藏
- 关注作者
评论(0)