Apache Dubbo
是一款高性能、轻量级的开源 Java
RPC
框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
注意,是
Apache Dubbo
,不再是Alibaba Dubbo
。简单来说就是Alibaba
将Dubbo
移交给Apache
开源社区进行维护。参见 dubbo-spring-boot-project
Spring Boot 系列:整合 Alibaba Dubbo
Dubbo
版本<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>2.7.5version>
dependency>
Spring Boot
版本<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.1.RELEASEversion>
<relativePath/>
parent>
order
:管理工程信息;order-api
:定义RPC
服务的接口、参数以及响应结果的结果集;order-provider
:RPC
服务的提供端;order-consumer
:RPC
服务的消费端,实际开发过程中实际情况是其它服务的调用该订单RPC
服务order
我这里为了和之前老版本的
alibaba
的dubbo
项目区分,文件名取为apache-dubbo-demo
,maven
项目名称为order
。
该项目主要作用是定义工程信息、管理整个项目依赖版本等等,所以src
目录不需要。
pom.xml
根工程中使用了
和
进行依赖管理。
:声明全局依赖,当子项目指定引用才会继承依赖;
:声明全局依赖,子项目直接自动继承依赖。
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.1.RELEASEversion>
<relativePath/>
parent>
<groupId>cn.van.ordergroupId>
<artifactId>orderartifactId>
<version>1.0.0-SNAPSHOTversion>
<name>${project.artifactId}name>
<description>Apache Dubbo 根项目description>
<properties>
<java.version>1.8java.version>
<dubbo.version>2.7.5dubbo.version>
<zookeeper.version>3.4.14zookeeper.version>
properties>
<modules>
<module>order-apimodule>
<module>order-providermodule>
<module>order-consumermodule>
modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>${dubbo.version}version>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-dependencies-zookeeperartifactId>
<version>${dubbo.version}version>
<type>pomtype>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12artifactId>
<groupId>org.slf4jgroupId>
exclusion>
exclusions>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.junit.vintagegroupId>
<artifactId>junit-vintage-engineartifactId>
exclusion>
exclusions>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
order-api
无需更多依赖,所以很简单。
<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.0modelVersion>
<parent>
<groupId>cn.van.ordergroupId>
<artifactId>orderartifactId>
<version>1.0.0-SNAPSHOTversion>
parent>
<groupId>cn.van.ordergroupId>
<artifactId>order-apiartifactId>
<version>1.0.0-SNAPSHOTversion>
<name>${project.artifactId}name>
<description>dubbo公共项目description>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
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;
}
}
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
* @return
*/
public static<T> RpcResult<T> success(){
return new RpcResult();
}
/**
* 返回成功(有返回结果)
* @param data
* @param
* @return
*/
public static<T> RpcResult<T> success(T data){
return new RpcResult<T>(data);
}
/**
* 通用返回失败
* @param resultCode
* @param
* @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 + '\'' +
'}';
}
}
RPC
接口public interface OrderDubboService {
RpcResult<OrderDomain> getOrder();
}
实体
OrderDomain.java
挺简单的,详见Github
仓库。
order-provider
此子项目是一个服务类项目,也就是将接口服务注册到zookeeper
注册中心供消费端调取使用。
<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.0modelVersion>
<parent>
<groupId>cn.van.ordergroupId>
<artifactId>orderartifactId>
<version>1.0.0-SNAPSHOTversion>
parent>
<groupId>cn.van.ordergroupId>
<artifactId>order-providerartifactId>
<version>1.0-SNAPSHOTversion>
<name>${project.artifactId}name>
<description>Dubbo 服务提供者description>
<dependencies>
<dependency>
<groupId>cn.van.ordergroupId>
<artifactId>order-apiartifactId>
<version>1.0.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-dependencies-zookeeperartifactId>
<version>${dubbo.version}version>
<type>pomtype>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12artifactId>
<groupId>org.slf4jgroupId>
exclusion>
exclusions>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
@Service
public class OrderDubboServiceImpl implements OrderDubboService {
@Override
public RpcResult<OrderDomain> getOrder() {
return RpcResult.success(new OrderDomain(1, 10086, LocalDateTime.now()));
}
}
注意:
@Service
是 dubbo
包下面的注解不是 Spring
里面的注解。
dubbo
的配置直接用 dubbo
,不再以 Spring
开头;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
此子项目就是一个消费项目,比如商品模块、财务模块等等。
<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.0modelVersion>
<parent>
<groupId>cn.van.ordergroupId>
<artifactId>orderartifactId>
<version>1.0.0-SNAPSHOTversion>
parent>
<groupId>cn.van.ordergroupId>
<artifactId>order-consumerartifactId>
<version>1.0-SNAPSHOTversion>
<name>${project.artifactId}name>
<description>Dubbo 消费者description>
<dependencies>
<dependency>
<groupId>cn.van.ordergroupId>
<artifactId>order-apiartifactId>
<version>1.0.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-dependencies-zookeeperartifactId>
<version>${dubbo.version}version>
<type>pomtype>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12artifactId>
<groupId>org.slf4jgroupId>
exclusion>
exclusions>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
模拟一个接口获取订单详情。
@RestController
@RequestMapping("/order")
public class OrderConsumerController {
@Reference
OrderDubboService orderDubboService;
@GetMapping("getOrder")
public RpcResult getOrder() {
return orderDubboService.getOrder();
}
}
注意:@Reference
引入的是 Dubbo
接口,所以是 Dubbo
的注解。
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
服务搭建成功。
zookeeper
我们选用zookeeper
作为注册中心,因此启动项目之前需要先启动它。
dubbo-admin
dubbo-admin
便于观察 order-provider
是否成功将接口注册,具体安装步骤详见apache/dubbo-admin
默认端口:
8080
。
dubbo-provider
成功启动后可以在dubbo-admin
:已经成功将接口 OrderService
注册到 zookeeper
上如下:
成功将借口注册到注册中心,说明dubbo-provider
注册成功。
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
!
更多
Java
笔记,详见【Java 知识笔记本】,欢迎提供想法建议。
博主祖传秘籍 Spring Boot 葵花宝典 开源中,欢迎前来吐槽,提供线索,告诉博主接下来更新哪方面文章,共同进步!
最新文章,欢迎关注:公众号-风尘博客;交流观点,欢迎添加:个人微信