精进云原生 - Dubbo 3.2 正式发布

news2024/12/24 3:10:34

作者:Dubbo 社区

我们非常高兴地宣布,Dubbo 3.2 已经正式发布了!这个版本带来了许多新功能和改进,这也是 Dubbo 在面对云原生化的当下的一次重要的尝试。

背景介绍

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

01 Rest 协议支持

1.1 Why Rest?

随着移动互联网的普及,越来越多的应用程序需要与不同的系统进行集成。而这些系统可能使用不同的通信协议,这就需要应用程序能够灵活地适应各种协议。Rest 协议正是一种非常灵活的协议,它使用 HTTP 进行通信,可以与几乎任何系统进行集成。

在过去,RPC 框架通常使用二进制协议进行通信,这种协议非常高效,但不够灵活。相比之下,Rest 协议使用 HTTP 进行通信,更方便与其他系统集成,也更容易与现代化的Web和移动应用程序集成。

除了灵活性,Rest 协议还具有易读性和易用性。使用 Rest 协议,开发人员可以使用通用的 HTTP 工具(例如 cURL 或 Postman)测试和调试服务,而不需要特定的工具。此外,由于 Rest 协议使用标准的 HTTP 方法(例如 GET、POST、PUT 和 DELETE),因此开发人员可以更容易地理解和使用服务。

1.2 How To?

在之前的 Dubbo 版本中,也提供了 Rest 协议的支持,但存在以下问题:

  • 仅支持 JAX-RS 注解域,相较于采用度更高的 Spring Web 注解,复杂度更高
  • 需要依赖众多外部组件,如 Resteasy、tomcat、jetty 等,才能正常工作,极大地增加了使用成本。

因此,在 Dubbo 3.2 版本中,我们引入了 Spring Web 注解域的支持以及 Rest 协议的原生支持,无需依赖任何外部组件。

最直观的区别是,如果你升级到了 Dubbo 3.2,通过 Spring Web 发布的服务也可以直接通过 Dubbo 来发布。这一切只需要将 @Controller 注解改成 @DubboService 注解即可。

此外,对于原来使用 Spring Boot 或者 Spring Cloud 作为服务拆分的用户,也可以基于本功能平滑地迁移到 Dubbo 上来,以极低的成本获得 Dubbo 强大的能力。

1.3 What’s next?

接下来 Dubbo 还将继续完善。除了现有的特性,我们还将加入以下新的特性,以更好地满足需求:

  1. HTTP/2、HTTP/3 协议的原生支持。这意味着,你可以更加方便地使用 Dubbo 与其他系统进行通信,无需担心协议的兼容性问题。
  2. 参考 Spring Web 注解,Dubbo 原生提供 Web 注解的支持,使得用户无需依赖 Spring Web 也可以获得与使用 Spring Web 相同的体验。
  3. 支持现有服务零改造以 Rest 协议发布。这个特性可以让你更加灵活地管理你的服务,而无需对现有的服务进行任何改动。你可以通过 Rest 协议来发布你的服务,这样你的服务就可以更加方便地被其他系统所使用了。

02 可观测体系

在微服务架构下,业务系统由越来越多的服务组成,服务之间互相调用,随之而来的问题是如何快速地定位故障,并及时解决。为了解决这一问题,我们需要更多的工具和技术来确保整个系统的可靠性。其中一个解决方案是使用日志记录和分析,以便可以更好地跟踪应用程序的运行情况,找到潜在的问题并及时解决。另外,使用可视化的监控工具可以帮助我们更好地理解整个系统的状态,从而更好地预测和解决问题。最后,我们还可以使用自动化测试来确保每个服务的质量,以及整个系统的稳定性和可靠性,从而更好地满足客户的需求。

一套完整的可观测体系应该包括以下功能:

  • Metrics 指标监控,用于收集和分析各种指标数据,包括系统的性能、资源消耗情况等等。通过指标监控,用户可以及时了解系统的运行情况,发现异常并做出相应的处理。
  • Tracing 分布式追踪,用于跟踪系统中各个服务之间的调用链路,帮助用户发现和定位潜在的性能问题、瓶颈等等。通过分布式追踪,用户可以深入了解系统的运作过程,识别出可能存在的问题并进行有效的优化和调整。
  • Logging 日志管理,用于记录系统中发生的各种事件和操作,包括错误日志、访问日志、事务日志等等。通过日志管理,用户可以了解系统的运行情况、故障信息等等,帮助用户快速定位问题并进行相应的处理。

综上所述,以上三个功能不仅可以帮助用户快速定位故障,提高系统的可靠性和稳定性,还可以帮助用户深入了解系统的运行情况和性能状况,为用户提供全方位的监控和保障。

在 Dubbo 3.2 版本中,我们主要就 Metrics 和 Tracing 两个方面进行了增强。

2.1 Metrics

在 Metrics 方面,我们使用 Micrometer 大幅增加了指标的埋点,包括但不限于 QPS、RT、调用总数、成功数、失败数、失败原因统计等核心服务指标。为了更好地监测服务运行状态,Dubbo 还提供了对核心组件状态的监控,例如线程池数量、服务健康状态等。此外,Dubbo 还支持标准 Prometheus 的 Pull 和 Push 模式,并提供了若干个官方原生的 Grafana 面板,实现面向生产的 Metrics 全天候观测。

在这里插入图片描述

对于所有的用户,只需要升级到 Dubbo 3.2 版本,并添加 dubbo-spring-boot-observability-starter 依赖即可获得 Metrics 能力。 在应用启动后,将在 Dubbo QoS 的 metrics 命令下暴露相关的指标,本地可以通过 http://127.0.0.1:22222/metrics 获取。此外对于使用了 Spring Actuator 的用户,Dubbo 也将默认将这些数据暴露出来。

2.2 Tracing

在 Tracing 方面,我们还基于 Micrometer 实现了请求运行时的埋点跟踪。我们通过 Filter 拦截器原生方式来实现这一功能。我们支持将跟踪数据导出到一些主流实现,例如 Zipkin、Skywalking、Jaeger 等。这样就可以实现全链路跟踪数据的分析和可视化展示。

在这里插入图片描述

2.3 Logging

此外,对于 Logging 方面,Dubbo 从 3.1 版本开始引入了错误码机制,实现了 WARN、ERROR 级别日志的全覆盖。在异常场景下,支持快速索引官网解决文档。

03 Native Image 原生支持

在 Native Image 方面,Dubbo 从 3.2 开始将正式基于 GraalVM 完成对 Native Image 的支持,从 Dubbo3.0 开始,Dubbo 已经有一些 Native Image 支持的探索,但是易用性和支持程度都不太理想,从 3.2 版本开始,Dubbo 将会简化用户接入 Native Image 的使用方式。主要可以分为三个面:

  1. 编译插件配置升级:从最初的 native-image-maven-plugin 改为 dubbo-maven-plugin +native-maven-plugin,区分了 Graalvm 官方提供的 native image 配置与 Dubbo 所需的 native image 配置,简化了用户所需要关心的 native image 配置
  2. 旧版本中需要用户手动生成和补全 Dubbo 内独有的 Adaptive 代码,新版本用户将不需要关心这些细节。
  3. 旧版本中 Dubbo 框架生成的 META-INF.native-image 下的配置文件会直接生成在用户的工程目录中,3.2 新版本将会被编译到 target 下,不影响用户的工程结构。除此之外,Dubbo 框架也将不再采用手动补全 native image 的方式,而且采用自动探测和生成所需的配置文件的方式,简化了 Dubbo 开发者的体验。这也能够降低最后编译后的二进制包的大小和提高编译速度。

除了易用性提升以外,Dubbo 将在 3.2 版本将在 native image 场景下支持 API、注解以及 XML 配置方式,并支持与 SpringBoot3 中的 native 兼容。

04 其他

4.1 JDK 17 & Spring Boot 3 原生支持

JDK 17 是继 JDK 11 之后目前 Java 的最新 LTS 版本,包括许多新功能和改进,例如 Sealed 类、垃圾收集器的改进等等。

自从 JDK 16 开始限制 Java 内部类反射以后,Dubbo 的序列化以及动态代理都受到了一定的影响。在 Dubbo 3.2 中,我们通过 Fastjson2 以及 Javassist 的优化从底层解决了兼容性问题。目前 Dubbo 已经可以完美运行在 JDK17 之上,所有单元测试以及大多数集成测试也都在 JDK 17 平台上测试通过。

针对即将发布的 JDK 21 LTS,Dubbo 正在紧锣密鼓地进行适配。我们将在 3.3 版本中加入对 JDK 21 和 Dubbo 协程(Project Loom)的支持。

4.2 RPC 性能大幅提升

在 3.2 版本中,我们对 RPC 调用性能做了调优,其中优化内容如下。

  1. 消除了同步锁竞争以及会出现阻塞的代码
  2. 减少了用同步阻塞调用方式的请求响应延迟
  3. 减少了线程切换的次数
  4. 优化了 I/O 性能
  5. 支持在用户线程上序列化报文‘

3.2 对比 3.1 的性能提升如下:

  • Triple 协议:较小报文场景 createUser、existUser、getUser 下,提升率约在 40-45%,提升后的性能与 gRPC 同场景的性能基本持平。较大报文场景 listUser 下提升了约 17%,相较于同场景下的 gRPC 还低 11%。
  • Dubbo 协议:较小报文场景 createUser、getUser 下,提升率约 180%。极小报文 existUser(仅一个 boolean 值)下提升率约 24%,而较大报文 listUser 提升率最高,达到了 1000%!

在这里插入图片描述

在这里插入图片描述

如何升级到 Dubbo 3.2

5.1 Pom 升级最新的 Dubbo Maven 坐标为:

<dependency>        
    <groupId>org.apache.dubbo</groupId>        
    <artifactId>dubbo</artifactId>        
    <version>3.2.0</version>
</dependency>

5.2 兼容性

对于绝大多数的用户,升级到 Dubbo 3.2.0 是完全平滑的,仅需要修改依赖包版本即可。

1. 序列化校验逻辑的增强(重要)

如前文所述,在 Dubbo 3.2.0 版本中,Dubbo 将默认开启序列化白名单的强校验,以提升 Dubbo 的安全性,避免远程命令执行的问题。目前的机制通过包名递归机制自动信任了部分类,但对于一些使用了泛型等可能存在扫描不全的用户,我们建议您添加 -Ddubbo.application.serialize-check-status=WARN 配置。观察一段时间后(通过日志、QoS 命令),如果没有触发安全告警,则可以配置强校验模式。

关于自定义白名单的配置,可以参考官网的文档 / SDK 手册 / Java SDK / 高级特性和用法 / 提升安全性 / 类检查机制 一文进行配置。

2. 默认序列化的修改

Dubbo 3.2.0 版本开始默认序列化方式从 hessian2 切换为 fastjson2,对于升级到 3.2.0 的应用,Dubbo 会自动尝试采用 fastjson2 进行序列化。请注意,无论是客户端还是服务端,只要有一端还没有升级到 3.2.0,都将降级为 hessian2 序列化,保证兼容性。

3. 默认关闭推空保护

推空保护的目的是在注册中心出现故障并且主动推送空地址的时候,Dubbo 保留最后一批 provider 信息,以保证服务可用。但是,在大多数情况下,即使注册中心出现故障,也不会推送空地址,只有在一些特殊情况下才会出现。如果开启推空保护,则会对 Dubbo 的 Fallback 逻辑、心跳逻辑等造成较大的影响,给开发人员使用 Dubbo 带来困扰。

如果在生产环境中需要开启推空保护以实现高可用性,可以将 dubbo.application.enable-empty-protection 配置为 true。但是请注意,已知开启推空保护会导致服务端应用从仅支持接口级服务发现的 2.6.x、2.7.x 版本升级到 3.x 之后回滚到原来的版本时出现异常,极端情况下可能会导致服务调用失败。

06 总结

Dubbo 3.2 是一个非常重要的版本,它带来了众多新功能和改进,使得 Dubbo 更加强大和易用。我们非常感谢社区的支持和贡献,希望大家可以尽快体验 Dubbo 3.2,享受其中带来的便利和优势。

点击此处进入 Dubbo 官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs+vue 蛋糕甜品商城系统

根据蛋糕甜品商城系统的功能需求&#xff0c;进行系统设计。 系统功能&#xff1a;用户进入系统可以对首页、商品信息&#xff0c;公告信息&#xff0c;个人中心、购物车&#xff0c;客服中心等功能进行操作&#xff1b; 后台主要是管理员&#xff0c;管理员功能包括个人中心、…

大学生用什么蓝牙耳机好?2023好用的蓝牙耳机推荐

近几年&#xff0c;蓝牙耳机市场不断扩大&#xff0c;逐渐取代有线耳机成为最受人欢迎的数码产品之一。作为蓝牙耳机主要受众群的大学生&#xff0c;用什么蓝牙耳机比较好呢&#xff1f;下面&#xff0c;我来给大家推荐几款便宜好用的蓝牙耳机&#xff0c;一起来看看吧。 一、…

apple pencil必须要买吗?高性价比电容笔排行榜

可能很多人都觉得苹果的原装电容笔是无可替代的&#xff0c;但在我看来&#xff0c;这是要看我们的预算和需要了。如果你对绘画的要求不是很高&#xff0c;你可以选择平替电容笔&#xff0c;而并非Apple Pencil&#xff0c;因为它的价格非常昂贵。为了让大家对电容笔有更深的了…

KeePass搭建一个私人密码库

本文转载于我的博客KeePass搭建一个私人密码库 前言 {% note info no-icon %} 既然有人想看那我就不咕了嘻嘻 {% endnote %} 不知道在哪部电影里看到过这样一句话&#xff1a;根据社会工程学&#xff0c;正常人人脑是不会记住超过3种以上完全不同的复杂密码 所以你只要泄露一个…

智慧水务建设的发展与配电设计

摘要&#xff1a;目前以新技术应用带动水务信息化技术水平的全面提升&#xff0c;是水务发展的必然趋势&#xff0c;全国智慧水务正如火如荼建设中。智慧水务聚焦供水安全保障与水务精细化管理&#xff0c;本文通过各应用场景深入分析智慧水务建设价值&#xff0c;提出智慧水务…

Redis集群(caluster)

Redis集群(caluster) Redis集群是一个提供在多个Redis节点间共享数据的程序集 1. Redis集群的作用: Redis 集群是 Redis 的分布式实现&#xff0c;在设计中按重要性顺序具有以下目标&#xff1a; 高性能和线性可扩展性&#xff0c;多达 1000 个节点。没有代理&#xff0c;使…

Pyqt应用相关之PDF汇总案例说明

相信有不少小伙伴遇到了想要把多份pdf汇总到一起的问题&#xff0c;本期就带来用Pyqt界面制作的关于pdf汇总的教学流程。 def pdf_files_btn_click(self):files QFileDialog.getOpenFileNames(self, os.getcwd(), opentxt, PDF Files(*.pdf))file_list files[0]self.pdf_file…

2023年6月DAMA-CDGP数据治理专家认证请尽快报名啦!

目前6月DAMA-CDGP数据治理认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。 目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算参加6月考试的朋友们可以抓紧时间报名啦&#xff01;&#xff01;&#xff01; 5月初&#xff0c;…

(一)服务发现组件 Eureka

1、Eureka 简介 Eureka 是Spring Cloud Netflix 微服务套件中的一部分&#xff0c; 它基于Netflix Eureka 做了二次封装&#xff0c; 主要负责完成微服务架构中的服务治理功能。我们只需通过简单引入依赖和注解配置就能让Spring Boot 构建的微服务应用轻松地与Eureka 服务治理…

两百左右哪款蓝牙耳机好?两百左右高性价比蓝牙耳机推荐

现如今&#xff0c;蓝牙耳机无疑已经成为学生党外出的标配了。比起一些动辄上千的蓝牙耳机&#xff0c;两百左右的似乎更符合学生党的选择。接下来&#xff0c;我来给大家推荐几款两百左右高性价比的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱Lite2蓝牙耳机 参考价&…

Spring 循环依赖处理之三级缓存设计

一、思考 1、Spring是如何解决循环依赖问题的? 2、为什么要使用三级缓存?二级缓存能否解决问题? 3、提前暴露对象暴露的是什么? 4、主要源码 二、循环依赖 1、介绍 如上图&#xff0c;创建A之前需要先创建B,创建B之前需要先创建A,造成循环依赖。 由于A没创建完成&am…

C++:IO流

CIO流 C系统实现了一个庞大的类库&#xff0c;其中ios为基类&#xff0c;其他类都是直接或间接派生自ios类 注意&#xff1a; 1. cin为缓冲流。键盘输入的数据保存在缓冲区中&#xff0c;当要提取时&#xff0c;是从缓冲区中拿。如果一次输 入过多&#xff0c;会留在那儿慢慢…

今年SMETA审核费用即将涨价

【今年SMETA审核费用即将涨价】 SMETA全称&#xff08; Sedex Members Ethical Trade Audit &#xff09;&#xff0c;即Sedex会员社会道德贸易审核&#xff0c;它是Sedex发起的一种负责任的供应链审计方法/项目。 Sedex是一个全球性的责任商业平台&#xff0c;SMETA是审核方法…

大白话chatGPT GPT的发展区别

大白话chatGPT & GPT的发展区别 从GPT名字理解chatGPTchatGPT三步曲GPT-1到GPT-4GPT-1~GPT-4的相同点GPT-1~GPT-4的区别GPT-1——pre-training fine-tune&#xff0c;自监督学习无监督预训练有监督微调GPT-2——zero-shot&#xff0c;无监督学习&#xff0c;多任务学习GPT…

机器学习快速入门1(机器学习概念与数据预处理)

文章目录 1.机器学习介绍2 机器学习7大步骤3.数据预处理八大策略4 缺省值、异常值、重复值处理**rand、randn、randint区别**normal与randn缺失值处理判断缺失值删除缺失行填充缺失值 重复值处理异常值处理 5 抽样VS全量数据为什么需要抽样简单随机抽样等距抽样分层抽样整群抽样…

【PR 基础】轨道遮罩键、交叉溶解的简单使用

在上篇博客&#xff08;【PR 基础】裁剪工具的简单使用&#xff09;介绍了裁剪效果的使用&#xff0c;本篇博客在上篇的基础上继续添加 轨道遮罩键、交叉溶解的效果。 效果 步骤 1.可以先将恢复裁剪区域的关键帧删除 2. 接下来添加字幕&#xff0c;点击 新建-》旧版标题 点击…

Ceph入门到精通-Ceph 编排器简介

第 1 章 Ceph 编排器简介 作为存储管理员&#xff0c;您可以将 Ceph 编排器与 Cephadm 实用程序搭配使用&#xff0c;能够发现设备并在 Red Hat Ceph Storage 集群中创建服务。 1.1. 使用 Ceph Orchestrator Red Hat Ceph Storage Orchestrators 是经理模块&#xff0c;主要…

深入JVM了解Java对象实例化过程

文章目录 一、对象创建方式二、对象产生步骤1、判断对象是否已经加载、链接、初始化2、为对象分配内存空间3、处理并发问题3.1 TLAB 4、初始化零值5、完善对象内存布局的信息6、调用对象的实例化方法 <init>7、总结 三、对象的内存布局1、对象头1.1 运行时元数据&#xf…

大学生创业项目-校园外卖的创业优势在哪里?

在当今的外卖行业中&#xff0c;校园外卖已成为外卖行业的垂直分类领域。 与我们通常使用的美团、饿了么平台不同&#xff0c;校园外卖平台需要招聘校园学生和校园内外人员兼职作为校园骑手&#xff0c;完成“最后一公里”的外卖送餐方式。 对于平台运营商来说&#xff0c;配…

生成树协议三姐妹:STP、RSTP 和 MSTP,附思科和华为双厂商命令示例

在计算机网络中&#xff0c;为了保证网络拓扑结构的稳定性和可靠性&#xff0c;需要采用一些协议进行网络的管理和控制。其中&#xff0c;STP、RSTP 和 MSTP 是三种常用的网络管理协议。本文将分别介绍这三种协议&#xff0c;并且使用华为、思科两家厂商作为案例给出相应的命令…