Dubbo 高性能 RPC 框架实践

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Dubbo 高性能 RPC 框架实践

Dubbo 介绍


Dubbo 是什么?

640.png

介绍:Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案,涵盖 Java、Golang 等多种语言 SDK 实现。

特征:RPC 通讯框架,服务注册中心,支持原生云(Dubbo3.0)

主流版本:2.7.x , 3.0 **SDK: **官方 SDK 支持开发语言:Java、Golang

使用厂家:阿里巴巴、饿了么、钉钉、工商银行、小米等

注:本文后续主要基于 2.7.x 版本展开。

Dubbo 和 Eureka 对比

对比 Dubbo Eureka(Spring-Cloud-Netflix)
注册中心 ZK Eureka
CAP CP AP
容错机制 支持 通过 Hytrix 支持
负载均衡 支持 通过 Ribbon 支持
服务注册和发现协议 封装 NettyClient 实现 使用 HttpClient
社区支持 Apache 不更新

总结:Dubbo 对比 Eureka 来说的话,其实一个打包的微服务中间件,并且定制化了 RPC 通讯 dubbo 协议对比 HTTP 协议来说性能上会有一定的提高。但是我们对于微服务本身来说应该是一个细粒度的,可以定制的组件对于 Eureka 来说这方面更强。

Dubbo 使用案例

下面是一个通过 dubbo 作为 RPC 通讯的一个例子,一般在生产中会使用 zk 或者 redis 等,作为服务注册中心来保存服务信息。一个大致的交互图如下:

640.png

三个角色

  • Zookeeper 作为一个服务注册中心,管理和维护服务列表;
  • Provider 服务提供者,发布服务;
  • Consumer 服务消费者,通过 API stub 可以像调用本地方法一样调用远程的方法;

服务提供者

  1. 服务接口定义
public interface OrderService {
    String createOrder(String request);
}
  1. 服务提供者实现
public class OrderServiceImpl implements OrderService {
    @Override
    public String createOrder(String request) {
        return "create order success, request : " + request;
    }
}
  1. 服务启动类
public class RpcDubboProvidorApp {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo.xml"});
        context.start();
        System.in.read(); // 按任意键退出
    }
}
  1. 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="rpc-dubbo-provider"/>
    <!-- 使用 zookeeper 注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="io.zhengsh.rpc.api.OrderService" ref="orderService" />
    <!-- 和本地bean一样实现服务 -->
    <bean id="orderService" class="io.zhengsh.rpc.provider.OrderServiceImpl" />
</beans>

服务消费者

  1. 服务配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                           http://dubbo.apache.org/schema/dubbo
                           http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <!-- 配置应用名称 -->
    <dubbo:application name="rpc-dubbo-consumer" />
    <!-- 配置 zookeeper 注册中心的位置 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!-- 配置dubbo的通讯方式,即使用的协议及使用的端口 -->
    <dubbo:protocol name="dubbo" port="20890" />
    <!-- 生成远程服务代理,可以和本地bean一样使用 orderService -->
    <dubbo:reference id="orderService" interface="io.zhengsh.rpc.api.OrderService" />
</beans>
  1. 服务调用方代码
public class RpcDubboConsumerApp {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:dubbo.xml"});
        context.start();
        // 获取远程服务代理
        OrderService demoService = (OrderService) context.getBean("orderService");
        // 执行远程方法
        String hello = demoService.createOrder("iPhone 19");
        // 显示调用结果
        System.out.println(hello);
    }
}
  1. 运行一下:
  • 我们首先启动 RpcDubboProvidorApp
  • 然后启动 RpcDubboConsumerApp
  • 控制台输出如下:

640.png

你如果也能获得如下的输出表示实验成功。恭喜。

Dubbo 监控

Dubbo Admin 安装

  1. 下载代码: git clone https://github.com/apache/dubbo-admin.git
  2. dubbo-admin-server/src/main/resources/application.properties中指定注册中心地址

640.png

  1. 构建
  • mvn clean package -Dmaven.test.skip=true
  1. 启动
  • mvn --projects dubbo-admin-server spring-boot:run 或者
  • cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.4.0.jar
  1. 访问 http://localhost:8080

640.png

  1. 默认密码是 root/root

Dubbo Admin 使用

  1. 找到自己注册服务

640.png

  1. 模拟请求服务

点击上一个页面的 测试 按钮,进入如下页面,测试服务接口,如下图:

640.png

我传递参数,下面成功返回,可以在开发期间做一个简单的测试。

  1. 服务提供者和服务消费者查询如下图所示。

640.png

双击服务列表中的服务即可进入。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
1月前
|
Dubbo Java 应用服务中间件
微服务框架Dubbo环境部署实战
微服务框架Dubbo环境部署的实战指南,涵盖了Dubbo的概述、服务部署、以及Dubbo web管理页面的部署,旨在指导读者如何搭建和使用Dubbo框架。
92 17
微服务框架Dubbo环境部署实战
|
25天前
|
负载均衡 Dubbo NoSQL
Dubbo框架的1个核心设计点
Java领域要说让我最服气的RPC框架当属Dubbo,原因有许多,但是最吸引我的还是它把远程调用这个事情设计得很有艺术。
Dubbo框架的1个核心设计点
|
14天前
|
负载均衡 监控 Dubbo
分布式框架-dubbo
分布式框架-dubbo
|
14天前
|
XML 负载均衡 监控
分布式-dubbo-简易版的RPC框架
分布式-dubbo-简易版的RPC框架
|
2月前
|
JSON Dubbo Java
【Dubbo协议指南】揭秘高性能服务通信,选择最佳协议的终极攻略!
【8月更文挑战第24天】在分布式服务架构中,Apache Dubbo作为一款高性能的Java RPC框架,支持多种通信协议,包括Dubbo协议、HTTP协议及Hessian协议等。Dubbo协议是默认选择,采用NIO异步通讯,适用于高要求的内部服务通信。HTTP协议通用性强,利于跨语言调用;Hessian协议则在数据传输效率上有优势。选择合适协议需综合考虑性能需求、序列化方式、网络环境及安全性等因素。通过合理配置,可实现服务性能最优化及系统可靠性提升。
45 3
|
2月前
|
Dubbo 网络协议 Java
RPC框架:一文带你搞懂RPC
这篇文章全面介绍了RPC(远程过程调用)的概念、原理和应用场景,解释了RPC如何工作以及为什么在分布式系统中广泛使用,并探讨了几种常用的RPC框架如Thrift、gRPC、Dubbo和Spring Cloud,同时详细阐述了RPC调用流程和实现透明化远程服务调用的关键技术,包括动态代理和消息的编码解码过程。
RPC框架:一文带你搞懂RPC
|
2月前
|
开发框架 Dubbo 应用服务中间件
微服务开发框架-----Apache Dubbo
这篇文章介绍了Apache Dubbo微服务开发框架,它提供RPC通信和微服务治理能力,支持服务发现、负载均衡和流量治理等功能,并强调了Dubbo在微服务规模化实践和企业级治理方面的优势。
微服务开发框架-----Apache Dubbo
|
2月前
|
缓存 负载均衡 监控
Dubbo框架整体认知
该文章主要介绍了Dubbo框架的整体认知,包括Dubbo的概念、产生的背景、解决的问题、架构以及功能特性等。
Dubbo框架整体认知
|
2月前
|
负载均衡 Dubbo 应用服务中间件
框架巨擘:Dubbo如何一统异构微服务江湖,成为开发者的超级武器!
【8月更文挑战第8天】在软件开发中,微服务架构因灵活性和可扩展性备受欢迎。面对异构微服务的挑战,Apache Dubbo作为高性能Java RPC框架脱颖而出。它具备服务注册与发现、负载均衡及容错机制等核心特性,支持多种通信协议和序列化方式,能有效连接不同技术栈的微服务。Dubbo的插件化设计保证了面向未来的扩展性,使其成为构建稳定高效分布式系统的理想选择。
42 5
|
2月前
|
C# 开发者 Windows
勇敢迈出第一步:手把手教你如何在WPF开源项目中贡献你的第一行代码,从选择项目到提交PR的全过程解析与实战技巧分享
【8月更文挑战第31天】本文指导您如何在Windows Presentation Foundation(WPF)相关的开源项目中贡献代码。无论您是初学者还是有经验的开发者,参与这类项目都能加深对WPF框架的理解并拓展职业履历。文章推荐了一些适合入门的项目如MvvmLight和MahApps.Metro,并详细介绍了从选择项目、设置开发环境到提交代码的全过程。通过具体示例,如添加按钮点击事件处理程序,帮助您迈出第一步。此外,还强调了提交Pull Request时保持专业沟通的重要性。参与开源不仅能提升技能,还能促进社区交流。
33 0