2 - 基于 Dubbo API 开发微服务应用程序

本文将演示如何基于 Dubbo Samples,通过 Dubbo API 快速开发微服务应用程序。

目标

从头开始开发基于 Dubbo 的微服务

难度

环境要求

  • 系统:Windows、Linux、MacOS

  • JDK 8 及以上(推荐 JDK17)

  • Git

  • IntelliJ IDEA(可选)

  • Docker(可选)

动手

本章将通过循序渐进的教程,教你如何从头开始开发一个微服务应用程序。

1. 启动注册中心

对于一个微服务应用程序来说,注册中心是不可或缺的组件。只有通过注册中心,消费者才能成功地发现服务器的地址信息,然后进行调用。

为了使本教程更容易使用,我们提供了一个基于 Apache Zookeeper 注册中心的简单启动器。如果您需要在生产环境中部署注册中心,请参考 生产环境初始化 部署高可用注册中心。

Windows:
git clone --depth=1 --branch master git@github.com:apache/dubbo-samples.git
cd dubbo-samples
./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper

Linux / MacOS:
git clone --depth=1 --branch master git@github.com:apache/dubbo-samples.git
cd dubbo-samples
./mvnw clean compile exec:java -pl tools/embedded-zookeeper

Docker:
docker run --name some-zookeeper --restart always -d zookeeper

2. 初始化项目

从本节开始,项目将基于 IntelliJ IDEA 进行构建和测试。

img

如上图所示,可以构建一个基本的项目。

img

初始化项目后,需要在 src/main/java 目录下创建 org.apache.dubbo.samples.apiorg.apache.dubbo.samples.clientorg.apache.dubbo.samples.provider 三个包。

未来,我们将在 api 下创建对应的接口,在 client 下创建对应的客户端订阅服务功能,在 provider 下创建对应的服务器实现和发布服务功能。

以上三个包分别对应应用程序所依赖的 API、消费者端应用程序的模块以及服务器端应用程序的模块。在实际部署中,需要将其拆分为三个项目,消费者和服务的共同依赖是 api 模块。从简入手,本教程将在一个项目中进行开发,以区分多个启动类。

3. 添加 Maven 依赖

初始化项目后,我们需要先添加 Dubbo 相关的 maven 依赖。

img

编辑 pom.xml 文件,添加如下配置。

    <dependencies>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>3.2.0-beta.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-x-discovery</artifactId>
            <version>4.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.8.0</version>
            <exclusions>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-handler</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-transport-native-epoll</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

在该配置中,定义了 dubbo 和 zookeeper(以及对应的连接器 curator)的依赖。

img

添加完以上配置后,可以通过 IDEA 的 Maven - Reload All Maven Projects 刷新依赖。

4. 定义服务接口

服务接口是 Dubbo 中消费者和服务器之间的桥梁。

img

org.apache.dubbo.samples.api 下创建 GreetingsService 接口,定义如下

package org.apache.dubbo.samples.api;

public interface GreetingsService {

    String sayHi(String name);
}

GreetingsService 中,定义了 sayHi 方法。后续服务器发布的服务和消费者订阅的服务,都是围绕 GreetingsService 接口进行开发的。

5. 定义服务器的实现

定义完服务接口后,就可以在服务器端定义对应的实现。与消费者端相比,这部分实现是远程实现,本地没有相关信息。

img

org.apache.dubbo.samples.provider 下创建 GreetingsServiceImpl 类,定义如下

package org.apache.dubbo.samples.provider;

import org.apache.dubbo.samples.api.GreetingsService;

public class GreetingsServiceImpl implements GreetingsService {
    @Override
    public String sayHi(String name) {
        return "hi," + name;
    }
}

GreetingsServiceImpl 中,实现了 GreetingsService 接口,对于 sayHi 方法,返回 hi, name

6. 服务器发布服务

实现完服务后,本节将通过 Dubbo 的 API 将服务发布到网络上。

img

org.apache.dubbo.samples.provider 下创建 Application 类,定义如下

package org.apache.dubbo.samples.provider;

import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.samples.api.GreetingsService;

public class Application {
    public static void main(String[] args) {
        // define a specific service
        ServiceConfig<GreetingsService> service = new ServiceConfig<>();
        service.setInterface(GreetingsService.class);
        service.setRef(new GreetingsServiceImpl());

        // start Dubbo
        DubboBootstrap. getInstance()
                .application("first-dubbo-provider")
                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
                .protocol(new ProtocolConfig("dubbo", -1))
                .service(service)
                .start()
                .await();
    }
}

org.apache.dubbo.samples.provider.Application 中,有两部分功能:首先,基于 ServiceConfig,定义了发布的服务信息,包括接口信息和对应的实现类对象;其次,配置了 Dubbo 的启动器,传入应用程序名称、注册中心地址、协议信息以及服务信息。

注意:DubboBootstrap 中的 registryprotocolservice 可以多次传入。

7. 消费者订阅并调用

对于消费者端,您可以通过 Dubbo 的 API 订阅消费者端。

img

org.apache.dubbo.samples.client 下创建 Application 类,定义如下

package org.apache.dubbo.samples.client;

import java.io.IOException;

import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.samples.api.GreetingsService;

public class Application {
    public static void main(String[] args) throws IOException {
        ReferenceConfig<GreetingsService> reference = new ReferenceConfig<>();
        reference.setInterface(GreetingsService.class);

        DubboBootstrap. getInstance()
                .application("first-dubbo-consumer")
                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
                .reference(reference);

        GreetingsService service = reference. get();
        String message = service.sayHi("dubbo");
        System.out.println("Receive result ======> " + message);
        System.in.read();
    }
}

org.apache.dubbo.samples.client.Application 中有三个函数

第一个是基于 ReferenceConfig 定义订阅的服务信息,包括接口信息。

第二个是配置 Dubbo 启动器,传入应用程序名称、注册中心地址、协议信息和服务信息。

最后,获取动态代理对象并调用它。

注意:DubboBootstrap 支持同时传入 servicereference,这意味着一个应用程序可以同时是消费者和服务器。

8. 启动应用程序

截至步骤 7,代码已经开发完成,本节将启动整个项目并进行验证。

img

首先启动 org.apache.dubbo.samples.provider.Application,等待一段时间后查看日志(DubboBootstrap awaiting),如下图所示,表示服务提供者已启动,表明服务提供者可以提供服务。

[DUBBO] DubboBootstrap awaiting ..., dubbo version: 3.2.0-beta.4, current host: 169.254.44.42

然后启动 org.apache.dubbo.samples.client.Application,等待一段时间后查看日志(hi, dubbo),如下图所示,表示服务消费者已启动,并且成功获取了对服务器的调用。

img

Receive result ======> hi, dubbo

进一步阅读

1. Dubbo 配置介绍

Dubbo 的主要配置项是 ReferenceConfigServiceConfigDubboBootstrap。有关更多详细信息,请参阅 [API 配置 | Apache Dubbo](/en/docs3-v2/java-sdk/reference-manual/config/api /) 文章。

2. 除了 API 方法之外的其他使用方式

除了 API 方法之外,Dubbo 还支持 Spring XML、Annotation 和 Spring Boot 等配置方法。在下一教程中,我们将解释如何使用 Spring Boot 配置方法快速开发。

有关 XML 和 Annotation 的详细信息,请参阅 XML 配置 | Apache Dubbo、[Annotation 配置 | Apache Dubbo](/en/docs3- v2/java-sdk/reference-manual/config/annotation/) 疑问。

更多

本教程介绍了如何基于 Dubbo 的纯 API 开发微服务应用程序。在下一教程中,我们将介绍如何基于 Spring Boot 开发微服务项目。


上次修改时间:2023 年 2 月 23 日:更新 SEO/img alt (35090e3f9b4)