快速上手使用Dubbo进行远程调用

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 本场景将对Dubbo的基础结构和使用方式进行介绍,带您体验快速上手使用Dubbo完成基础验证。

快速上手使用Dubbo进行远程调用

1. 创建实验资源

开始实验之前,您需要先创建ECS实例资源。

1. 在实验室页面,单击创建资源

2. (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、用户信息等)。

说明:资源创建过程需要1~3分钟。


2. Dubbo背景知识Dubbo是什么?

本步骤为背景知识学习,详解Dubbo是什么?

Apache Dubbo是一款RPC服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了Java、Golang等多语言SDK实现。使用Dubbo开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用Dubbo提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。

Apache Dubbo最初在2008年由Alibaba捐献开源,很快成为了国内开源服务框架选型的事实标准框架 ,得到了各行各业的广泛应用。在 2017 年,Dubbo正式捐献到Apache软件基金会并成为Apache顶级项目,目前Dubbo3已经是一站式的微服务解决方案提供:

  • 基于 HTTP/2 的 Triple 协议以及面向代理 API 的编程体验。
  • 强大的流量治理能力,如地址发现、负载均衡、路由选址、动态配置等。
  • 多语言 SDK 实现,涵盖 Java、Golang、Javascript 等,更多语言实现将会陆续发布。
  • 灵活的适配与扩展能力,可轻松与微服务体系其他组件如 Tracing、Transaction 等适配。
  • Dubbo Mesh 解决方案,同时支持 Sidecar、Proxyless 等灵活的 Mesh 部署方案。

Apache Dubbo总体架构能很好的满足企业的大规模微服务实践,因为它从设计之初就是为了解决超大规模微服务集群实践问题,不论是阿里巴巴还是工商银行、中国平安、携程等社区用户,它们都通过多年的大规模生产环境流量对Dubbo的稳定性与性能进行了充分验证,因此,Dubbo在解决业务落地与规模化实践方面有着无可比拟的优势:

  • 开箱即用。
  • 易用性高,如Java版本的面向接口代理特性能实现本地透明调用。
  • 功能丰富,基于原生库或轻量扩展即可实现绝大多数的微服务治理能力。
  • 面向超大规模微服务集群设计。
  • 极致性能,高性能的RPC通信协议设计与实现。
  • 横向可扩展,轻松支持百万规模集群实例的地址发现与流量治理。
  • 高度可扩展
  • 调用过程中对流量及协议的拦截扩展,如Filter、Router、LB等。
  • 微服务治理组件扩展,如Registry、Config Center、Metadata Center等。
  • 企业级微服务治理能力。
  • 国内共有云厂商支持的事实标准服务框架。
  • 多年企业实践经验考验,参考用户实践案例


3. Dubbo背景知识基本工作流程详解

本步骤为背景知识学习,详解Dubbo基本工作流程。

Dubbo首先是一款 RPC 框架,它定义了自己的RPC通信协议与编程方式。如上图所示,用户在使用Dubbo时首先需要定义好Dubbo服务;其次,是在将Dubbo服务部署上线之后,依赖Dubbo的应用层通信协议实现数据交换,Dubbo所传输的数据都要经过序列化,而这里的序列化协议是完全可扩展的。

使用Dubbo的第一步就是定义Dubbo服务,服务在Dubbo中的定义就是完成业务功能的一组方法的集合,可以选择使用与某种语言绑定的方式定义,如在Java中Dubbo服务就是有一组方法的Interface接口,也可以使用语言中立的Protobuf Buffers IDL定义服务

定义好服务之后,服务端(Provider)需要提供服务的具体实现,并将其声明为Dubbo服务,而站在服务消费方(Consumer)的视角,通过调用Dubbo框架提供的API可以获得一个服务代理(stub)对象,然后就可以像使用本地服务一样对服务方法发起调用了。

在消费端对服务方法发起调用后,Dubbo框架负责将请求发送到部署在远端机器上的服务提供方,提供方收到请求后会调用服务的实现类,之后将处理结果返回给消费端,这样就完成了一次完整的服务调用。如图中的Request、Response数据流程所示。

在分布式系统中,尤其是随着微服务架构的发展,应用的部署、发布、扩缩容变得极为频繁,作为RPC消费方,如何定动态的发现服务提供方地址成为RPC通信的前置条件。Dubbo提供了自动的地址发现机制,用于应对分布式场景下机器实例动态迁移的问题。如下图所示,通过引入注册中心来协调提供方与消费方的地址,提供者启动之后向注册中心注册自身地址,消费方通过拉取或订阅注册中心特定节点,动态的感知提供方地址列表的变化。


4. Demo启动实践

本实验场景提供示例代码和相关环境,本步骤指导您如何快速启动示例。

  1. 执行如下命令,在dubbo-samples-spring-boot目录,打包Demo。
cd /root/dubbo-samples/dubbo-samples-spring-boot/
mvn clean package

返回结果如下,表示打包成功。

  1. 执行如下命令,进入dubbo-samples-spring-boot-provider/target目录并启动java进程,运行Provider。
cd /root/dubbo-samples/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider/target
java -jar dubbo-samples-spring-boot-provider-1.0-SNAPSHOT.jar

返回结果如下,表示Provider启动成功。

  1. 在实验页面右上角,单击图标,新建一个终端窗口二。

  1. 执行如下命令,进入dubbo-samples-spring-boot-consumer目录并启动java进程,运行consumer。
cd /root/dubbo-samples/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer/target
java -jar dubbo-samples-spring-boot-consumer-1.0-SNAPSHOT.jar

返回如下结果,表示consumer启动成功,并且您可在consumer侧会看到输出如下信息。

  1. 切换至终端窗口一,您可在provider侧会看到输出如下信息。

至此就把Dubbo的基本功能都实现了,您可以在Dubbo的基础上进行更多的开发。


5. Demo核心流程详解

本步骤详解Demo核心流程代码。关于Demo示例的更详细解读,可参见注解配置

  1. 定义服务接口,文件目录为dubbo-samples-spring-boot-interface/DemoService.java。
package org.apache.dubbo.samples.basic.api;
public interface DemoService {
    String sayHello(String name);
}
  1. 提供方实现接口并暴露服务,文件目录为dubbo-samples-spring-boot-provider/DemoServiceImpl.java。
@DubboService
public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) {
        System.out.println("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return "Hello " + name;
    }
}
  1. 配置application.yml文件,文件目录为dubbo-samples-spring-boot-provider/resources/application.yml。
dubbo:
  application:
    name: dubbo-springboot-demo-provider
  protocol:
    name: dubbo
    port: -1
  registry:
    id: zk-registry
    address: zookeeper://127.0.0.1:2181
  config-center:
    address: zookeeper://127.0.0.1:2181
  metadata-report:
    address: zookeeper://127.0.0.1:2181
  1. 定义Spring Boot主函数,文件目录为dubbo-samples-spring-boot-provider/ProviderApplication.java。
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
    public static void main(String[] args) throws Exception {
        new EmbeddedZooKeeper(2181, false).start();
        SpringApplication.run(ProviderApplication.class, args);
        System.out.println("dubbo service started");
        new CountDownLatch(1).await();
    }
}

其中,@EnableDubbo 必须配置。

  1. 引用远程服务,文件目录为dubbo-samples-spring-boot-consumer/ConsumerApplication.java。
public class ConsumerApplication {
    @DubboReference
    private DemoService demoService;
}
  1. 定义application.yml,文件目录为dubbo-samples-spring-boot-consumer/application.yml。
dubbo:
  application:
    name: dubbo-springboot-demo-consumer
  protocol:
    name: dubbo
    port: -1
  registry:
    id: zk-registry
    address: zookeeper://127.0.0.1:2181
  config-center:
    address: zookeeper://127.0.0.1:2181
  metadata-report:
    address: zookeeper://127.0.0.1:2181

  1. 加载Spring配置,并调用远程服务,文件目录为dubbo-samples-spring-boot-consumer/ConsumerApplication.java。
@SpringBootApplication
@Service
@EnableDubbo
public class ConsumerApplication {
    @DubboReference
    private DemoService demoService;
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(ConsumerApplication.class, args);
        ConsumerApplication application = context.getBean(ConsumerApplication.class);
        String result = application.doSayHello("world");
        System.out.println("result: " + result);
    }
}

其中,@EnableDubbo 必须配置。

实验链接:https://developer.aliyun.com/adc/scenario/f795006d7242403eaf8021f53a6269a5

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
4天前
|
SpringCloudAlibaba Dubbo Java
【五】SpringCloud Alibaba之整合Dubbo(实现远程调用)
【五】SpringCloud Alibaba之整合Dubbo(实现远程调用)
63 0
|
XML 监控 Dubbo
Dubbo+Zookeeper的简单使用---实现RPC远程调用
通过本篇博文,快速了解分布式相关知识并快速上手dubbo+Zookeeper实现RPC的远程调用。
Dubbo+Zookeeper的简单使用---实现RPC远程调用
|
Dubbo Java 应用服务中间件
SpringBoot 集成Dubbo 消费者远程调用服务报 TimeoutException 超时异常
SpringBoot 集成Dubbo 消费者远程调用服务报 TimeoutException 超时异常
535 0
|
Dubbo Java 应用服务中间件
架构师之路-在Dubbo中开发REST风格的远程调用
dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp协议)、http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持)、hessian(二进制序列化 + http协议)、WebServices (文本序列化 + http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化 + http协议)的支持。
2906 0
|
JavaScript Java 应用服务中间件
|
4天前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
6月前
|
负载均衡 Dubbo 应用服务中间件
微服务技术系列教程(31) - Dubbo-原理及负载均衡分析
微服务技术系列教程(31) - Dubbo-原理及负载均衡分析
57 0
|
4天前
|
Dubbo Java 应用服务中间件
阿里巴巴资深架构师深度解析微服务架构设计之SpringCloud+Dubbo
软件架构是一个包含各种组织的系统组织,这些组件包括Web服务器,应用服务器,数据库,存储,通讯层),它们彼此或和环境存在关系。系统架构的目标是解决利益相关者的关注点。
|
4天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo: 微服务通信的高效解决方案
【4月更文挑战第28天】在微服务架构的发展中,服务间的高效通信至关重要。Spring Cloud Dubbo 提供了一种基于 RPC 的通信方式,使得服务间的调用就像本地方法调用一样简单。本篇博客将探讨 Spring Cloud Dubbo 的核心概念,并通过具体实例展示其在项目中的实战应用。
22 2