Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

注意,是 Apache Dubbo,不再是 Alibaba Dubbo。简单来说就是 AlibabaDubbo 移交给 Apache 开源社区进行维护。参见 dubbo-spring-boot-project

Spring Boot 系列:整合 Alibaba Dubbo

一、本文示例说明

1.1 框架版本

  • Dubbo 版本
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
  • Spring Boot 版本
<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-providerRPC服务的提供端;
  • 子工程 order-consumerRPC服务的消费端,实际开发过程中实际情况是其它服务的调用该订单RPC服务

二、根工程

2.1 创建项目 order

我这里为了和之前老版本的alibabadubbo项目区分,文件名取为apache-dubbo-demomaven 项目名称为order

该项目主要作用是定义工程信息、管理整个项目依赖版本等等,所以src目录不需要。

2.2 pom.xml

根工程中使用了<dependencyManagement><dependencies>进行依赖管理。

  1. <dependencyManagement>:声明全局依赖,当子项目指定引用才会继承依赖;
  2. <dependencies>:声明全局依赖,子项目直接自动继承依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.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 项目依赖

无需更多依赖,所以很简单。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.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
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
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 接口

public interface OrderDubboService {
RpcResult<OrderDomain> getOrder();
}

实体OrderDomain.java挺简单的,详见 Github 仓库。

四、order-provider

此子项目是一个服务类项目,也就是将接口服务注册到zookeeper注册中心供消费端调取使用。

4.1 项目依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.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 服务实现接口

@Service
public class OrderDubboServiceImpl implements OrderDubboService { @Override
public RpcResult<OrderDomain> getOrder() {
return RpcResult.success(new OrderDomain(1, 10086, LocalDateTime.now()));
}
}

注意:

@Servicedubbo 包下面的注解不是 Spring 里面的注解。

4.3 项目配置

  1. dubbo 的配置直接用 dubbo,不再以 Spring 开头;
  2. base-packages:指定接口实现所在路径。
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 项目依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.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 测试接口

模拟一个接口获取订单详情。

@RestController
@RequestMapping("/order")
public class OrderConsumerController {
@Reference
OrderDubboService orderDubboService; @GetMapping("getOrder")
public RpcResult getOrder() {
return orderDubboService.getOrder();
}
}

注意:@Reference引入的是 Dubbo 接口,所以是 Dubbo 的注解。

5.3 配置文件

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,成功返回数据如下:

{
"success":true,
"code":200,
"data":{
"id":1,
"orderNum":10086,
"gmtCreate":"2020-05-06T11:59:45.535"
},
"message":null
}

成功请求到 order-provider 提供的数据,说明 Dubbo 搭建成功!

七、总结

以上的完整代码我已上传到 Github,需要的可以自取测试,欢迎star

文化交流

  1. 风尘博客
  2. 风尘博客-掘金
  3. 风尘博客-博客园
  4. 风尘博客-CSDN
  5. Github

Spring Boot 整合 Apache Dubbo的更多相关文章

  1. Spring Boot 整合 Apache Ignite

    关于Ignite的介绍,这边推荐三个链接进行学习了解. https://ignite.apache.org/,首选还是官网,不过是英文版,如果阅读比较吃力可以选择下方两个链接. https://www ...

  2. Spring Boot 整合 Dubbo和Zookeeper

    Spring Boot 整合 Dubbo和Zookeeper Spring Boot 整合 Dubbo和Zookeeper 环境介绍 Zookeeper 安装 启动 Dubbo admin 搭建 创建 ...

  3. Spring Boot整合Dubbo使用及开发笔记

    一.概述: Spring Dubbo是我开发的一个基于spring-boot和dubbo,目的是使用Spring boot的风格来使用dubbo.(即可以了解Spring boot的启动过程又可以学习 ...

  4. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...

  5. Spring Boot整合Dubbo2.x,解决其中遇到的坑

    Dubbo了解 a high-performance, java based open source RPC framework. Dubbo官网 源码 文档 快速知道用法 本地服务 Spring 配 ...

  6. spring boot整合jsp的那些坑(spring boot 学习笔记之三)

    Spring Boot 整合 Jsp 步骤: 1.新建一个spring boot项目 2.修改pom文件 <dependency>            <groupId>or ...

  7. Spring Kafka和Spring Boot整合实现消息发送与消费简单案例

    本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 先前我已经分享了Kafka的基本介绍与集群环境搭建方法.关于Kafka的 ...

  8. spring boot整合Hadoop

    最近需要用spring boot + mybatis整合hadoop,其中也有碰到一些坑,记录下来方便后面的人少走些弯路. 背景呢是因为需要在 web 中上传文件到 hdfs ,所以需要在spring ...

  9. (转)Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理

    http://www.ityouknow.com/springboot/2017/06/26/spring-boot-shiro.html 这篇文章我们来学习如何使用 Spring Boot 集成 A ...

随机推荐

  1. Java团队课程设计——基于学院的搜索引擎

    团队名称.团队成员介绍.任务分配,团队成员课程设计博客链接 姓名 成员介绍 任务分配 课程设计博客地址 谢晓淞(组长) 团队输出主力 爬虫功能实现,Web前端设计及其后端衔接 爬虫:https://w ...

  2. 新版本Xcode 6的视图调试详解

    开发者会经常遇到视图或者Auto Layout约束中存在bug的情况,并且这种bug很难通过代码发现,所以开发者很有必要熟知如何进行简单高效的视图调试,而Xcode 6的发布使得视图调试变得前所未有的 ...

  3. 手把手教Extjs-简单GridField示例讲解二

    使用的Extjs版本为4.2,示例是官方的版本,对里面的语法进行一句一句的学习研究.可以方便他人,又可以提升自己的理解.里面存在的问题,后期会一步一步改进.也欢迎各位指出. /* Extjs具有很庞大 ...

  4. Mysql数据操作指令

    -----多数据插入-----只要写一次insert指令,但是可以直接插入多条记录insert into table values(),(),(); 主键冲突我们插入值的时候,主键中已经存在某个值,插 ...

  5. liunx常用知识基本命令大全

    liunx基础命令使用 标签(空格分隔):liunx常用命令 网络配置 虚拟网卡的绝对路径 /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ...

  6. Mac home 目录下创建文件夹

    example:sudo vim /etc/auto_master before: # Automounter master map +auto_master # Use directory serv ...

  7. Samba远程Shell命令注入执行漏洞

    CVE:CVE-2007-2447 原理: Samba中负责在SAM数据库更新用户口令的代码未经过滤便将用户输入传输给了/bin/sh.如果在调用smb.conf中定义的外部脚本时,通过对/bin/s ...

  8. opencv-8-图像核与蒙板操作

    opencv-8-图像核与蒙板操作 opencvc++qt 开始之前 在准备开始的时候, 我大概列了一个opencv 章节列表, 按照章节进行写, 写到某些部分的时候再具体调整章节内容, 完成了之后, ...

  9. Linux系统管理第三次作业 账号管理 权限及归属管理

    1.创建/guanli 目录,在/guanli下创建zonghe 和 jishu 两个目录(一条命令) [root@localhost ~]# mkdir /guanli [root@localhos ...

  10. Android Studio常用配置

    目录 1. 主题颜色设置 2. Logcat颜色设置 3. 类注释 4. 编译器添加背景图 4.1 第一种方式 Background Image 4.2 第二种方式 Sexy Editor 5. 修改 ...