后端与中间件 · 教程

Dubbo 与 Springboot 集成

本文写于 2021 年,涉及的组件版本、配置与数据可能已过时,请按经验材料阅读并核对当前版本。原文链接与内容保持不变。

本文使用技术介绍 Dubbo 3.0.3 Springboot 2.5.5 文中代码已删减,具体代码位置见文末。

本文目标

快速构建 Springboot 应用,并继承Dubbo。

提供一个服务者,一个消费者。 在浏览器中请求消费者服务, 消费者服务调用 服务提供者,返回 响应。

创建项目

创建服务提供者

在chapter02-provider 这个 module 下,编写了两个 sub module. chapter02-provider-api 表示对外提供的RPC接口。 chapter02-provider-impl 表示 RPC接口的实现。

目录结构如下:

chapter02-provider-api

引入pom文件

本模块下无需改动,使用IDEA生成的即可。具体代码见文末

定义RPC接口
/**
 * 服务者提供的接口规范
 *
 * @author fangjiaxiaobai
 * @date 2021-10-13 20:44
 */
public interface IProviderService {
    /**
     * 演示调用demo
     *
     * @param name 入参,随即返回
     * @return "hello, {name} . I am dubbo."
     */
    String sayHello(String name);
}

这样 provider-api 服务就配置完成了。

chapter02-provider-impl

引入 pom文件
<!-- 服务提供者的RPC接口 -->
<dependency>
    <groupId>com.fxb</groupId>
    <artifactId>chapter02-provider-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <scope>compile</scope>
</dependency>
<!-- 引入Dubbo -->
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>3.0.3</version>
    <scope>compile</scope>
</dependency>

配置application.yml

dubbo:
  application:
    #application-name
    name: springboot-multicast-provider
    id: springboot-multicast-provider
  registry:
    # 以广播的协议进行发布.
    address: multicast://224.5.6.7:1234
    id: registry
  protocol:
    name: dubbo
    port: 20880
server:
  port: 8080

实现服务提供者的业务逻辑

即 实现RPC接口。

/**
 * sayHello 的具体实现
 *
 * @author fangjiaxiaobai
 * @date 2021-10-13 20:47
 */
@DubboService
public class ProviderServiceImpl implements IProviderService {
    @Override public String sayHello(String name) {
        return String.format("hello, %s.  I am dubbo.", name);
    }
}

添加Dubbo注解

@SpringBootApplication
// 集成Dubbo
@EnableDubbo
public class Chapter02ProviderImplApplication {
    public static void main(String[] args) {
        SpringApplication.run(Chapter02ProviderImplApplication.class, args);
    }
}

我们启动服务.可以看到:

这样服务提供者就启动成功了。

创建服务消费者

消费者的目录结构如下:

引入maven依赖

<!-- 支持dubbo -->
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

<!-- 服务提供者的RPC接口 -->
<dependency>
    <groupId>com.fxb</groupId>
    <artifactId>chapter02-provider-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

配置application.yml

dubbo:
  application:
    #application-name
    name: chapter02-with-springboot-consumer
    id: chapter02-with-springboot-consumer
  registry:
    address: multicast://224.5.6.7:1234
    id: registry
  protocol:
    name: dubbo
    port: 20880
server:
  port: 8081

编写Controller

/**
 * 消费者demo,
 *
 * @author fangjiaxiaobai
 * @date 2021-10-13 21:00
 */
@RestController
public class ConsumerController {
    @Resource
    private ConsumerService consumerService;

    @GetMapping("chapter02/sayHello/{name}")
    public String sayHello(@PathVariable String name) {
        return consumerService.sayHello(name);
    }
}

编写Service层,调用提供提供者

/**
 * 消费业务逻辑实现
 *
 * @author fangjiaxiaobai
 * @date 2021-10-13 21:02
 */
@Service
public class ConsumerService {

    // 引用Dubbo服务。使用@DubboReference注解
    @DubboReference
    private IProviderService providerService;

    public String sayHello(String name) {
        return providerService.sayHello(name);
    }

}

编写启动类

@SpringBootApplication
@EnableDubbo
public class Chapter02ConsumerApplication {

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

}

启动后,可以看到控制台:

表示启动成功

测试

我们可以在浏览器中调用消费者的sayHello接口 http://localhost:8081/chapter02/sayHello/fangjiaxiaobai 就会看到 hello, fangjiaxiaobai. I am dubbo.

这样一个最最精简的Dubbo集成Springboot的服务就部署完成了。

链接

相关链接

最后

期望和你一起遇见更好的自己

配套资料 · 免费领取
本文属于「BACKEND」资料包范围:中间件源码阅读路线图。按 RocketMQ / Redis / MySQL 分章节的完整路线。
在公众号「方家小白」回复关键词 BACKEND 即可领取。全文无需关注即可阅读。
BACKEND