1.Dubbo的架构图

首先介绍一下这五个节点的角色(五个圆角矩形框)
Provider:暴露服务的服务提供方
-
Consume:调用远程服务的服务消费方 -
Registry:服务注册与发现的注册中心 -
Monitor:统计服务的调用次数和调用时间的监控中心 -
Container:服务运行容器
再来看一下调用的关系和流程:
-
① 服务容器负责启动,加载,运行服务提供者
-
② 服务提供者在启动时,向注册中心注册自己提供的服务
-
③ 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
-
④ 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
-
⑤ 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
2.第一个Dubbo案例
电影票订票
为了在一台机器上演示,首先创建了一个Maven的空项目,然后分别创建两个子模块:用户服务(服务提供者)provider-server,订单服务(服务消费者)consumer-server
2.1 创建用户服务(服务提供者)
在空项目中创建第一个模块provider-server

创建业务层接口及实现类
业务层接口:TicketService
package com.kuang.service;
public interface TicketService {
public String getTicket();
}
业务层实现类:TicketServiceImpl
package com.kuang.service;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
// zookeeper 服务注册与发现
// 可以被扫描到,在项目一启动就能自动注册到注册中心
@Service // 暴露服务
// 使用了dubbo后尽量不要有service注解
@Component
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "《大决战》";
}
}
application.properties
server.port=8001 # 服务应用名字 dubbo.application.name=provider-server # 注册中心 dubbo.registry.address=zookeeper://127.0.0.1:2181 # 哪些服务要被注册 dubbo.scan.base-packages=com.kuang.service
引入依赖:pom.xml
<!--导入依赖:dubbo+zookeeper-->
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!--zkclient-->
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!--日志会冲突-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.0</version>
<!-- 排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
2.2 创建订单服务(服务消费者)
在项目中创建第二个模块:consumer-server

业务层接口:UserService
package com.kuang.service;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service
public class UserService {
// 想拿到provider-server提供的票,要去注册中心拿到服务
@Reference // 引用服务, pom坐标,可以定义路径相同的接口名
TicketService ticketService;
public void buyTicket() {
String ticket = ticketService.getTicket();
System.out.println("在注册中心拿到=>"+ticket);
}
}
为了引用TicketService,可以用pom坐标的方式,也可以定义路径相同的接口名
两边的接口相同,才能调用到,在consumer-server中也写一个TicketService
TicketService
package com.kuang.service;
public interface TicketService {
public String getTicket();
}
application.properties
server.port=8002 # 消费者去哪里拿服务需要暴露自己的名字 dubbo.application.name=consumer-server # 注册中心的地址,可以在任何电脑上! dubbo.registry.address=zookeeper://127.0.0.1:2181
2.3 启动
首先启动zookeeper的zkServer.cmd,zkCli.cmd,双击即可

再开启dubbo-admin,java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
再启动两个模块的主启动类
服务提供者:


消费者:


3.在开发过程中遇到的bug

我的解决办法是将pom.xml中的这两个依赖降级到2.12.0就可以了

参考:
https://www.cnblogs.com/xichji/p/14097076.html
bug调试:
https://blog.csdn.net/TO_my_honour/article/details/98806550?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control
https://www.cnblogs.com/zhangmingcheng/p/12073818.html
https://blog.csdn.net/qq_39597203/article/details/86065353?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242
https://blog.csdn.net/weixin_39816332/article/details/83239307