38、springboot——分布式之zookeeper+dubbo
一、分布式应用简介
在分布式系统中,国内常用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring,Spring Boot+Spring Cloud。
分布式系统:
Zookeeper和Dubbo

二、docker安装zookeeper
docker pull zookeeper
安装完成
启动zookeeper(镜像id选自己安装的)
docker run --name zk01 -p 2181:2181 --restart always -d b6f6e4bc7eef
三、创建两个工程,一个服务提供者,一个服务消费者,进行测试springboot+zookeeper+dubbo
我这里为了测试方便,只创建一个工程,这个工程分两个模块
1、建一个空的工程
2、新建模块
3、选择springboot的初始化向导
4、先创建一个服务提供者
点next之后选选择WEB模块
5、在service包下建一个TicketService接口
public interface TicketService { //返回电影票 public String getTicket(); }
6、再创建TicketService的实现类TicketServiceImpl
public class TicketServiceImpl implements TicketService{ @Override public String getTicket() { return "《我和我的祖国》"; } }
7、再创建一个模块作为服务消费者
也是只选择WEB模块方便测试
模块创建成功
8、在消费模块中创建一个UserService类
我们想在这个consumer-user模块(工程)当中调用provider-ticket模块(工程)的的GetTicket方法;跨工程调用,此时我们就要用到dubbo+zookeeper了
9、将服务提供者(provide-ticket)注册到注册中心(zookeeper)
1.导入相关依赖
<!--springboot整合dubbo的依赖--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <!--引入zookeeper的客户端工具--> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
zkclient是由Datameer的工程师开发的开源客户端,对Zookeeper的原生API进行了包装,实现了超时重连、Watcher反复注册等功能
2、application.properties中进行配置注册
我的虚拟机的ip是192.168.237.132
#应用名
dubbo.application.name=provider-ticket
#发布到注册中心
dubbo.registry.address=zookeeper://192.168.237.132:2181
#将哪些包下的东西发布出去
dubbo.scan.base-packages=com.atguigu.ticket.service
3、在TicketServiceImpl中添加相关注解
注意@Service是dubbo包下的,不是spring的
在application.properties中指定的包下有@Service的注解就会发布到注册中心中
当然要把这个组件注册到容器中,所以用了@Component
import org.alibaba.dubbo.config.annotation.Service; import org.springframework.stereotype.Component; @Component @Service //将服务发布出去 public class TicketServiceImpl implements TicketService{ @Override public String getTicket() { return "《我和我的祖国》"; } }
总结:将服务提供者注册到注册中心
1、引入dubbo和zkclien相关依赖
2、配置dubbo的扫描包和注册中心地址
3、使用@Service发布服务
4、后面还会提到@DubboComponentScan @SpringBootApplication这两个注解的问题
10、将项目启动,配置的服务就会注册到注册中心中
11、我们要消费服务则回到consumer-user模块中
1、同样先在pom.xml中添加依赖
<!--springboot整合dubbo的依赖--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <!--引入zookeeper的客户端工具--> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
2、application.properties中进行相关配置
服务模块注册在哪个注册中心中则消费模块就用哪个注册中心
#应用名
dubbo.application.name=consumer-user
#注册中心
dubbo.registry.address=zookeeper://192.168.237.132:2181
3、想在UserService中使用TicketService则在consumer模块中也要放一份相同的,全类名要相同;可以不用实现类,接口就行
******实际使用时应该是把服务提供的包进行打包,然后再pom文件中引用,而不是自己去建立接口********
consumer-user模块的:
provide-ticket模块的:
4、UserService中进行远程调用
注意这里的@Service注解就是spring的,而不是dubbo的,只是简单的把service放入容器中
import com.alibaba.dubbo.config.annotation.Reference; import com.atguigu.ticket.service.TicketService; import org.springframework.stereotype.Service; @Service public class UserService { //远程引用 ——在注册中心中按照全类名进行匹配 @Reference TicketService ticketService; public void hello(){ String ticket = ticketService.getTicket(); System.out.println("买到票了:"+ticket); } }
12、最终测试
1、在consumer-user模块中写测试方法
@SpringBootTest class ConsumerUserApplicationTests { @Autowired UserService userService; @Test public void contextLoads() { userService.hello(); } }
2、运行测试方法时provide-ticket(服务提供者)应用是开启状态,且注册中心服务(zookeeper)也是开启状态的
运行测试方法却报空指针异常;估计是版本问题;我在provide-ticket模块中(服务提供者)的启动器类中加上@DubboComponentScan @SpringBootApplication两个注解
@EnableDubbo @DubboComponentScan @SpringBootApplication public class ProviderTicketApplication { public static void main(String[] args) { SpringApplication.run(ProviderTicketApplication.class, args); } }
3、重新测试
测试成功:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)