Dubbo简介
Apache Dubbo 官网:https://dubbo.apache.org/zh/
Apache Dubbo 是一款微服务开发框架,提供了 RPC【远程过程调用 Remote Procedure Call】通信与微服务治理 两大关键能力。这意味着,使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 Dubbo 提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。同时 Dubbo 是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。Dubbo 提供的基础能力包括:
- 服务发现
- 流式通信
- 负载均衡
- 流量治理
- ……
Zookeeper 简介
Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境。
SpringBoot 项目整合
需要搭建 Zookeeper 环境:https://blog.csdn.net/qq_20185737/article/details/122202628
示例项目分为三个模块:
- romantik:maven 多模块聚合项目
- common:提取公共的实体类和服务接口,普通 Java 项目
- app:服务消费者,远程调用 service 提供的服务,SpringBoot 项目
- service:服务提供者,common 的服务接口具体实现,SpringBoot 项目
父模块
在父项目的 pom.xml 用 dependencyManagement 管理 Dubbo,Zookeeper 的依赖版本
<properties><java.version>1.8</java.version><dubbo.version>3.0.5</dubbo.version></properties><dependencyManagement><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>${dubbo.version}</version><exclusions>//排除冲突的依赖<exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions><type>pom</type></dependency></dependencies></dependencyManagement>
common 模块
在 common 模块的 pom.xml 中引入父项目的坐标
<parent><artifactId>romantic</artifactId><groupId>com.example</groupId><version>1.0.0</version></parent>
导入 service 模块和 app 模块公共依赖,这样在 service 模块和 app 模块中添加 common 模块依赖时就会导入这些依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><type>pom</type></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope></dependency></dependencies>
service 模块
service 模块的 pom.xml 中添加对 common 模块的依赖和其他依赖的导入
<dependencies><!--common依赖--><dependency><groupId>com</groupId><artifactId>common</artifactId><version>1.0.0</version></dependency></dependencies>
配置 Service 模块的配置文件
#数据源配置spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCusername: rootpassword: 123456#防止端口冲突server: port: 8001#dubbo配置dubbo: application: #应用名称name: providerregistry: #注册中心地址address: zookeeper://49.232.212.119:2181#超时时间,单位毫秒timeout: 30000#元中心地址metadata-report: address: zookeeper://49.232.212.119:2181protocol: #协议名称name: dubbo#协议端口port: 20880scan: #扫描服务包的位置base-packages: com.service.impl
app 模块
app 模块的 pom.xml 中添加对 common 模块的依赖和其他依赖的导入
<dependencies><dependency><artifactId>dubbo-api</artifactId><groupId>com.example</groupId><version>1.0.0</version></dependency></dependencies>
配置 app 模块的配置文件
#防止端口冲突server: port: 8002dubbo: application: #应用名称name: consumerregistry: #注册中心地址address: zookeeper://49.232.212.119:2181timeout: 30000
测试
- 在 common 模块下编写 User 实体类
publicclassUserimplementsSerializable { privateIntegerid; privateStringusername; privateStringpassword; }
- 编写 User 的服务接口 UserService
publicinterfaceUserService { UsergetUser(); }
- 在 Service 模块中进行实现 common 模块的服务接口 UserService
/*** @author Jie*/version="1.0") (publicclassUserServiceImplimplementsUserService { /*** 实现 UserService 的 getUser() 方法* @return 返回一个 User*/publicUsergetUser() { returnnewUser(20,"喵喵","123456"); } }
- 使用 @DubboService 注解向注册中心注册服务
- 在 app 中编写 controller
publicclassUserController { version="1.0") (privateUserServiceuserService; "/user") (publicUsergetUser(){ returnuserService.getUser(); } }
- 使用 @DubboReference 远程调用注册中心中的服务
- 启动两个模块,访问 localhost:8002/user,就可以看到执行成功了