Dubbo 入门系列之基于 Dubbo API 开发微服务应用

news2024/12/26 12:05:09

目标

从零上手开发基于 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 进行工程的搭建以及测试。

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

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

后续我们将在 api 下创建对应的接口,在 client 下创建对应客户端订阅服务的功能,在 provider 下创建对应服务端的实现以及发布服务的功能。

上述三个 package 分别对应了应用共同依赖的 api、消费端应用的模块、服务端应用的模块。在实际部署中需要拆成三个工程,消费端和服务的共同依赖 api 模块。从简单出发,本教程将在同一个工程中进行开发,区分多个启动类。

3. 添加 Maven 依赖

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

编辑 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)的依赖。

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

4. 定义服务接口

服务接口 Dubbo 中沟通消费端和服务端的桥梁。

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

package org.apache.dubbo.samples.api;

public interface GreetingsService {

    String sayHi(String name);
}

GreetingsService 中,定义了 sayHi 这个方法。后续服务端发布的服务,消费端订阅的服务都是围绕着 GreetingsService 接口展开的。

5. 定义服务端的实现

定义了服务接口之后,可以在服务端这一侧定义对应的实现,这部分的实现相对于消费端来说是远端的实现,本地没有相关的信息。

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 在网络上发布这个服务。

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) {
        // 定义具体的服务
        ServiceConfig<GreetingsService> service = new ServiceConfig<>();
        service.setInterface(GreetingsService.class);
        service.setRef(new GreetingsServiceImpl());

        // 启动 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 可以进行消费端订阅。

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 步,代码就已经开发完成了,本小节将启动整个项目并进行验证。

首先是启动 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 )即代表服务消费端启动完毕并调用到服务端成功获取结果。

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

延伸阅读

1. Dubbo 的配置介绍

Dubbo 的主要配置入口有ReferenceConfigServiceConfigDubboBootstrap ,更多的细节可以参考 API 配置 | Apache Dubbo 一文。

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

Dubbo 除了 API 方式还支持 Spring XML、Annotation、Spring Boot 等配置方式,在下一个教程中将就 Spring Boot 配置方式讲解如何进行快速开发。

关于 XML 和 Annotation 的细节可以参考 XML 配置 | Apache Dubbo、Annotation 配置 | Apache Dubbo 疑问。

更多

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

欢迎在 https://github.com/apache/dubbo 给 Dubbo Star。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程-UDP数据报套接字

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. 网络编程基础 1.1 为什么需要网络编程? 1.2 什…

好友关注-Feed流实现方案

9.3 好友关注-Feed流实现方案 当我们关注了用户后&#xff0c;这个用户发了动态&#xff0c;那么我们应该把这些数据推送给用户&#xff0c;这个需求&#xff0c;其实我们又把他叫做Feed流&#xff0c;关注推送也叫做Feed流&#xff0c;直译为投喂。为用户持续的提供“沉浸式”…

简聊商城项目的表设计

零、前言 1、优惠卷设计 电商项目中的优惠券系统这样设计&#xff0c;同事直呼 666 &#xff01; 2、SPU和SKU的定义及他们之间的关系 SPU全称Standard Product Unit&#xff0c;即标准化产品单元。 简单理解就是某一种产品。 SKU全称Stock Keeping Unit&#xff0c;即库存量…

ChatGPT官方API可以抢先体验了

ChatGPT官方API目前还在内测当中&#xff0c;OpenAI官网上也没有任何接口介绍和文档。这对于开发和调用来说不怎么方便。但是&#xff0c;比较好的地方在于内测过程中调用是免费的&#xff0c;没有次数限制。此外&#xff0c;API接口调用不需要梯子或代理&#xff08;使用代理反…

【原创】如何做一张原创8BIT音乐的NES音乐卡片

我陷入了深思。。。。。。 第一步是创作一首8BIT音乐。我介绍两个NES用的音乐工具&#xff1a;FamiTracker 和 FamiStudio。 选FamiTracker的原因是&#xff0c;有完美教程呀。红鸡将他的教程放到B站了&#xff1a;红激教你做音乐 一共11集&#xff0c;非常亲民地道的教学&a…

C++11 lambda表达式

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍C11的lambda表达式 lambda表达式lambda表达式的概念lambda表达式语法lambda表达式交换两个数lambda表达式的底层原理lambda表达式的…

【ChatGPT 中文版小程序】无需注册体验 ChatGPT 的攻略

本文导读什么是ChatGPT&#xff1f;ChatGPT能做什么&#xff1f;功能测试如何解锁有趣功能&#xff1f;我想部署同样的一个小程序&#xff0c;请问如何做&#xff1f;什么是ChatGPT&#xff1f; 最近网上非常火爆的CHATGPT&#xff0c;它是OpenAI开发的一款开源的自然语言处理…

专访量子计算上市公司IonQ CEO

&#xff08;图片来源&#xff1a;网络&#xff09;IonQ的CEO Peter Chapma&#xff0c;从70年代中期就从事高科技行业&#xff0c;至今已有45年左右。在接受媒体采访时&#xff0c;Peter Chapman谈到IonQ扩展计算机和提供业务价值的计划、量子客户的最佳应用程序开发合作伙伴、…

DEFCON议题解读|Dll劫持新思路——修改环境变量

简介 在2022年的Defcon大会上,安全研究人员Wietze Beukema通过对进程级环境变量的研究&#xff0c;提出了一种Dll劫持新思路&#xff0c;下面就其中涉及的技术点展开介绍。 **01 **环境变量 每一个进程都有一个环境块&#xff0c;其中包含一组环境变量及其值。有两种类型的环…

RabbitMQ的消息模型

文章目录1、简单队列2、work 模式3、发布/订阅模式4、路由模式FanoutDirect5、主题模式6.工作模式总结7、四种交换器RabbitMQ官方提供了5个不同的Demo示例&#xff0c;对应了不同的消息模型&#xff1a; 1、简单队列 一个生产者对应一个消费者&#xff01;&#xff01; publi…

Linux shell 命令行环境下使用阿里云盘

阿里云盘在内测的时候我就在使用&#xff0c;整体体验相当的好&#xff0c;最起码不会限速&#xff0c;比起下载速度只有十几 KB 的某垃圾云盘要强太多了。 当然除了使用各系统的客户端进行下载之外&#xff0c;我还想要在命令行进行操作&#xff0c;主要原因也是我有一台 NAS…

AcWing 487. 金明的预算方案(有依赖的背包问题 + 分组背包问题)

AcWing 487. 金明的预算方案一、问题二、分析三、代码一、问题 二、分析 这道题属于一个背包问题&#xff0c;但是这道题中有一个很神奇的条件。就是我们想要购买某个物品的附件的话&#xff0c;前提是我们要购买这个物品的主件。 因此&#xff0c;我们可以将这道题画成下面这…

Java高手速成 | EL表达式语言

本文主要讲解EL表达式语言的作用、基本语法以及运算符。 01、EL的作用 当需要在JSP页面显示变量以及JavaBean对象时&#xff0c;可以使用JSP的表达式&#xff0c;如<%变量%>的形式&#xff0c;也可以直接使用如<%out.println(变量)%>的Java输出语句。尤其当JSP页…

C语言学习笔记-循环

有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多次执行一个…

硬核工厂!钢厂远程监管,三维组态监控 HMI

钢铁行业作为我国的支柱产业&#xff0c;也是我国能源消耗的重点行业之一&#xff0c;随着国家节能减排政策的推进&#xff0c;有效实施能源管控是企业提高能源绩效、降低能源成本和提高核心竞争力的重要途径。通过对钢铁企业能耗现状和能源管理模式的分析可以得知&#xff0c;…

GitHub中如何创建自己的存储库?(图文详解)

前言 &#x1f4dc; “ 作者 久绊A ” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴 目录 一、创建自己的存储库&#xff1f; 二、详细介绍 1、Reposito…

微前端——一个属于前端的时代

关于微前端为什么需要微前端&#xff1f;What&#xff1f;什么是微前端Why&#xff1f;为什么去使用微前端How&#xff1f;怎样落地微前端Where&#xff1f;在什么场景下使用微前端CSS 隔离方案JavaScript 沙箱机制快照沙箱Proxy 代理沙箱legacySandbox(单例沙箱)proxySandbox(…

云原生丨手把手教你搭建自己的第一个微服务

文章目录前言一、环境准备软件要求配置操作二、拉取框架三、模块搭建SDK模块SDK-Cloud 模块common模块API模块前言 我们知道&#xff0c;微服务架构是把项目里的每一个功能元素独立出来&#xff0c;再对这些功能元素进行动态组合。这样的优点在于&#xff1a;节省调用资源&…

基于Springboot搭建java项目(三十一)—— 什么是Docker

什么是Docker 一、容器技术 1、应用程序的部署问题 ​ 还原应用程序部署的场景&#xff0c;开发在开发应用的时候&#xff0c;要自己搭建一套环境&#xff0c;进行本地调试&#xff0c;这时就需要在本地搭建一套JVM&#xff0c;NODE&#xff0c;NGNIX等一些应用程序运行的环…

【大唐杯备考】——5G系统勘察设计(学习笔记)

&#x1f4d6; 前言&#xff1a;本期介绍5G系统勘察设计。 目录&#x1f552; 1. 概述&#x1f558; 1.1 5G网络预规划&#x1f564; 1.1.1 5G建网需求确认&#x1f564; 1.1.2 4G现网评估&#x1f564; 1.1.3 站点规模估算&#x1f564; 1.1.4 5G仿真评估&#x1f558; 1.2 5G…