Dubbo 入门系列之基于 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 进行工程的搭建以及测试。

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

在初始化完项目之后,需要在 src/main/java 目录下创建 org.apache.dubbo.samples.api 、org.apache.dubbo.samples.client 和 org.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 中的registry 、protocol 和 service 可以多次传入。
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 中支持 service 和 reference 可以同时传入,意味着一个应用可以同时即是消费端、也是服务端。
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 的主要配置入口有ReferenceConfig 、ServiceConfig 和 DubboBootstrap ,更多的细节可以参考 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。
搜索关注官方微信公众号:Apache Dubbo,了解更多业界最新动态,掌握大厂面试必备 Dubbo 技能
Dubbo 入门系列之基于 Dubbo API 开发微服务应用的更多相关文章
- 低代码平台--基于surging开发微服务编排流程引擎构思
前言 微服务对于各位并不陌生,在互联网浪潮下不是在学习微服务的路上,就是在使用改造的路上,每个人对于微服务都有自己理解,有用k8s 就说自己是微服务,有用一些第三方框架spring cloud, du ...
- Java开发微服务为什么一定要选spring cloud?
来自:网易乐得技术团队,作者:董添 李秉谦 现如今微服务架构十分流行,而采用微服务构建系统也会带来更清晰的业务划分和可扩展性.同时,支持微服务的技术栈也是多种多样的,本系列文章主要介绍这些技术中的翘楚 ...
- [学习笔记]尝试go-micro开发微服务<第一波>
平时项目都是基于c++,lua,node, 现在打算开始自学开发微服务; 也顺带磨砺下go和docker 前期准备 1. 有golang编程基础 本系列文章是基于有golang编程基础,有过实际开 ...
- 使用.NET Core+Docker 开发微服务
.NET Core发布很久了,因为近几年主要使用java,所以还没使用过.NET Core,今天正好有一个c#写的demo,需要做成服务,不想再转成java来实现,考虑使用.NET CORE来尝下鲜, ...
- 社区活动分享PPT:使用微软开源技术开发微服务
上周六在成都中生代技术社区线下活动进行了一个名为"微软爱开源-使用微软开源技术开发微服务"的技术分享. 也算是给很多不熟悉微软开源技术的朋友普及一下微软最近几年在开源方面所做的努力 ...
- Spring boot 零配置开发微服务
2018年12月29日星期六 体验Spring boot 零配置开发微服务 1.为什么要用Spring boot? 1.1 简单方便.配置少.整合了大多数框架 1.2 适用于微服务搭建,搭建的微服务 ...
- .net 与 java 开发微服务对比
java+spring boot+maven对比.net 优势: 1. spring 自身带的ioc 比.net 更简单易用. 2. spring actuator的健康检测等运行时状态查看功能很赞. ...
- dubbo入门和springboot集成dubbo小例子
从零开始搭建springboot-dubbo的例子 Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案 一. Dubbo的简单介绍 1. ...
- YoyoGo微服务框架入门系列-快速编写WEB API
前言 YoyoGo是一个使用Golang编写的一个简单.轻量.快速.基于依赖注入的微服务框架,目前依然在研发阶段,欢迎Star以及一起参与到框架的研发 GitHub地址:https://github. ...
- 批处理系列(18) - 基于BitLocker的开锁上锁
首先要配置好BitLocker. 上锁 lock.bat @echo off rem 上锁前要结束一些程序,浏览器要注意:有恢复上次关闭项功能,按需设置取消该操作 taskkill /f /t /im ...
随机推荐
- Java多线程-线程生命周期(一)
如果要问我Java当中最难的部分是什么?最有意思的部分是什么?最多人讨论的部分是什么?那我会毫不犹豫地说:多线程. Java多线程说它难,也不难,就是有点绕:说它简单,也不简单,需要理解的概念很多,尤 ...
- JK触发器与模12计数器
JK触发器 JK触发器具有保持,置0,置1和翻转四个功能. 则可得出次态方程:\(Q_{n+1} = JQ_n'+K'Q_n\) Design `timescale 1ns / 1ps module ...
- Datatable 数据源
数据源类型 Datatable可以使用三种基本的JavaScript数据类型作为数据源 数组(Arrays[]) 对象(objects{}) 实例(new myclass()) 目前使用过的为前两种, ...
- MindStudio模型训练场景精度比对全流程和结果分析
摘要:MindStudio是一套基于华为昇腾AI处理器开发的AI全栈开发平台 本文分享自华为云社区<MindStudio模型训练场景精度比对全流程和结果分析>,作者:yd_24730208 ...
- idea中springboot热部署(无需重启项目)
idea中springboot热部署(无需重启项目) 1.在pom.xml文件中导入依赖 <dependency> <groupId>org.springframework.b ...
- perl遍历哈希的所有健和值
my %h=("001",{name,"李白",age,"18",height,"185",weight,"6 ...
- mysql 基础明细
1.mysql 没有 TOP,用limit实现 2.mysql having 聚合之后,对组操作,和GROUP By搭配 mysql where 聚合之前,对表和视图操作 3.where 子句的作用 ...
- Gitlab 和 jenkins 搭建遇到的坑
1 Gitlab 端口默认 80 所有其他程序提前把端口腾空 2 Gitlab 配置的是pub 公钥 3 java版本要在1.8以上 4 Jenkins 配置私钥 5 需要配置各个目录的workspa ...
- 谈软件-Java重构案例之Switch_Statements
1.软件重构,大量swich语句如何重构 2.使用 ide 使用 快捷键ctrl+alt+shift+T调出重构菜单,选择method对之前的for循环重构一个method 3.得到一个新的方法,使用 ...
- 基于python的数学建模---图论模型(Dijkstra)
from collections import defaultdict from heapq import * # 堆--先进后出 inf = 99999 # 不连通值 mtx_graph = [[0 ...