乐趣区

Dubbo与SpringBoot的结合

前言

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

准备

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

非必需
Maven
docker
idea(这个应该是必需的?当然也可以用记事本(滑稽.jpg))

正文

  1. 新建普通的 maven 项目(不勾选任何选项),手动写入 pom 文件,配置项如下
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
    <scope>provided</scope>
</dependency>

其实也可以不要 lombok,此处只是方便调试。

  1. 新建三个 module,分别命名为 api,provider,consumer
  • 模块作用
api -- 普通 maven 项目,用于定义 provider 以及 consumer 交互的接口以及规范
provider -- Spring Boot 本地项目,用于为 api 中定义的服务接口创建实体类
consumer -- Spring Boot web 项目,接收用户请求,调用 provider 处理请求并返回结果
  • 模块 pom 定义

    • 根项目新增
    <modules>
        <module>api</module>
        <module>provider</module>
        <module>consumer</module>
    </modules>
* api 新增

```
<version>0.0.1-SNAPSHOT</version>
```



* consumer 新增

```
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
     </dependency>
     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
     </dependency>
     <dependency>
         <groupId>com</groupId>
         <artifactId>api</artifactId>
         <version>${project.version}</version>
     </dependency>
     <dependency>
         <groupId>org.apache.dubbo</groupId>
         <artifactId>dubbo-spring-boot-starter</artifactId>
         <version>2.7.3</version>
     </dependency>
     <dependency>
         <groupId>org.apache.dubbo</groupId>
         <artifactId>dubbo</artifactId>
         <version>2.7.3</version>
     </dependency>
     <dependency>
         <groupId>org.apache.dubbo</groupId>
         <artifactId>dubbo-registry-nacos</artifactId>
         <version>2.7.3</version>
     </dependency>
     <dependency>
         <groupId>com.alibaba.nacos</groupId>
         <artifactId>nacos-client</artifactId>
         <version>1.0.0</version>
     </dependency>
</dependencies>
```

* provider 新增

```
<dependencies>
    <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>
    </dependency>
    <dependency>
        <groupId>com</groupId>
        <artifactId>api</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.7.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-registry-nacos</artifactId>
        <version>2.7.3</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-client</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>
```


  • 模块配置文件

    • provider 配置文件
    dubbo:
      registry:
        address: nacos://192.168.99.100:8848
      application:
        name: dubbo-provider
* consumer 配置文件

```
spring:
  application:
    name: dubbo-consumer
  cloud:
    nacos:
    discovery:
      server-addr: 192.168.99.100
server:
  port: 8081
  servlet:
    context-path: /text
dubbo:
  protocol:
    port: -1
    name: dubbo
  registry:
    address: nacos://192.168.99.100:8848
  cloud:
    subscribed-services: dubbo-spring-cloud-provider
  application:
    name: consumer
```


  1. 示例搭建(Hello World)
  • 接口 HelloService 构建
package com.api;

public interface HelloService {String say(String name);
}
  • 服务提供类实现
package com.producer;

import com.api.HelloService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

@Service
@Component
public class HelloServiceImp implements HelloService {

    @Override
    public String say(String name) {return "hello,"+name;}
}

注意:@Service 注解是 dubbo 的注解,不是 Spring 的注解

  • 消费者实现
package com.consumer;

import com.api.HelloService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

@RestController
public class TextController {
    
    @Reference
    private HelloService helloService;

    @GetMapping("/text")
    public String text(){return helloService.say("cartoon");
    }
    
}

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

  1. 运行

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

  • nacos 的结果

  • 插件 RestServices 的模拟调用

后记

虽然在网上已经有很多这方面的教程,但是大多是用 zookeeper 作为注册中心。
而个人喜欢接触新技术,nacos 在今年 1 月才由阿里开源出来。而且我比较喜欢 nacos 的界面风格,虽然 nacos 在功能上不如 zookeeper+dubboAdmin 强大,但是作为入门应该是足够的。
在我的任务清单上,还规划着 dubbo 的 spi 机制的全注解辅以配置文件使用文章,但是因为时间以及我对机制还没深入理解,所以我将这篇文章押后了,等深入源码之后再根据源码写出我想要的文章。

本文首发于 cartoon 的博客
转载请注明出处:https://cartoonyu.github.io/cartoon-blog/post/dubbo/dubbo 与 springboot 的结合 /

退出移动版