springboot集成dubbo zookeeper windows版
1.最近学习dubbo 参照网上资料首次集成springboot和dubbo 特记录本次操作
废话不多说 直接开干
1.安装zookeeper
1.安装zookee 直接参照网上弄了个单机版的zookeeper
官网下载后 直接解压到相关目录
在目录下新建data和logs文件夹
在zookeeper-3.4.13\conf conf目录下 打开zoo_sample.cfg 修改以下内容 另存为zoo.cfg
dataDir=E:/zk/zookeeper-3.4.13/data
dataLogDir=E:/zk/zookeeper-3.4.13/logs
之后就可以启动zookeeper的服务了
到bin目录下直接输入cmd 运行 zkServer.cmd启动服务
2.dubbo
https://gitee.com/chenghao842822530/springbootdemo/attach_files
dubbo在打war包之前修改其配置如下:
WEB-INF目录下的dubbo.properties文件
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
然后启动tomcat就启动了dubbo的服务,我们可以访问控制台看看
这个是网上我直接copy过来的 直接下载war包 copy到tomcat的webapp目录下 运行
http://localhost:8089/dubbo-admin-2.5.4 我把tomcat的端口设置成了8089 注意自己的默认的是8080
输入密码root
这是dubbo 可以查看到 我们的服务 生产者和消费者 我已经运行了 所以有个数据
3.编写java生产者 和 消费者
3.1 生产者
新建springboot项目 可以到 https://start.spring.io/ 快速新建一个springboot项目
先看目录结构
配置项写在了properties里 也可以是xml里
## Dubbo \u670D\u52A1\u63D0\u4F9B\u8005\u914D\u7F6E spring.dubbo.application.name=provider spring.dubbo.registry.address=zookeeper://127.0.0.1:2181 spring.dubbo.protocol.name=dubbo spring.dubbo.protocol.port=20880 spring.dubbo.scan=com.dubbo.dubbodemo.service
pom的依赖 增加以下依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
下面我们创建一个简单的服务(其实就是写个接口 实现接口 给消费者调用)
首先创建个实体类User
com.dubbo.dubbodemo.domain.User;
package com.dubbo.dubbodemo.domain; import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = 1L; String name; String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
创建接口
com.dubbo.dubbodemo.service.UserService
package com.dubbo.dubbodemo.service; import com.dubbo.dubbodemo.domain.User; public interface UserService { User saveUser(User user); }
实现接口UserService 注意这里的@Service 是dubbo的service
com.dubbo.dubbodemo.service.impl;
package com.dubbo.dubbodemo.service.impl; import com.alibaba.dubbo.config.annotation.Service; import com.dubbo.dubbodemo.service.UserService; import com.dubbo.dubbodemo.domain.User; @Service public class UserServiceImpl implements UserService { @Override public User saveUser(User user) { // user.setAge("1"); // user.setName("hanhao"); // TODO Auto-generated method stub System.out.println(user.toString()); System.out.println(user.toString()); return user; } }
到这里生产者我们就完成了
3.2消费者 创建一个新的springboot项目
新建User
com.dubbo.dubbodemo.domain.User
package com.dubbo.dubbodemo.domain; import java.io.Serializable; public class User implements Serializable{ /** * */ private static final long serialVersionUID = 1L; String name; String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
新建Service com.dubbo.dubbodemo.service.UserService
package com.dubbo.dubbodemo.service; import com.dubbo.dubbodemo.domain.User; public interface UserService { User saveUser(User user); }
新建调用Service的方法 注意
@Reference
com.dubbo.dubbodemo.service.ComsumerService
package com.dubbo.dubbodemo.service; import org.springframework.stereotype.Component; import com.alibaba.dubbo.config.annotation.Reference; import com.dubbo.dubbodemo.domain.User; @Component public class ConsumerService { @Reference UserService userService; public User saveUser() { User user = new User(); user.setAge("10"); user.setName("hanwenhao"); return userService.saveUser(user); } }
新建一个controller调用 UserController
package com.dubbo.dubbodemo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.dubbo.dubbodemo.service.ConsumerService; @RestController public class UserController{ /** * */ @Autowired private ConsumerService service; @RequestMapping("/save") public Object saveUser() { System.out.println("customer"); return service.saveUser(); } }
消费者完成
忘记说消费者的pom 加下面依赖
<!-- Spring Boot Dubbo 依赖 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
properties配置
## \u907F\u514D\u548C server \u5DE5\u7A0B\u7AEF\u53E3\u51B2\u7A81
##因为我是一台机器运行 设置8081防止端口占用 server.port=8081 ## Dubbo \u670D\u52A1\u6D88\u8D39\u8005\u914D\u7F6E spring.dubbo.application.name=consumer spring.dubbo.registry.address=zookeeper://127.0.0.1:2181 spring.dubbo.scan=com.dubbo.dubbodemo.service
运行后
查看dubbo里面有没有什么神奇的东西出现 而后调用controller 实现调用
调用Cotrolller结果
感想
自己根据网上搞的第一个springboot dubbo zookeeper示例 代码写的不太规范
这个dubbo zookeeper集成说是分布式 感觉和接口调用有点类似。网上查了下
http好比普通话,rpc好比团伙内部黑话。
讲普通话,好处就是谁都听得懂,谁都会讲。
讲黑话,好处是可以更精简、更加保密、更加可定制,坏处就是要求“说”黑话的那一方(client端)也要懂,而且一旦大家都说一种黑话了,换黑话就困难了。
所谓的效率优势是针对http1.1协议来讲的,http2.0协议已经优化编码效率问题,像grpc这种rpc库使用的就是http2.0协议。这么来说吧http容器的性能测试单位通常是kqps,自定义tpc协议则通常是以10kqps到100kqps为基准
简单来说成熟的rpc库相对http容器,跟多的是封装了“服务发现”,"错误重试"一类面向服务的高级特性。可以这么理解,rpc框架是面向服务的更高级的封装。如果把一个http server容器上封装一层服务发现和函数代理调用,那它就已经可以做一个rpc框架了。
所以为什么要用rpc调用?
因为良好的rpc调用是面向服务的封装,针对服务的可用性和效率等都做了优化。单纯使用http调用则缺少了这些特性。
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术