2 Dubbo 高级特性
2.1 dubbo-admin
- dubbo-admin管理平台,是图形化的服务管理页面
- 从注册中心中获取到所有的提供者/消费者进行配置管理
- 路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能
2.2 序列化
两个机器之间传输数据,如何传输对象?
-
消费者A 调用 生产者B 的查询接口,生产者B 将返回的对象数据序列化后返回给消费者A,消费者A再将数据进行反序列化为原对象
-
dubbo内部已经将序列化和反序列化过程内部封装了,我们只需要在定义pojo类时实现Serializable接口即可
-
一般会定义一个公共pojo模块,让生产者和消费者都依赖该模块
2.3 地址缓存
注册中心宕机后,服务是否可以正常访问?
可以,因为dubbo服务消费者在第一次调用时,会将服务提供方的地址缓存到本地,以后在调用的时候则不需要访问注册中心
2.4 超时与重试
-
服务消费者在调用服务提供者的时候发生阻塞、等待的情形,这个时候,服务消费者会一直等待下去
-
在高峰时刻,大量的请求都在同时请求服务的消费者,会造成线程大量堆积,势必会造成雪崩
-
dubbo利用超时机制来解决问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接
-
dubbo使用timeout属性配置超时时间,默认1000,单位毫秒
-
超时时间,可以配置在生产方或消费方,建议配置在生产方,因为上产方对接口的响应时间更熟悉
-
如果出现网络抖动,为了防止调用一次就失败,可以使用重试 retries 解决,默认为 2 次
//使用dubbo 的@service注解将这个类提供的方法(服务)对外发布,将访问的地址 ip,端口,路径注册到服务中心 @Service(timeout = 2000,retries = 0) public class UserServiceImpl implements UserService { @Override public User findUserById(int id) { User user = new User(); user.setId(1); user.setName("王"); user.setPassword("123456"); return user; } }
@RestController @RequestMapping("/user") public class UserController { /** * @Reference :远程注入 * 1.从zk注册中心获取userService的访问路径url * 2.远程调用rpc * 3.将结果封装为一个代理对象,给变量赋值 */ @Reference(timeout = 1000,retries = 1) private UserService userService; @RequestMapping("/findUser") public User findUser(int id) { return userService.findUserById(id); } }
2.5 多版本
-
灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没有问题时,在将所有的用户迁移到新功能
-
dubbo使用 version 属性来设置和调用同一个接口的不同版本(version)
//服务指定版本 @Service(timeout = 2000,retries = 0, version = "v2.0") public class UserServiceImpl implements UserService { }
@RestController @RequestMapping("/user") public class UserController { //调用者指定调用的版本 @Reference(timeout = 1000, retries = 1, version ="v2.0") private UserService userService; }
2.6 负载均衡
负载均衡策略(weight)
-
Random:按权重随机,默认值,按权重设置随机概率
-
RoundRobin:按权重轮询
-
LeastActive:最少活跃调用数,相同活跃数的随机
-
ConsistentHash:一致性Hash,相同参数的请求总是发到同一提供者
@Service(timeout = 2000, retries = 0, version = "v2.0", weight = 100) public class UserServiceImpl implements UserService { }
2.7 集群容错
集群容错模式(cluster)
-
Failover Cluster:失败重试,默认值,当出现失败,重试其它服务器,默认重试 2 次,使用 retries 配置,一般用于读操作
-
Failfast Cluster:快速失败,只发起一次调用,失败立即报错,通常用于写操作
-
Failsafe Cluster:失败安全,出现异常时,直接忽略,返回一个空结果
-
Failback Cluster:失败自动恢复,后台记录失败的请求,定时重发
-
Forking Cluster:并行调用多个服务器,只要一个成功就返回
-
Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错
@Reference(timeout = 1000, retries = 1, version = "v2.0",cluster = "failover") private UserService userService;
2.8 服务降级
服务降级方式(mock)
-
mock=force:return null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用,用来屏蔽不重要服务不可用时对调用方的影响
-
mock=force:return null 表示消费方对该服务的方法调用失败后,再返回 null 值不抛出异常,用来容忍不重要服务不稳定时对调用方的影响
@Reference(timeout = 1000, retries = 1, version = "v2.0",cluster = "failover",mock = "force:return null") private UserService userService;