0%

Dubbo与SpringBoot的结合

前言

这段时间在接触分布式的内容,由于本身比较熟悉rpc的原理,所以我顺其自然地选择了 dubbo 作为我学习的框架。
看了任务清单,这篇文章应该是在6天前出来的,但是因为实习等等的一些事情耽误了,今天立下决心动笔了。

准备

必需
JAVA 环境
注册中心(我选用的是 nacos )

非必需
maven / gradle(本文使用gradle构建)
docker
idea(这个应该是必需吧?当然也可以用记事本(滑稽.jpg))

正文

  1. 新建普通的 gradle 项目(不勾选任何选项)

  2. 新建三个module,分别命名为 Common,DubboProducer,DubboConsumer

  • 模块作用
1
2
3
Common -- 普通 gradle 项目,用于定义 proucer 以及 consumer 交互的接口以及规范
DubboProducer -- Spring Boot 本地项目,用于为 Common 中定义的服务接口创建实体类
DubboConsumer -- Spring Boot web 项目,接收用户请求,调用 producer 处理请求并返回结果
  • 模块 gradle 定义

    • 根项目 setting.gradle 新增
    1
    2
    3
    include 'Common'
    include 'DubboConsumer'
    include 'DubboProducer'
    • consumer 新增

      • build.gradle 新增
      1
      2
      3
      4
      5
      6
      // https://mvnrepository.com/artifact/org.apache.dubbo/dubbo
      compile group: 'org.apache.dubbo', name: 'dubbo', version: '2.7.8'
      // https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-nacos
      compile group: 'org.apache.dubbo', name: 'dubbo-registry-nacos', version: '2.7.8'
      // https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client
      compile group: 'com.alibaba.nacos', name: 'nacos-client', version: '1.3.3'
      • setting.gradle 新增
      1
      includeFlat 'Common'
    • producer 新增

      • build.gradle 新增
      1
      2
      3
      4
      5
      6
      // https://mvnrepository.com/artifact/org.apache.dubbo/dubbo
      compile group: 'org.apache.dubbo', name: 'dubbo', version: '2.7.8'
      // https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-nacos
      compile group: 'org.apache.dubbo', name: 'dubbo-registry-nacos', version: '2.7.8'
      // https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client
      compile group: 'com.alibaba.nacos', name: 'nacos-client', version: '1.3.3'
      • setting.gradle 新增
      1
      includeFlat 'Common'
  • 模块配置文件

    • consumer 配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    spring:
    application:
    name: dubbo-consumer
    cloud:
    nacos:
    discovery:
    server-addr: cartoon-ali.com
    dubbo:
    protocol:
    port: -1
    name: dubbo
    registry:
    address: nacos://cartoon-ali.com:8848
    cloud:
    subscribed-services: dubbo-spring-cloud-provider
    application:
    name: consumer
    • producer 配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    dubbo:
    registry:
    address: nacos://cartoon-ali.com:8848
    application:
    name: dubbo-producer
    protocol:
    port: -1
    name: dubbo
  • 启动类需同时使用 @EnableDubbo 修饰

    • producer
    1
    2
    3
    4
    5
    6
    7
    @SpringBootApplication
    @EnableDubbo
    public class DubboProducerApplication {
    public static void main(String[] args) {
    SpringApplication.run(DubboProducerApplication.class, args);
    }
    }
    • consumer
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @SpringBootApplication
    @EnableDubbo
    public class DubboConsumerApplication {

    public static void main(String[] args) {
    SpringApplication.run(DubboConsumerApplication.class, args);
    }

    }
  1. 示例搭建(Hello World)
  • 接口 DubboService构建
1
2
3
4
public interface DubboService {

String say();
}
  • 服务提供类实现
1
2
3
4
5
6
7
8
9
10
@org.apache.dubbo.config.annotation.DubboService
@Service
public class DubboServiceImpl implements DubboService {

@Override
public String say() {
return "dubbo producer";
}

}

注意:@Service 注解是 Srping 的注解,@org.apache.dubbo.config.annotation.Service 已在版本 2.7.7 被 @org.apache.dubbo.config.annotation.DubboService取代

  • 消费者实现
1
2
3
4
5
6
7
8
9
10
11
@RestController
public class TestController {

@DubboReference
private DubboService dubboService;

@RequestMapping("/test")
public String test(){
return dubboService.say();
}
}

dubbo 的服务消费应该在消费者中的 Service 层做整合消费后返回处理结果,这里仅为演示。

  1. 运行

先运行 provider 再运行 consumer,否则 dubbo 会因无法找到服务提供者自行关闭消费者。

  • nacos 的结果

  • 模拟调用

后记

虽然在网上已经有很多这方面的教程,但是大多是用 zookeeper 作为注册中心。
而个人喜欢接触新技术,nacos 在今年1月才由阿里开源出来。而且我比较喜欢 nacos 的界面风格,虽然 nacos 在功能上不如 zookeeper+dubboAdmin 强大,但是作为入门应该是足够的。

源码地址

本文所涉及代码都已上传到**github**

修改历史

  1. 2019 年 11 月 09 日
    1. 文章初始版本编写
  2. 2020 年 10 月 11 日
    1. 删减错误的描述
      1. 服务的消费方与生产方启动类都应添加 @EnableDubbo 注解,修改前为生产方启动类应添加 @EnableDubbo 注解
    2. 优化部分描述
      1. 第四点运行中的模拟调用不再使用 RestServices 进行调用,使用更为普遍的 postman 调用
    3. 优化 demo 的代码结构
      1. 使用 gradle 构建,修改前为 maven
      2. 使用多组件方式进行项目的构建,使 demo 不再局限于 demo,可成为更加常用的工具

本文首发于cartoon的博客

转载请注明出处:https://cartoonyu.github.io/cartoon-blog/post/dubbo/dubbo与springboot的结合/