后端与中间件 · 教程

搭建第一个纯dubbo微服务应用

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

本文旨在快速搭建一个 纯dubbo微服务 应用。

创建一个项目

  • consumer 表示一个消费者。
  • provider 标识一个服务提供者。
  • provider-api 表示对外提供服务的api.

我们现实的开发中,往往是一个服务既充当服务提供者角色,又充当服务消费者的角色。所以,每个服务都会有一个两个模块,1.provider,服务的实现逻辑模块, 2.provider-api:服务对外暴露的api模块。

引入依赖

在 父级pom中加入如下依赖:

<properties>
    <dubbo.version>3.0.3</dubbo.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>${dubbo.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper</artifactId>
        <version>${dubbo.version}</version>
        <type>pom</type>
    </dependency>
</dependencies>

可以看到,我们使用的dubbo3.x版本。在这个版本中,开发者将dubbo的依赖进行拆分,所以,我们引入了 dubbo 和 dubbo-dependencies-zookper 这两个依赖。

创建服务提供者

设置api依赖

在服务提供者的具体实现模块中(provider/pom.xml),加入api模块依赖

 <dependency>
    <groupId>com.fxb</groupId>
    <artifactId>provider-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

定义 服务间的交互协议(契约/规范)

其实就是定义服务间的RPC接口。

/**
 * 定义rpc的交互规范
 *
 * @author fangjiaxiaobai
 * @date 2021-10-13 16:16
 */
public interface IProviderService {
    /**
     * say hello
     *
     * @return "hello dubbo"
     */
    String sayHello();
}

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

/**
 * 实现服务的具体逻辑
 *
 * @author fangjiaxiaobai
 * @date 2021-10-13 16:00
 */
public class ProviderServiceImpl implements IProviderService {
    @Override
    public String sayHello() {
        return "hello, dubbo!";
    }
}

对外提供服务

/**
 * 服务启动
 *
 * @author fangjiaxiaobai
 * @date 2021-10-13 16:01
 */
public class ProviderApplication {

    private static final String zookeeperHost = "127.0.0.1";

    public static void main(String[] args) throws InterruptedException {
        ServiceConfig<IProviderService> service = new ServiceConfig<>();
        service.setApplication(new ApplicationConfig("first-dubbo-provider"));
        service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
        service.setInterface(IProviderService.class);
        service.setRef(new ProviderServiceImpl());
        service.export();

        System.out.println("dubbo service started");
        new CountDownLatch(1).await();
    }
}

创建服务消费者

引入api依赖

在服务消费者的pom文件中(comsumer/pom.xml),添加如下maven依赖

<dependency>
    <groupId>com.fxb</groupId>
    <artifactId>provider-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

消费逻辑


/**
 * 服务消费者
 *
 * @author fangjiaxiaobai
 * @date 2021-10-13 16:20
 */
public class ConsumerApplication {

    private static final String zookeeperHost = "127.0.0.1";

    public static void main(String[] args) {
        ReferenceConfig<IProviderService> reference = new ReferenceConfig<>();
        reference.setApplication(new ApplicationConfig("first-dubbo-consumer"));
        reference.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
        reference.setInterface(IProviderService.class);
        IProviderService service = reference.get();
        String message = service.sayHello();
        System.out.println(message);
    }
}

附录:搭建zookeeper注册中心

由于是单机演示,就简单的使用 单机zookeeper 就好了,

通过 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz 下载zookeeper的jar包,解压后,使用 zkServer.sh(Mac OS) 或者 zkServer.cmd(Windows平台) 启动就可以了。默认端口使用的是2181.

最后

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

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