SpringBoot+Dubbo+zookeeper实战
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