三分钟springboot整合dubbo3(一)(调用、超时、重试)

三分钟springboot整合dubbo3(一)

    • 1、依赖添加
    • 2、配置文件
    • 3、代码编写
      • 3.1、服务提供者与服务消费者共同部分
      • 3.2、服务提供者代码
      • 3.3、消费者代码编写
      • 3.4、调用方式
      • 3.5、启动失败解决思路
    • 4、@DubboService配置
      • 4.1、版本号是什么,怎么使用
      • 4.2、接口访问超时设置(有坑哦!!!!)
    • 5、zookeeper下载与启动
    • 6、结束语

1、依赖添加

dubbot整合spring的依赖、注册中心的依赖是必须引入的。这不废话吗?不引入用啥,生产者和消费者都引入下图相同的配置即可。

重点是协议依赖部分 ,因为多个项目之间沟通需要一种协议,最常见的就是HTTP协议了。下图引入了dubbo和triple协议(dubbo3.0新增的协议)用于交互数据,可以根据需求自行引入。 协议是什么?dubbo是远程调用,说白了就是俩进程互相调用,放到现实世界就是俩人之间沟通,但是沟通需要方式对吧,一个人玩手语,另一个说英语,那不乱套了。协议就是规定了咱俩沟通用什么方式,放到程序里就是我给你的数据格式长什么样子。

<parent>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-parentartifactId>
	<version>2.5.5version>
	<relativePath/> 
parent>

<dependencies>
	<dependency>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-webartifactId>
	dependency>
	<dependency>
		<groupId>org.apache.dubbogroupId>
		<artifactId>dubbo-spring-boot-starterartifactId>
		<version>3.0.7version>
	dependency>
	
	<dependency>
		<groupId>org.apache.dubbogroupId>
		<artifactId>dubbo-rpc-dubboartifactId>
		<version>3.0.7version>
	dependency>
	<dependency>
		<groupId>org.apache.dubbogroupId>
		<artifactId>dubbo-rpc-tripleartifactId>
		<version>3.0.7version>
	dependency>
	
	<dependency>
		<groupId>org.apache.dubbogroupId>
		<artifactId>dubbo-registry-zookeeperartifactId>
		<version>3.0.7version>
	dependency>
dependencies>

2、配置文件

server.port=8082
# 这个是名称哦,为了保证唯一,用项目名称即可,没啥要求
dubbo.application.name=02_consumer
# 协议配置,注意triple的协议名字是tri
dubbo.protocol.name=dubbo
#dubbo.protocol.name=tri
# 协议要使用的端口
dubbo.protocol.port=20880
# 注册中心用的是zookeeper
dubbo.registry.address=zookeeper://localhost:2181

# dubbo3新增特性,不配置也没事哦!!! 因为dubbo2在zookeeper注册的信息是接口,量比较大
# 3版本可以注册项目进去,缓解了zookeeper的压力
# all是全存 interface是存接口信息 instance存与应用信息
# dubbo.application.register-mode=instance

3、代码编写

3.1、服务提供者与服务消费者共同部分

1.1 双方的启动类添加**@EnableDubbo**注解
1.2 双方要有相同的接口, 可以单独建立一个项目打成jar包,里面存放接口,俩项目引入即可

// 开启dubbo注解
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}
public interface ProviderService {
    HashMap<String, String> getInfo(String msg);
}

3.2、服务提供者代码

正常编写业务代码,将@Service注解替换为@DubboService即可,配置一个版本号,默认为空,末尾会讲解版本号作用

@DubboService(version = "1.0")
public class ProviderServiceImpl implements ProviderService{
    @Override
    public HashMap<String, String> getInfo(String id) {
        HashMap<String, String> map = new HashMap<>();
        map.put("id", id);
        map.put("作者", "问君何为彼岸花");
        map.put("信息", "等我成为高级工程师的那天就去追你");
        return map;
    }
}

3.3、消费者代码编写

将@Autowrite注解替换为@DubboReference,版本号置定位“1.0”,末尾会讲解版本号作用。

@RestController
public class TestController {
    @DubboReference(version = "1.0")
    private ProviderService providerService;

    @RequestMapping("/test")
    public String getInfo(String id){
        HashMap<String, String> map = providerService.getInfo(id);
        return map.get("信息");
    }
}

3.4、调用方式

1、启动zookeeper,项目演示使用的是apache-zookeeper-3.5.10
2、先启动服务提供者,在启动服务消费者
3、文中消费者使用端口为8082,页面调用如下地址即可

localhost:8082/test

3.5、启动失败解决思路

1、检查zookeeper是否启动成功
2、依赖是否保持一致
3、服务提供者与消费者版本号是否一致!!!

4、@DubboService配置

4.1、版本号是什么,怎么使用

Q: 同接口有两个具体实现类,而服务调注入时类型选择的接口,如何获取到指定实现类?
A: 使用一个版本号作为标识,消费者注入时,指定与服务提供者一样的版本号即可

@DubboService(version = "1.0")
public class ProviderServiceImpl1 implements ProviderService{
    @Override
    public HashMap<String, String> getInfo(String id) {
        HashMap<String, String> map = new HashMap<>();
        map.put("版本", "1版本");
        return map;
    }
}

@DubboService(version = "2.0")
public class ProviderServiceImpl2 implements ProviderService{
    @Override
    public HashMap<String, String> getInfo(String id) {
        HashMap<String, String> map = new HashMap<>();
        map.put("版本", "2版本");
        return map;
    }
}
/*** 服务提供者指定使用版本 */
@DubboReference(version = "2.0")
private ProviderService providerService;

4.2、接口访问超时设置(有坑哦!!!)

下图分别是提供者与消费者代码片段,一般接口超过一定时间未给出反馈,我们就判断该接口存在问题,故而走我们的异常逻辑处理代码。此时可以在服务端配置timeout来规定,服务提供者更清楚接口处理时间
坑来了 → 下图服务端设置了2秒超时,而我们的消费者端消费了三倍的时间才出来,也就是说用了6秒才得到超时反馈,waht??? 好在机智的我让服务端输出了语句,发现服务端打印了三次语句,就是说消费者请求了3次,真奇怪,默认值明明是-1,机智的小伙伴想必知道图中注释是干啥用的了吧=. =,规定消费者重试次数的

@DubboService(version = "1.0", timeout = 2000)
public class ProviderServiceImpl1 implements ProviderService{
    @Override
    public HashMap<String, String> getInfo(String id) {
    	try {
            System.out.println("进来了");
            Thread.sleep(2000l);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        HashMap<String, String> map = new HashMap<>();
        map.put("版本", "1版本");
        return map;
    }
}

@RestController
public class TestController {
    @DubboReference(version = "1.0")
    //@DubboReference(version = "1.0", retries = 0)
    private UserService userService;
    private ProviderService providerService;
    @RequestMapping("/test")
    public String getInfo(String id){
    	long l1 = System.currentTimeMillis();
        try {
        	HashMap<String, String> map = providerService.getInfo(id);
        }catch (Exception e){
            long l2 = System.currentTimeMillis();
            System.out.println(l2 - l1);
        }
        return "1";
    }
}

5、zookeeper下载与启动

链接: 官网地址,进去以后找download下载
不知道怎么上传图片我就口述了,这东西解压即用,就3步骤
1.解压文件
2.进入conf目录,将zoo_sample.cfg的文件名修改为zoo.cfg
3.进入bin目录双击zkServer.cmd,linux就执行 sh zkServer.sh

6、结束语

作者技术水平有限,这会才工作两年多些,文章有不对的地方或不全的地方,请给指正出来,大家抱团取暖互相支持!!!

你可能感兴趣的:(dubbo篇,dubbo,java-zookeeper,zookeeper,springboot)