Apache Dubbo 是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
注意,是 Apache Dubbo ,不再是 Alibaba Dubbo 。简单来说就是 Alibaba 将 Dubbo 移交给 Apache 开源社区进行维护。参见 dubbo-spring-boot-project
Spring Boot 系列:整合 Alibaba Dubbo
一、本文示例说明
1.1 框架版本 Dubbo 版本
1 2 3 4 5 |
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version> 2.7 . 5 </version> </dependency> |
Spring Boot 版本
1 2 3 4 5 6 |
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version> 2.1 . 1 .RELEASE</version> <relativePath/> </parent> |
1.2 模块关系
根工程 order :管理工程信息; 子工程 order-api :定义 RPC 服务的接口、参数以及响应结果的结果集; 子工程 order-provider : RPC 服务的提供端; 子工程 order-consumer : RPC 服务的消费端,实际开发过程中实际情况是其它服务的调用该订单 RPC 服务二、根工程
2.1 创建项目 order
我这里为了和之前老版本的 alibaba 的 dubbo 项目区分,文件名取为 apache-dubbo-demo , maven 项目名称为 order 。
该项目主要作用是定义工程信息、管理整个项目依赖版本等等,所以 src 目录不需要。
2.2 pom.xml
根工程中使用了 <dependencyManagement> 和 <dependencies> 进行依赖管理。
<dependencyManagement> :声明全局依赖,当子项目指定引用才会继承依赖; <dependencies> :声明全局依赖,子项目直接自动继承依赖。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
<?xml version= "1.0" encoding= "UTF-8" ?> <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://HdhCmsTestw3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion> 4.0 . 0 </modelVersion>
<!-- 父级引用 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version> 2.1 . 1 .RELEASE</version> <relativePath/> </parent>
<!-- 基本信息 --> <groupId>cn.van.order</groupId> <artifactId>order</artifactId> <version> 1.0 . 0 -SNAPSHOT</version> <name>${project.artifactId}</name> <description>Apache Dubbo 根项目</description>
<!--配置--> <properties> <java.version> 1.8 </java.version> <dubbo.version> 2.7 . 5 </dubbo.version> <zookeeper.version> 3.4 . 14 </zookeeper.version> </properties>
<!-- 子项目 --> <modules> <module>order-api</module> <module>order-provider</module> <module>order-consumer</module> </modules>
<!--声明全局依赖(子项目需要显示的引用才会继承依赖)--> <dependencyManagement> <dependencies> <!-- dubbo-start依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo.version}</version> </dependency> <!--zookeeper 注册中心客户端引入 使用的是curator客户端 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>${dubbo.version}</version> <type>pom</type> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement>
<!--声明全局依赖(子项目不需要显示的引用,自动继承依赖)--> <dependencies> <!-- spring boot 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
<!-- 打包插件 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
三、order-api
3.1 项目依赖
无需更多依赖,所以很简单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?xml version= "1.0" encoding= "UTF-8" ?> <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://HdhCmsTestw3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion> 4.0 . 0 </modelVersion>
<parent> <groupId>cn.van.order</groupId> <artifactId>order</artifactId> <version> 1.0 . 0 -SNAPSHOT</version> </parent>
<groupId>cn.van.order</groupId> <artifactId>order-api</artifactId> <version> 1.0 . 0 -SNAPSHOT</version> <name>${project.artifactId}</name> <description>dubbo公共项目</description>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project> |
3.2 封装 RPC 结果集先封装一个返回码枚举类 ResultCodeEnum.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public enum ResultCodeEnum { /*** 通用部分 100 - 599***/ // 成功请求 SUCCESS( 200 , "successful" ),
/*** 这里可以根据不同模块用不同的区级分开错误码,例如: ***/
// 1000~1999 区间表示用户模块错误 // 2000~2999 区间表示订单模块错误 // 3000~3999 区间表示商品模块错误 // 。。。
ORDER_NOT_FOUND( 2000 , "order not found" ), ; /** * 响应状态码 */ private Integer code; /** * 响应信息 */ private String message;
ResultCodeEnum(Integer code, String msg) { this .code = code; this .message = msg; }
public Integer getCode() { return code; }
public String getMessage() { return message; }
public void setMessage(String message) { this .message = message; } } |
先封装一个RPC 响应结果集 RpcResult.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
public class RpcResult <T> implements Serializable {
/** * 是否响应成功 */ private Boolean success; /** * 响应状态码 */ private Integer code; /** * 响应数据 */ private T data; /** * 错误信息 */ private String message;
// 构造器开始 /** * 无参构造器(构造器私有,外部不可以直接创建) */ private RpcResult() { this .code = 200 ; this .success = true ; } /** * 有参构造器 * @param obj */ private RpcResult(T obj) { this .code = 200 ; this .data = obj; this .success = true ; }
/** * 有参构造器 * @param resultCode */ private RpcResult(ResultCodeEnum resultCode) { this .success = false ; this .code = resultCode.getCode(); this .message = resultCode.getMessage(); } // 构造器结束
/** * 通用返回成功(没有返回结果) * @param <T> * @return */ public static <T> RpcResult<T> success(){ return new RpcResult(); }
/** * 返回成功(有返回结果) * @param data * @param <T> * @return */ public static <T> RpcResult<T> success(T data){ return new RpcResult<T>(data); }
/** * 通用返回失败 * @param resultCode * @param <T> * @return */ public static <T> RpcResult<T> failure(ResultCodeEnum resultCode){ return new RpcResult<T>(resultCode); }
public Boolean getSuccess() { return success; }
public void setSuccess(Boolean success) { this .success = success; }
public Integer getCode() { return code; }
public void setCode(Integer code) { this .code = code; }
public T getData() { return data; }
public void setData(T data) { this .data = data; }
public String getMessage() { return message; }
public void setMessage(String message) { this .message = message; }
@Override public String toString() { return "RpcResult{" + "success=" + success + ", code=" + code + ", data=" + data + ", message='" + message + '\ '' + '}' ; } } |
3.3 编写一个 RPC 接口
1 2 3 |
public interface OrderDubboService { RpcResult<OrderDomain> getOrder(); } |
实体 OrderDomain.java 挺简单的,详见 Github 仓库。
四、order-provider
此子项目是一个服务类项目,也就是将接口服务注册到 zookeeper 注册中心供消费端调取使用。
4.1 项目依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<?xml version= "1.0" encoding= "UTF-8" ?> <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://HdhCmsTestw3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion> 4.0 . 0 </modelVersion> <parent> <groupId>cn.van.order</groupId> <artifactId>order</artifactId> <version> 1.0 . 0 -SNAPSHOT</version> </parent>
<groupId>cn.van.order</groupId> <artifactId>order-provider</artifactId> <version> 1.0 -SNAPSHOT</version> <name>${project.artifactId}</name> <description>Dubbo 服务提供者</description>
<dependencies> <dependency> <groupId>cn.van.order</groupId> <artifactId>order-api</artifactId> <version> 1.0 . 0 -SNAPSHOT</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> </dependency> <!-- zookeeper依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>${dubbo.version}</version> <type>pom</type> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
4.2 服务实现接口
1 2 3 4 5 6 7 8 |
@Service public class OrderDubboServiceImpl implements OrderDubboService {
@Override public RpcResult<OrderDomain> getOrder() { return RpcResult.success( new OrderDomain( 1 , 10086 , LocalDateTime.now())); } } |
注意:
@Service 是 dubbo 包下面的注解不是 Spring 里面的注解。
4.3 项目配置
dubbo 的配置直接用 dubbo ,不再以 Spring 开头; base-packages :指定接口实现所在路径。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
server: # 服务端口 port: 7777 spring: application: name: order-provider # dubbo 相关配置(dubbo 的配置不再以 Spring 开头) dubbo: application: # 应用名称 name: order-provider scan: # 接口实现者(服务实现)包 base-packages: cn.van.order.service.impl # 注册中心信息 registry: address: zookeeper: //127.0.0.1:2181 protocol: # 协议名称 name: dubbo # 协议端口 port: 20880 |
五、order-consumer
此子项目就是一个消费项目,比如商品模块、财务模块等等。
5.1 项目依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
<?xml version= "1.0" encoding= "UTF-8" ?> <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://HdhCmsTestw3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion> 4.0 . 0 </modelVersion>
<parent> <groupId>cn.van.order</groupId> <artifactId>order</artifactId> <version> 1.0 . 0 -SNAPSHOT</version> </parent>
<groupId>cn.van.order</groupId> <artifactId>order-consumer</artifactId> <version> 1.0 -SNAPSHOT</version> <name>${project.artifactId}</name> <description>Dubbo 消费者</description>
<dependencies> <dependency> <groupId>cn.van.order</groupId> <artifactId>order-api</artifactId> <version> 1.0 . 0 -SNAPSHOT</version> </dependency>
<!-- web项目依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<!-- dubbo依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> </dependency>
<!-- dubbo的zookeeper依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper</artifactId> <version>${dubbo.version}</version> <type>pom</type> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
5.2 测试接口
模拟一个接口获取订单详情。
1 2 3 4 5 6 7 8 9 10 11 |
@RestController @RequestMapping ( "/order" ) public class OrderConsumerController { @Reference OrderDubboService orderDubboService;
@GetMapping ( "getOrder" ) public RpcResult getOrder() { return orderDubboService.getOrder(); } } |
注意: @Reference 引入的是 Dubbo 接口,所以是 Dubbo 的注解。
5.3 配置文件
1 2 3 4 5 6 7 8 9 10 11 |
server: port: 7000 spring: application: name: order-consumer # dubbo 相关配置 dubbo: application: name: order-consumer registry: address: zookeeper: //127.0.0.1:2181 |
六、测试
一切就绪,如果在 order-consumer 的测试接口能成功请求到数据,则证明 Dubbo 服务搭建成功。
6.1 启动 zookeeper
我们选用 zookeeper 作为注册中心,因此启动项目之前需要先启动它。
6.2 dubbo-admin
dubbo-admin 便于观察 order-provider 是否成功将接口注册,具体安装步骤详见 apache/dubbo-admin
默认端口: 8080 。
6.3 启动 dubbo-provider
成功启动后可以在 dubbo-admin :已经成功将接口 OrderService 注册到 zookeeper 上如下:
成功将借口注册到注册中心,说明 dubbo-provider 注册成功。
6.4 启动 order-cosumer
启动消费者项目,在浏览器请求消费接口:http://localhost:7000/order/getOrder,成功返回数据如下:
1 2 3 4 5 6 7 8 9 10 |
{ "success" : true , "code" : 200 , "data" :{ "id" : 1 , "orderNum" : 10086 , "gmtCreate" : "2020-05-06T11:59:45.535" }, "message" : null } |
成功请求到 order-provider 提供的数据,说明 Dubbo 搭建成功!
七、总结
以上的完整代码我已上传到 Github ,需要的可以自取测试,欢迎 star !
原文链接:https://HdhCmsTestcnblogs测试数据/vandusty/p/12853973.html
查看更多关于Spring Boot 整合 Apache Dubbo的示例代码的详细内容...