Spring Boot 整合 Apache Dubbo

2021-01-26 07:14

阅读:789

标签:注意   默认端口   log4   boolean   build   面向   ast   tps   modules   

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

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

Spring Boot 系列:整合 Alibaba Dubbo

一、本文示例说明

1.1 框架版本

  • Dubbo 版本
org.apache.dubbo
    dubbo-spring-boot-starter
    2.7.5
  • Spring Boot 版本
org.springframework.boot
    spring-boot-starter-parent
    2.1.1.RELEASE

1.2 模块关系

  • 根工程 order:管理工程信息;
  • 子工程 order-api:定义RPC服务的接口、参数以及响应结果的结果集;
  • 子工程 order-providerRPC服务的提供端;
  • 子工程 order-consumerRPC服务的消费端,实际开发过程中实际情况是其它服务的调用该订单RPC服务

二、根工程

2.1 创建项目 order

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

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

2.2 pom.xml

根工程中使用了进行依赖管理。

  1. :声明全局依赖,当子项目指定引用才会继承依赖;
  2. :声明全局依赖,子项目直接自动继承依赖。
4.0.0org.springframework.boot
        spring-boot-starter-parent
        2.1.1.RELEASEcn.van.order
    order
    1.0.0-SNAPSHOT${project.artifactId}Apache Dubbo 根项目1.82.7.53.4.14order-apiorder-providerorder-consumerorg.apache.dubbo
                dubbo-spring-boot-starter
                ${dubbo.version}org.apache.dubbo
                dubbo-dependencies-zookeeper
                ${dubbo.version}pom
                        slf4j-log4j12
                        org.slf4jorg.springframework.boot
            spring-boot-starter
        org.springframework.boot
            spring-boot-starter-test
            testorg.junit.vintage
                    junit-vintage-engine
                org.springframework.boot
                spring-boot-maven-plugin
            

三、order-api

3.1 项目依赖

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

4.0.0cn.van.order
        order
        1.0.0-SNAPSHOTcn.van.order
    order-api
    1.0.0-SNAPSHOT${project.artifactId}dubbo公共项目org.springframework.boot
                spring-boot-maven-plugin
            

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  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 RpcResult success(){
        return new RpcResult();
    }

    /**
     * 返回成功(有返回结果)
     * @param data
     * @param 
     * @return
     */
    public static RpcResult success(T data){
        return new RpcResult(data);
    }

    /**
     * 通用返回失败
     * @param resultCode
     * @param 
     * @return
     */
    public static RpcResult failure(ResultCodeEnum resultCode){
        return  new RpcResult(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 getOrder();
}

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

四、order-provider

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

4.1 项目依赖

4.0.0cn.van.order
        order
        1.0.0-SNAPSHOTcn.van.order
    order-provider
    1.0-SNAPSHOT${project.artifactId}Dubbo 服务提供者cn.van.order
            order-api
            1.0.0-SNAPSHOTorg.apache.dubbo
            dubbo-spring-boot-starter
        org.apache.dubbo
            dubbo-dependencies-zookeeper
            ${dubbo.version}pom
                    slf4j-log4j12
                    org.slf4jorg.springframework.boot
                spring-boot-maven-plugin
            

4.2 服务实现接口

@Service
public class OrderDubboServiceImpl implements OrderDubboService {
    
    @Override
    public RpcResult 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 项目依赖

4.0.0cn.van.order
        order
        1.0.0-SNAPSHOTcn.van.order
    order-consumer
    1.0-SNAPSHOT${project.artifactId}Dubbo 消费者cn.van.order
            order-api
            1.0.0-SNAPSHOTorg.springframework.boot
            spring-boot-starter-web
        org.apache.dubbo
            dubbo-spring-boot-starter
        org.apache.dubbo
            dubbo-dependencies-zookeeper
            ${dubbo.version}pom
                    slf4j-log4j12
                    org.slf4jorg.springframework.boot
                spring-boot-maven-plugin
            

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

标签:注意   默认端口   log4   boolean   build   面向   ast   tps   modules   

原文地址:https://www.cnblogs.com/vandusty/p/12853973.html


评论


亲,登录后才可以留言!