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>
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
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);
}
正常编写业务代码,将@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;
}
}
将@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("信息");
}
}
1、启动zookeeper,项目演示使用的是apache-zookeeper-3.5.10
2、先启动服务提供者,在启动服务消费者
3、文中消费者使用端口为8082,页面调用如下地址即可
localhost:8082/test
1、检查zookeeper是否启动成功
2、依赖是否保持一致
3、服务提供者与消费者版本号是否一致!!!
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;
下图分别是提供者与消费者代码片段,一般接口超过一定时间未给出反馈,我们就判断该接口存在问题,故而走我们的异常逻辑处理代码。此时可以在服务端配置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";
}
}
链接: 官网地址,进去以后找download下载
不知道怎么上传图片我就口述了,这东西解压即用,就3步骤
1.解压文件
2.进入conf目录,将zoo_sample.cfg的文件名修改为zoo.cfg
3.进入bin目录双击zkServer.cmd,linux就执行 sh zkServer.sh
作者技术水平有限,这会才工作两年多些,文章有不对的地方或不全的地方,请给指正出来,大家抱团取暖互相支持!!!