springboot结合zookeeper以及dubbo
今天我们来实现一个简单的分布式的案例,实现provider-api-consumer
-
首先,创建普通maven项目,将src目录删除即可
-
然后创建一个名为rpc-api的maven module
创建好之后导入dubbo以及zookeeper的相关依赖(版本都是使用人数比较多的,使用最新版本出现了很多问题,经过修改依旧不行,最后降低版本发现相关问题不再发生)
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<!--整合zookeeper-->
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
导入好依赖之后编写共有的接口IService
public interface IUserService {
User getUserById(int id);
}
以及数据库(本项目未导入sql相关依赖,所以使用的是虚拟数据)需要使用到的pojo类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private int age;
private String name;
}
项目结构如图所示
3.再创建一个名为rpc-provider的springboot项目
创建好之后先导入rpc-api再编辑application.properties,如下所示
# 应用名称
spring.application.name=rpc-provider
# 应用服务 WEB 访问端口
server.port=8000
#Dubbo provider configuration
dubbo.application.name=rpc-provider
dubbo.registry.protocol=zookeeper
dubbo.registry.address=zookeeper://127.0.0.1:2181
#扫描应用服务
dubbo.scan.base-packages=com.bing.service
最后编写UserService,如下所示
@Component//这个是spring的
@Service(interfaceClass = IUserService.class)//这个是dubbo的
public class UserService implements IUserService{
@Override
public User getUserById(int id) {
User user = new User(id,"小华");
return user;
}
}
项目结构如下所示
4.最后创建一个rpc-consumer的springboot 的module项目
依旧导入rpc-api依赖再修改application.properties文件
# 应用名称
spring.application.name=rpc-consumer
# 应用服务 WEB 访问端口
server.port=8001
dubbo.application.name=rpc-consumer
dubbo.registry.protocol=zookeeper
dubbo.registry.address=zookeeper://127.0.0.1:2181
再编写UserController
@RestController
public class UserController {
//远程调用,这是dubbo的
@Reference
IUserService iUserService;
@RequestMapping("/getUserById")
public User getUserById(int id){
return iUserService.getUserById(id);
}
}
项目结构如下
5.那么有了provider以及consumer,那么我们就可以进行代码的test了
首先整个项目的结构如图所示
在开启测试前,我们一定要确保zookeeper以及启动了,如果不知道如何安装zookeeper的,我上一篇博客以及谈到了,可以先去了解了解
那么在这里先启动服务端以及客户端,启动完成之后我们再先启动rpc-provider项目
以下是idea控制台页面(state为connected)以及zookeeper服务端(表示rpc-provider已经向zookeeper注册成功)页面
再启动rpc-consumer,idea控制台页面如下所示
那么,我们写了一个restcontroller,所以我们打开浏览器,输入http://localhost:8001/getUserById?id=1
浏览器效果如图所示
那么过程可能会遇到许多问题,最好解决的办法就是导入的依赖千万不要是最新版本,毕竟作为初学者,首先需要弄懂的是原理,等到了解之后再去使用最新版本,为生态做出贡献。
以上项目代码会上传至个人github,点击即可获取下载项目地址