高级特性
- 1.序列化
- 2.地址缓存
- 3.超时与重试
- 超时
- 重试
- 4.多版本
- 5.负载均衡
- 6.集群容错
- 7.服务降级
1.序列化
生产者与消费者之间传输对象
2.地址缓存
注册中心挂了,服务是否可以正常访问?
- 可以,因为dubbo服务消费者在第一次调用时会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。
- 当服务提供者地址发生变化时,注册中心会通知服务消费者。
3.超时与重试
超时
dubbo利用超时机制解决这一问题
- 设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
- 使用timeout属性配置超时时间,默认值1000,单位秒。
- 默认重试次数2次。
服务提供者:
java">@Service(timeout = 3000, retries = 3) //当前服务超时时间为3秒,重试次数3次
public class UserServiceImpl implements UserService {@Overridepublic String sayHello() {return "hello dubbo!";}@Overridepublic User getUserById(int id) {//查询User对象User user = new User(1,"jack","123456");return user;}
}
服务消费者:
java">@RestController
@RequestMapping("/user")
public class UserController {//注入Service//@Autowired/*远程注入1.从zookeeper注册中心获取userService的访问url2.进行远程调用rpc3.将结果封装为一个代理对象,给变量赋值*/@Reference(timeout = 1000)private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}
}
建议:超时时间建议定义在服务提供方,而不是调用方。
重试
4.多版本
设置接口的版本号
版本v1.0:
java">@Service(version = "v1.0", timeout = 3000, retries = 3) //当前服务超时时间为3秒,重试次数3次
public class UserServiceImpl implements UserService {@Overridepublic String sayHello() {return "hello dubbo!";}@Overridepublic User getUserById(int id) {//查询User对象User user = new User(1,"jack","123456");return user;}
}
版本v2.0:
java">@Service(version = "v2.0")
public class UserServiceImpl2 implements UserService {@Overridepublic String sayHello() {return "hello dubbo version 2.0";}@Overridepublic User getUserById(int id) {return null;}
}
服务消费者:
指定对应的版本号
java">@RestController
@RequestMapping("/user")
public class UserController {/*远程注入指定对应的版本*/@Reference(version = "1.0")private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}
}
5.负载均衡
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 weighted random 基于权重的随机负载均衡策略。
具体实现上,Dubbo 提供的是客户端负载均衡,即由 Consumer 通过负载均衡算法得出需要将请求提交到哪个 Provider 实例。
目前 Dubbo 内置了如下负载均衡算法,可通过调整配置项启用。
算法 | 特性 | 备注 |
---|---|---|
Weighted Random LoadBalance | 加权随机 | 默认算法,默认权重相同 |
RoundRobin LoadBalance | 加权轮询 | 借鉴于 Nginx 的平滑加权轮询算法,默认权重相同, |
LeastActive LoadBalance | 最少活跃优先 + 加权随机 | 背后是能者多劳的思想 |
Shortest-Response LoadBalance | 最短响应优先 + 加权随机 | 更加关注响应速度 |
ConsistentHash LoadBalance | 一致性哈希 | 确定的入参,确定的提供者,适用于有状态请求 |
P2C LoadBalance | Power of Two Choice | 随机选择两个节点后,继续选择“连接数”较小的那个节点。 |
Adaptive LoadBalance | 自适应负载均衡 | 在 P2C 算法基础上,选择二者中 load 最小的那个节点 |
服务提供者可以设置权重
java">@Service(version = "v2.0",weight = 200)
public class UserServiceImpl2 implements UserService {@Overridepublic String sayHello() {return "hello dubbo version 2.0";}
}
服务消费者指定负载均衡算法
java">@RestController
@RequestMapping("/user")
public class UserController {/*远程注入loadbalance 指定负载均衡算法*/@Reference(version = "1.0",loadbalance = "random")private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}
}
6.集群容错
服务消费者指定集群容错的模式
java">@RestController
@RequestMapping("/user")
public class UserController {/*远程注入cluster参数指定集群容错模式*/@Reference(version = "1.0",loadbalance = "random",cluster = "failover")private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}
}
7.服务降级
服务降级方式:
服务消费者指定服务降级方式:
java">@RestController
@RequestMapping("/user")
public class UserController {/*mock 指定服务降级方式*/@Reference(mock = "force:return+null")private UserService userService;@RequestMapping("/sayHello")public String sayHello(){return userService.sayHello();}
}
更多高级特性参考官网:
https://cn.dubbo.apache.org/zh-cn/overview/mannual/