Dubbo
【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】
4 Dubbo 高级特性
文章目录
- Dubbo
- 4 Dubbo 高级特性
- 4.2 Dubbo 常用高级配置
- 4.2.4 重试
- 4.2.5 多版本
4.2 Dubbo 常用高级配置
4.2.4 重试
之前我们已经完成 了超时的配置
而且知道 了如果服务提供方 和消费方 都配置 了超时时间的话, 消费方 会覆盖 提供方。
下面来说说 重试的机制
-
设置了超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
-
如果出现网络抖动,则这一次请求就会失败。
-
Dubbo 提供重试机制来避免类似问题的发生。
-
通过 retries 属性来设置重试次数。默认为 2 次。
【试试】
修改提供方 的实现类
重试 两次,
重启服务 ,测试
没毛病,它就是 被调用 了三次 【原本1 次 + 重试 2 次】
4.2.5 多版本
【举个栗子】
现在 有一个服务提供者D 和三个 服务消费者A、B、C
他们仨 都要去调用 服务提供者
这个时候D 服务可能会出现 升级的情况
现在 它升级 成了 2.0 ,而且我们将 这个 升级后的服务部署在 了E 的服务器上
现在要做的 就是把A、B、C 都转到 E 吗?
一般不会这样 做
我们 会先让少量 的服务 消费者先去 “体验一下”
等C 使用完,没有问题 后
再让 A、B 转过来
这样的操作, 我们 一般称之为 “灰度发布 ”
- 灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
- dubbo 中使用version 属性来设置和调用同一个接口的不同版本
【试试】
现在 新加 一个实现类,直接复制一个
OK,2 作为 新版
给老版本 来个v1.0
然后让 它调用的时候,输出 一句话
package com.dingjiaxiong.service.impl;
import com.dingjiaxiong.pojo.User;
import com.dingjiaxiong.service.UserService;
import org.apache.dubbo.config.annotation.Service;
/**
* ClassName: UserServiceImpl
* date: 2022/11/13 20:27
*
* @author DingJiaxiong
*/
//@Service
@Service(version = "v1.0") // 将这个类提供的方法【服务】对外发布,将访问的地址ip、端口、路径注册到 注册中心 中
public class UserServiceImpl implements UserService {
public String sayHello() {
return "Hello , Dubbo! DingJiaxiong";
}
public User findUserById(int id) {
System.out.println("我是v1.0 版本 old..." );
// 查询User 对象【这里躲懒了,不走数据库】
User user = new User(1, "zhangsan", "123");
return user;
}
}
OK
再改下新版本,即 第二个 实现类
package com.dingjiaxiong.service.impl;
import com.dingjiaxiong.pojo.User;
import com.dingjiaxiong.service.UserService;
import org.apache.dubbo.config.annotation.Service;
/**
* ClassName: UserServiceImpl
* date: 2022/11/13 20:27
*
* @author DingJiaxiong
*/
//@Service
@Service(version = "v2.0") // 将这个类提供的方法【服务】对外发布,将访问的地址ip、端口、路径注册到 注册中心 中
public class UserServiceImpl2 implements UserService {
public String sayHello() {
return "Hello , Dubbo! DingJiaxiong";
}
public User findUserById(int id) {
System.out.println("你正在使用新版本 v2.0: new ...");
// 查询User 对象【这里躲懒了,不走数据库】
User user = new User(1, "zhangsan", "123");
return user;
}
}
现在 在控制器里面 ,调用的时候 也可以指定调用的版本
package com.dingjiaxiong.controller;
import com.dingjiaxiong.pojo.User;
import com.dingjiaxiong.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* ClassName: UserController
* date: 2022/11/13 20:39
*
* @author DingJiaxiong
*/
@RestController
@RequestMapping("/user")
public class UserController {
//注入 Service
// @Autowired //这个是本地 注入
@Reference(version = "v1.0")
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello(){
return userService.sayHello();
}
// 根据ID 查询用户信息
@RequestMapping("/find")
public User find(int id){
return userService.findUserById(id);
}
}
OK,重启两个 服务
OK,测试调用
没有问题,换成 2.0 并重启web 服务
没毛病【这就是 多版本】