文章目录

  • Dubbo
  • 4 Dubbo 高级特性
  • 4.2 Dubbo 常用高级配置
  • 4.2.4 重试
  • 4.2.5 多版本


4.2 Dubbo 常用高级配置
4.2.4 重试

之前我们已经完成 了超时的配置

dubbo重试次数 dubbo设置重试次数_java

而且知道 了如果服务提供方 和消费方 都配置 了超时时间的话, 消费方 会覆盖 提供方。

下面来说说 重试的机制

dubbo重试次数 dubbo设置重试次数_dubbo重试次数_02

  • 设置了超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
  • 如果出现网络抖动,则这一次请求就会失败。
  • Dubbo 提供重试机制来避免类似问题的发生。
  • 通过 retries 属性来设置重试次数。默认为 2 次。

【试试】

修改提供方 的实现类

dubbo重试次数 dubbo设置重试次数_开发语言_03

重试 两次,

重启服务 ,测试

dubbo重试次数 dubbo设置重试次数_开发语言_04

没毛病,它就是 被调用 了三次 【原本1 次 + 重试 2 次】

4.2.5 多版本

【举个栗子】

dubbo重试次数 dubbo设置重试次数_java_05

现在 有一个服务提供者D 和三个 服务消费者A、B、C

他们仨 都要去调用 服务提供者

这个时候D 服务可能会出现 升级的情况

dubbo重试次数 dubbo设置重试次数_dubbo重试次数_06

现在 它升级 成了 2.0 ,而且我们将 这个 升级后的服务部署在 了E 的服务器上

现在要做的 就是把A、B、C 都转到 E 吗?

一般不会这样 做

dubbo重试次数 dubbo设置重试次数_dubbo重试次数_07

我们 会先让少量 的服务 消费者先去 “体验一下”

等C 使用完,没有问题 后

dubbo重试次数 dubbo设置重试次数_开发语言_08

再让 A、B 转过来

这样的操作, 我们 一般称之为 “灰度发布 ”

  • 灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
  • dubbo 中使用version 属性来设置和调用同一个接口的不同版本

【试试】

现在 新加 一个实现类,直接复制一个

dubbo重试次数 dubbo设置重试次数_开发语言_09

OK,2 作为 新版

给老版本 来个v1.0

dubbo重试次数 dubbo设置重试次数_dubbo_10

然后让 它调用的时候,输出 一句话

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,重启两个 服务

dubbo重试次数 dubbo设置重试次数_开发语言_11

OK,测试调用

dubbo重试次数 dubbo设置重试次数_dubbo重试次数_12

没有问题,换成 2.0 并重启web 服务

dubbo重试次数 dubbo设置重试次数_dubbo_13

没毛病【这就是 多版本】