dubbo 重试、 多版本 、负载均衡
重试
- 设置了超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
- 如果出现网络抖动,则这一-次请求就会失败。
- Dubbo提供重试机制来避免类似问题的发生。
- 通过retries属性来设置重试次数。默认为2次
//timeout 超时时间 单位毫秒 retries 设置重试次数
@Service(timeout = 3000,retries=0)
//@Service//将该类的对象创建出来,放到Spring的IOC容器中 bean定义
//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
@Service(timeout = 3000,retries = 2)//当前服务3秒超时,重试2次,一共3次
public class UserServiceImpl implements UserService {
int i = 1;
public String sayHello() {
return "hello dubbo hello!~";
}
public User findUserById(int id) {
System.out.println("服务被调用了:"+i++);
//查询User对象
User user = new User(1,"zhangsan","123");
//数据库查询很慢,查了5秒
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return user;
}
}
多版本
**灰度发布:**当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
dubbo中使用version属性来设置和调用同一个接口的不同版本
生产者配置
这是指定 版本号
@Service(version="v2.0")
public class UserServiceImp12 implements UserService {...}
消费者配置
这是指定 使用的是什么版本
@Reference(version = "v2.0")//远程注入
private UserService userService;
负载均衡
负载均衡策略(4种) :
**Random:**按权重随机,默认值。按权重设置随机概率。
RoundRobin: 按权重轮询。
LeastActive: 最少活跃调用数,相同活跃数的随机。
**ConsistentHash:**一 致性Hash,相同参数的请求总是发到同一提供者。
为何要用负载均衡
作为服务提供者,只用一台机器运作,效率低,一旦发生故障就全盘崩溃。因此要用多台机器作为服务提供者。当有机器发生故障时,还能用其他的来运转。不至于一下子全盘崩掉。为了使这些机器接受到从服务消费者过来的请求,能在这些机器均衡分配,这样使得提供者的负但的处理量相当,不至于某台机器处理70-80%的请求,有的机子却在空闲中。这会造成某台机子的负担过大而崩溃。
负载均衡 其实就是平均分配服务器 处理请求的数量,控制处理的顺序,使机子之间的负担均衡。防止应负担过大而崩溃。
**Random:**按权重随机,默认值。按权重设置随机概率。
@Service(weight = 100)
weight 权重的意思,在注解中设置权重属性值,来控制负载均衡的分配。值越大分配到的几率就会大些。
权重可以设置在类注解里,也可以设置在自动注入的注解里。
举列:
//@Service//将该类的对象创建出来,放到Spring的IOC容器中 bean定义
//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
@Service(weight = 100)
public class UserServiceImpl implements UserService {
public String sayHello() {
return "3......";
}
```
spring配置文件
```xml
<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" />
在服务消费者里,也就是 controller层中
在 @Reference 远程注入注解的属性里
使用 loadbalance 属性 他的意思是:负载均衡
来指定 负载均衡策略
@RestController
@RequestMapping("/user")
public class UserController {
//注入Service
//@Autowired//本地注入
/*
1. 从zookeeper注册中心获取userService的访问url
2. 进行远程调用RPC
3. 将结果封装为一个代理对象。给变量赋值
*/
@Reference(loadbalance = "random")//远程注入
private UserService userService;
RoundRobin: 按权重轮询。
就是 看 weight = 100的值,值较大的,在第一遍按顺序分配后,从第二遍开始 从值最大的机子开始 向值小的 降序分配。
LeastActive: 最少活跃调用数,相同活跃数的随机。
就是优先分配给处理速度快的机子处理,遇到速度相同的按随机分配。
**ConsistentHash:**一 致性Hash,相同参数的请求总是发到同一提供者。
这是将,从消费者过来的请求,第一次是分配给由谁处理的,以后都由谁来处理这个消费者的请求