转载

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 的结果

Dubbo与SpringBoot的结合

  • 插件 RestServices 的模拟调用

Dubbo与SpringBoot的结合

后记

虽然在网上已经有很多这方面的教程,但是大多是用 zookeeper 作为注册中心。

而个人喜欢接触新技术,nacos 在今年1月才由阿里开源出来。而且我比较喜欢 nacos 的界面风格,虽然 nacos 在功能上不如 zookeeper+dubboAdmin 强大,但是作为入门应该是足够的。

在我的任务清单上,还规划着 dubbo 的 spi 机制的全注解辅以配置文件使用文章,但是因为时间以及我对机制还没深入理解,所以我将这篇文章押后了,等深入源码之后再根据源码写出我想要的文章。

本文首发于 cartoon的博客

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

原文  https://segmentfault.com/a/1190000020954796
正文到此结束
Loading...