目标

从零上手开发基于 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 DubboAnnotation 配置 | Apache Dubbo 疑问。

更多

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

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

搜索关注官方微信公众号:Apache Dubbo,了解更多业界最新动态,掌握大厂面试必备 Dubbo 技能

Dubbo 入门系列之基于 Dubbo API 开发微服务应用的更多相关文章

  1. 低代码平台--基于surging开发微服务编排流程引擎构思

    前言 微服务对于各位并不陌生,在互联网浪潮下不是在学习微服务的路上,就是在使用改造的路上,每个人对于微服务都有自己理解,有用k8s 就说自己是微服务,有用一些第三方框架spring cloud, du ...

  2. Java开发微服务为什么一定要选spring cloud?

    来自:网易乐得技术团队,作者:董添 李秉谦 现如今微服务架构十分流行,而采用微服务构建系统也会带来更清晰的业务划分和可扩展性.同时,支持微服务的技术栈也是多种多样的,本系列文章主要介绍这些技术中的翘楚 ...

  3. [学习笔记]尝试go-micro开发微服务<第一波>

    平时项目都是基于c++,lua,node, 现在打算开始自学开发微服务;   也顺带磨砺下go和docker 前期准备 1. 有golang编程基础 本系列文章是基于有golang编程基础,有过实际开 ...

  4. 使用.NET Core+Docker 开发微服务

    .NET Core发布很久了,因为近几年主要使用java,所以还没使用过.NET Core,今天正好有一个c#写的demo,需要做成服务,不想再转成java来实现,考虑使用.NET CORE来尝下鲜, ...

  5. 社区活动分享PPT:使用微软开源技术开发微服务

    上周六在成都中生代技术社区线下活动进行了一个名为"微软爱开源-使用微软开源技术开发微服务"的技术分享. 也算是给很多不熟悉微软开源技术的朋友普及一下微软最近几年在开源方面所做的努力 ...

  6. Spring boot 零配置开发微服务

    2018年12月29日星期六 体验Spring boot 零配置开发微服务 1.为什么要用Spring  boot? 1.1 简单方便.配置少.整合了大多数框架 1.2 适用于微服务搭建,搭建的微服务 ...

  7. .net 与 java 开发微服务对比

    java+spring boot+maven对比.net 优势: 1. spring 自身带的ioc 比.net 更简单易用. 2. spring actuator的健康检测等运行时状态查看功能很赞. ...

  8. dubbo入门和springboot集成dubbo小例子

    从零开始搭建springboot-dubbo的例子 Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案 一. Dubbo的简单介绍 1. ...

  9. YoyoGo微服务框架入门系列-快速编写WEB API

    前言 YoyoGo是一个使用Golang编写的一个简单.轻量.快速.基于依赖注入的微服务框架,目前依然在研发阶段,欢迎Star以及一起参与到框架的研发 GitHub地址:https://github. ...

  10. 批处理系列(18) - 基于BitLocker的开锁上锁

    首先要配置好BitLocker. 上锁 lock.bat @echo off rem 上锁前要结束一些程序,浏览器要注意:有恢复上次关闭项功能,按需设置取消该操作 taskkill /f /t /im ...

随机推荐

  1. HTML躬行记(4)——Web音视频基础

    公司目前的业务会接触比较多的音视频,所以有必要了解一些基本概念. 文章涉及的一些源码已上传至 Github,可随意下载. 一.基础概念 本节音视频的基础概念摘自书籍<FFmpeg入门详解 音视频 ...

  2. kafka-consumer-groups 命令行工具使用手册

    kafka-consumer-groups 命令行工具使用手册 该手册原文出自 $KAFKA_HOME\bin\windows\kafka-consumer-groups.bat --help 命令的 ...

  3. WPF之BackgroundWorker

    BackgroundWorker类允许您在单独的线程上执行某个可能导致用户界面(UI)停止响应的耗时操作,下面来介绍一下这个线程类BackgroundWorker,大家可以结合这位大佬的这篇文章,说的 ...

  4. JSP利用AJAX实现页面即时校验验证码

    在JSP页面实现验证码校验文章中当时是使用的Servlet类来进行的验证码校验,但是这种方式并不能即时校验,在正常情况下都是直接在用户输入之后就进行校验,这样对用户来说很方便的. AJAX 即&quo ...

  5. Linux面试题2:网络IO模型 & IO多路复用

    网络IO 先确定一下范围,我们讨论的都是网络IO,现阶段计算机早已经从CPU密集型转换成网络IO密集型,所以网络io的类型对于服务响应而言更重要. 五种IO模型 依据Unix的IO分类,网络IO分为五 ...

  6. nc传输文件结束后不退出

    原因 版本不同 udp传输不会自动关闭 解决方案 nc -l 1234 > file.img nc ip 1234 -q 0 < file.img 采用tcp传输文件 -q 文件传输结束后 ...

  7. vulnhub靶场之LOOZ: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:looz: 1,下载地址:https://download.vulnhub.com/looz/Looz.zip,下载后直接vbox打开即可. 知 ...

  8. Linux相关命令及软件安装教程

    @font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...

  9. 【大数据面试】【项目开发经验】Hadoop、Flume、Kafka、Hive、MySQL、Sqoop、Azkaban、Spark

    主要内容:框架层面的调优.业务经验 一.Hadoop 1.Hadoop基准测试(HDFS的读写性能.MapReduce的计算能力测试) (1)测试内容:文件上传下载的时间 (2)服务器有几个硬盘插槽 ...

  10. 01-复杂度2 Maximum Subsequence Sum (25分)

    Sample Input: 10 -10 1 2 3 4 -5 -23 3 7 -21 Sample Output: 10 1 4 题目有一个测试点是"最大和前面有一段是0",所以 ...