快速上手使用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启动实践
本实验场景提供示例代码和相关环境,本步骤指导您如何快速启动示例。
- 执行如下命令,在dubbo-samples-spring-boot目录,打包Demo。
cd /root/dubbo-samples/dubbo-samples-spring-boot/ mvn clean package
返回结果如下,表示打包成功。
- 执行如下命令,进入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启动成功。
- 在实验页面右上角,单击图标,新建一个终端窗口二。
- 执行如下命令,进入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侧会看到输出如下信息。
- 切换至终端窗口一,您可在provider侧会看到输出如下信息。
至此就把Dubbo的基本功能都实现了,您可以在Dubbo的基础上进行更多的开发。
5. Demo核心流程详解
本步骤详解Demo核心流程代码。关于Demo示例的更详细解读,可参见注解配置。
- 定义服务接口,文件目录为dubbo-samples-spring-boot-interface/DemoService.java。
package org.apache.dubbo.samples.basic.api; public interface DemoService { String sayHello(String name); }
- 提供方实现接口并暴露服务,文件目录为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; } }
- 配置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
- 定义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 必须配置。
- 引用远程服务,文件目录为dubbo-samples-spring-boot-consumer/ConsumerApplication.java。
public class ConsumerApplication { @DubboReference private DemoService demoService; }
- 定义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
- 加载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