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.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: 123456
#防止端口冲突
server:
port: 8001
#dubbo 配置
dubbo:
application:
#应用名称
name: provider
registry:
#注册中心地址
address: zookeeper://49.232.212.119:2181
#超时时间,单位毫秒
timeout: 30000
#元中心地址
metadata-report:
address: zookeeper://49.232.212.119:2181
protocol:
#协议名称
name: dubbo
#协议端口
port: 20880
scan:
#扫描服务包的位置
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: 8002
dubbo:
application:
#应用名称
name: consumer
registry:
#注册中心地址
address: zookeeper://49.232.212.119:2181
timeout: 30000
测试
-
在 common 模块下编写 User 实体类
@Data @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { private Integer id; private String username; private String password; }
编写 User 的服务接口 UserService
public interface UserService { User getUser(); }
-
在 Service 模块中进行实现 common 模块的服务接口 UserService
/** * @author Jie */ @DubboService(version = "1.0") public class UserServiceImpl implements UserService { /** * 实现 UserService 的 getUser() 方法 * @return 返回一个 User */ @Override public User getUser() { return new User(20,"喵喵","123456"); } }
使用 @DubboService 注解向注册中心注册服务
-
在 app 中编写 controller
@RestController public class UserController { @DubboReference(version = "1.0") private UserService userService; @RequestMapping("/user") public User getUser(){ return userService.getUser(); } }
使用 @DubboReference 远程调用注册中心中的服务
-
启动两个模块,访问 localhost:8002/user,就可以看到执行成功了
我们也可以在 dubbo-admin 中看见 Service 向注册中心注册的服务。安装 dubbo-admin 的教程:Linux 通过 Maven 安装 Dubbo-admin -CSDN博客