升级dubbo3方案

news2024/11/28 20:48:20

dubbo3 新特性

1. Dubbo3 应用级服务发现设计

  1. 显著降低服务发现过程的资源消耗,包括提升注册中心容量上限、降低消费端地址解析资源占用等,使得 Dubbo3 框架能够支持更大规模集群的服务治理,实现无限水平扩容。
  2. 适配底层基础设施服务发现模型,如 Kubernetes、Service Mesh 等。
    官网纤细介绍: https://cn.dubbo.apache.org/zh-cn/overview/reference/proposals/service-discovery/

2. 彻底解决递归初始化问题

dubbo2.x 每次ReferenceBean初始化完成后都执行ReferenceBean#prepareDubboConfigBeans
在Dubbo3.0中有一个关于这块内容的优化,主要是为了修复功能缺陷,而不是为了解决性问题,这个性能问题其实也只有在ReferenceBean数量足够多的时候才会出现。但按照这个思路,应该是可以顺便解决性能问题的。 Improve dubbo config beans and bootstrap initialization、Dubbo3 Spring相关优化

3. 全新通信协议Triple

全新通信协议Triple 让跨语言RPC迈了一大步,支持点对点调用、stream 流式调用。写proto IDL 文件可生成各类客户端代码,完全兼容grpc

dubbo3 变更内容

1. 默认使用fastjson2序列化

dubbo2.x 默认使用的是hessian2序列化方式, dubbo3.2 中默认使用的是fastjson2序列化,
原因:可能是认为fastjson2性能比较高,

官方序列化协议变更方案: 序列化协议升级

2. Protostuff序列化的maven坐标变更

Protostuff序列化的maven坐标变更, 放在了单独的github 仓库,
https://github.com/apache/dubbo-spi-extensions/tree/master/dubbo-serialization-extensions

<dependency>
    <groupId>org.apache.dubbo.extensions</groupId>
    <artifactId>dubbo-serialization-protostuff</artifactId>
    <version>1.0.1</version>
</dependency>

3. Nacos Group 对齐(应用级服务发现)

  1. 在 Dubbo 2.7.x 中,配置在 Nacos Registry URL 上的 group 值是对齐 Nacos 注册中心中的 group 分组的。(group 可以当成类似 namespace 的软隔离)
  2. 在 Dubbo 3.0.x 中,配置在 Nacos Registry URL 上的 group 默认不使用,全部使用 DEFAULT_GROUP。(group 不再提供隔离功能)
  3. 在 Dubbo 3.1.x 中,配置在 Nacos Registry URL 上的 group 值将会重新对齐 Nacos 注册中心中的 group 分组的。
  4. 注意事项:
    1. 请检查注册中心 URL 上是否已经配置了 group 属性,如果是的话需要检查服务端和消费端的 group 是否都一致,如果不一致请修改为一致
    2. 如果不希望 group 重新对齐到 Nacos 注册中心中的 group 分组,可以配置dubbo.nacos-service-discovery.use-default-group=false 全局属性值忽略该功能

4. 序列化检查模式(重要!!!)

在 Dubbo 3.2.0 版本中,Dubbo 将默认开启序列化白名单的强校验,以提升 Dubbo 的安全性,避免远程命令执行的问题。 对于一些使用了泛型等可能存在扫描不全或者是服务规模较大的用户,
建议添加 -Ddubbo.application.serialize-check-status=WARN 配置。 观察一段时间后(通过日志、QoS 命令),如果没有触发安全告警,则可以配置强校验模式。
关于自定义白名单的配置,可以参考官网的dubbo类检查机制

Q1:为什么要开启序列化白名单的强校验?

由于 Java 本身机制的问题,Dubbo 支持的非 IDL 序列化天然允许访问任意类,这将可能导致远程命令执行(RCE)风险。

Q2:升级到 3.2 的最佳实践是什么?

建议所有用户在升级 Dubbo 3.2.0 版本前添加 -Ddubbo.application.serialize-check-status=WARN 配置以保证最佳的兼容性。否则可能导致线上数据异常的情况!

5. 默认关闭推空保护

Dubbo 3.2.0 版本开始默认关闭推空保护,即使注册中心推送空地址,Dubbo 也将不会保留最后一批 provider 信息。 如果需要开启推空保护,可以配置 dubbo.application.enable-empty-protection=true

Q1:关闭推空保护对我有什么影响?

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

Q2:我想开启推空保护,怎么办?

如果在生产上为了高可用,需要开启推空保护,可以配置 dubbo.application.enable-empty-protection=true。 目前已知开启推空保护会导致服务端应用从 2.6.x、2.7.x 等仅支持接口级服务发现的版本升级到 3.x 之后回滚到原来版本出现异常,极端场景下会导致服务调用失败。 此外,开启推空保护后在服务端地址真的为空的时候出现较多的心跳异常、日志异常等。

升级步骤

如果使用 Nacos 作为注册中心,由于 Nacos 特性支持的原因,在升级到 Dubbo 3.x 之前需要将 Nacos Server 升级到 2.x(参考文档https://nacos.io/zh-cn/docs/v2/upgrading/2.0.0-upgrading.html
),然后再将应用的 Nacos Client 也对应升级。如果使用 Zookeeper 注册中心则不需要处理。

1. 升级jar依赖

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>3.2.4</version>
    <exclusions>
        <exclusion>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>3.2.4</version>
</dependency>

2. 服务端配置

dubbo.application.register-mode 服务端提供者服务的注册模式 可选值有

  • instance 只注册实例应用级
  • all 接口级+应用级均注册
  • interface 只注册接口级
    升级到3.x之后在不修改配置的情况下默认是all配置 开启接口级+应用级注册

3. 消费端/客户端

服务有注册模式 那么消费端肯定也有服务订阅发现模式设置
dubbo.application.service-discovery.migration 消费端订阅模式可选值有

  • APPLICATION_FIRST 双订阅 即接口模式/应用级模式 智能决策 一般用于2.7.x与3.x 升级中 共存阶段 也是3.x版本默认的订阅模式, 运行时根据阈值和灰度流量比例动态决定调用流量走向
  • FORCE_APPLICATION 仅应用级订阅模式
  • FORCE_INTERFACE 仅接口级订阅模式
    关于兼容这一步如果项目升级的时候没有用户使用 不做兼容性升级也没问题,这里主要是介绍保障逐步把2.7.x版本升级到3.x 而不是全部停机后重新部署。
    对于双订阅的场景,消费端虽然可同时持有 2.x 地址与 3.x 地址,但选址过程中两份地址是完全隔离的:要么用 2.x 地址,要么用 3.x 地址,不存在两份地址混合调用的情况,应用级服务发现地址迁移规则说明。

大概操作流程如下

  1. 把部分Provider替换为3.x 服务端注册模式为all, 即应用级+接口级,这样2.7.x消费端也能够根据接口服务发现
  2. 把部分Consumer替换为3.x 消费订阅模式为FORCE_INTERFACE只订阅接口模式, 不采用官网推荐的APPLICATION_FIRST混合模式原因是: 混合模式可能出现流量偏移
  3. 少量灰度部署, 验证Dubbo高低版本调用是否正常。没啥问题的话就可以逐步全部切换到3.x版本
  4. 重点: 到了这一步说明当前所有实例均为3.x版本,下次再更新的时候就把消费端订阅模式设置为 FORCE_APPLICATION
  5. 消费端全部设置重启后, 再把服务端注册模式设置为instance ,就完美切换到3.x版本 并且是应用级服务发现。

需要元数据中心支持

dubbo3为了做到应用级别发现, 对dubbo 接口和应用名通过元数据中心作了映射
在这里插入图片描述

潜在风险

  1. 在dubbo2和dubbo3共存期间, 注册的元数据信息会增长, 双注册带来的资源消耗
    双注册不可避免的会带来额外的注册中心存储压力,但考虑到应用级地址发现模型的数据量在存储方面的极大优势,即使对于一些超大规模集群的用户而言,新增的数据量也并不会带来存储问题。总体来说,对于一个普通集群而言,数据增长可控制在之前数据总量的 1/100 ~ 1/1000
    以一个中等规模的集群实例来说: 2000 实例、50个应用(500 个 Dubbo 接口,平均每个应用 10 个接口)。
    假设每个接口级 URL 地址平均大小为 5kb,每个应用级 URL 平均大小为 0.5kb

    • 老的接口级地址量:2000 * 500 * 5kb ≈ 4.8G
    • 新的应用级地址量:2000 * 50 * 0.5kb ≈ 48M
      双注册后仅仅增加了 48M 的数据量。
  2. 在跨版本升级的过程中,存在的风险点从大到小分别有:直接修改 Dubbo 源码 -> 基于 Dubbo SPI 扩展点进行扩展 -> 基于 API 或者 Spring 的使用方式

  3. dubbo 2.7中也有应用级别服务发现, 要先关闭

  4. 对于 SPI 扩展的,除了应用级服务方向和 EventDispatcher 两个机制在 3.x 中做了破坏性的修改,在 2.7.x 中提供的绝大多数的扩展在 3.x 中也都提供。此部分需要关注的有两个方面:

    • 事件总线:出于事件管理的复杂度原因,EventDispatcher 和 EventListener 在 Dubbo 3.x 的支持已经删除。如果有对应扩展机制的使用请考虑重构为对应 Dubbo 功能的扩展。
    • 应用级服务发现:Dubbo 2.7 中的应用级服务发现的整体机制在 Dubbo 3.x 中已经被完整重构,功能的性能与稳定性有了很大程度上的提高。因此我们建议您不要使用 Dubbo 2.7 中的应用级服务发现机制,如果有对应的扩展可以在升级到 Dubbo 3.x 之后基于新的代码重新验证实现(绝大多数应用级服务发现的 API 是向前兼容的)。
  5. dubbo服务的URL不再注册
    使用dubbo3的注册方式后, 不存在dubbo服务的URL, 而是通过点对点拉取
    在这里插入图片描述

  6. dubbo3 consumer列表不存在, 不方便观察, 可能需要打开元数据中心
    在这里插入图片描述

升级观测指标

在发布的过程中,有以下几个维度的指标可以判断升级是否出现问题。

  • 机器的 CPU、内存使用情况
  • 接口请求成功率
  • 接口请求 RT
  • 日志的报错信息
  • 自定义扩展行为是否符合预期

参考文档:

官网文档 dubbo 2.x 升级至 3.x

相关链接

dubbo3升级案例

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

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

相关文章

【VScode/VS】解决头文件路径问题

vs 中明明包含了头文件所在路径&#xff0c;但是却找不到头文件 首先&#xff0c;将要添加的压缩包解压&#xff0c;放在任意一个盘里&#xff0c;注意&#xff0c;我们在代码里要添加的头文件路径是 #include <tensorflow/c/c_api.h> 接下来我们要添加在VS中的所有路径…

CHI协议保序之trans order保序

一致性系统中&#xff0c;使用三种保序方式&#xff1b; Transaction ordering □ 除了 comp response 来规定 RN 发出的 requeset 的执行顺序之外&#xff0c;还有一种 order 机制来定义RN<->HN,HN<->SN 之间&#xff0c;命令执行的顺序&#xff1a; □ 该机制通…

C语言编程---案例练习

文章目录 格式化输出 格式化输出 %d&#xff0c;输出整数&#xff1b; %f&#xff0c;输出浮点数&#xff1b;%.3f 保留三位小数&#xff1b; %e&#xff0c;输出双精度浮点数&#xff1b; %c&#xff0c;输出单个字符&#xff1b;将字符格式化%d&#xff0c;即转ASCII码&…

解决JMeter+Grafana+influxdb 配置出现transaction无数据情形

问题描述 JMeterGrafanainfluxdb 配置时&#xff0c;Darren洋发现jmeter中明明已经配置好了事务条件以及接口实例信息&#xff0c;但就是在grafana的头部导航栏中的transaction按钮下来没有相应事务数据信息&#xff0c;经过相关资料查询&#xff0c;Darren洋发现执行以下两个步…

EAP系统如何助力光伏制造行业实现数据采集和控制的自动化?

光伏制造行业作为清洁能源领域的重要组成部分&#xff0c;随着市场的扩大和技术的进步&#xff0c;对生产效率、产品质量和成本控制的要求也越来越高。在这个竞争激烈的行业中&#xff0c;企业需要寻求自动化解决方案来提高生产效率和降低人工成本。 图.光伏面板生产&#xff0…

155.最小栈-C++

题目来源&#xff1a;力扣 题目描述&#xff1a; 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部…

数据库redis作业

数据库redis作业 redis9种数据类型的基本操作 redis持久化&#xff1a;分别启用rdb和aof&#xff0c;并查看是否有对应文件生成 作业1&#xff1a;redis9种数据类型的基本操作 1、key操作 key * #查询所有的key keys *exists 参数 #参数&#xff1a;key #判断该key是否存…

网络安全防御篇之安全问题及防火墙简介

网络安全常识及术语 网络的脆弱性 什么样的网络是安全的

20230723将红米redmi note 5 pro由默认的12小时显示修改为24小时显示

20230723将红米redmi note 5 pro由默认的12小时显示修改为24小时显示 2023/7/23 18:51 redmi note 5 pro 24小时 显示 https://jingyan.baidu.com/article/95c9d20dae4c42ad4e7561e7.html 红米手机24小时制怎么设置 播报文章 原创|浏览&#xff1a;169|更新&#xff1a;2021-02…

【网络】应用层——协议定制 | 序列化和反序列化 | 初识http

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 在前面本喵已经带大家见识过了scoket网络通信的样子&#xff0c;现在开始深入学习网络的原理&#xff…

华为OD机试真题 Java 实现【经典屏保】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、补充说明四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、再输入4、再输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&…

【微信小程序】使用iView组件库的ActionSheet组件实现底部选择功能

效果1 效果2 要在微信小程序中使用iView组件库的ActionSheet组件&#xff0c;可以按照以下步骤进行&#xff1a; 首先&#xff0c;确保已经引入了iView组件库的样式和脚本文件。可以在app.wxss中引入iView的样式文件&#xff1a; import "/path/to/iview/weapp/dist/sty…

RocketMQ深入分析

RocketMQ深入分析 1. 消息存储 目前的MQ中间件从存储模型来&#xff0c;分为需要持久化和不需要持久化的两种模型&#xff0c;现在大多数的是支持持久化存储的&#xff0c;比如ActiveMQ、RabbitMQ、Kafka、RocketMQ&#xff0c;ZeroMQ却不需要支持持久化存储而业务系统也大多…

Upgrading kubeadm clusters from v1.27.3 to v1.27.4

文章目录 1. Before you begin2. Notes3. Master3.1 Login into the first node and upgrade the kubeadm tool only3.2 Verify the upgrade plan3.3 Drain the control plane node3.4 kubeadm upgrade3.5 Uncordon the control plane node3.6 Upgrade kubelet and kubectl3.7 …

蓝桥杯专题-真题版含答案-【饮料换购】【方格填数】【四平方和】【垒骰子_递归】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

算法之图论

定义 图通常以一个二元组 G<V, E>表示&#xff0c;V表示节点集&#xff0c;E表示边集。节点集中元素的个数&#xff0c;称为图的阶。 若图G中的每条边都是没有方向的&#xff0c;称为无向图&#xff1b;每条边是由两个节点组成的无序对&#xff0c;例如节点V1和节点V2之…

3、C# 方法构成

上一节,我们讲述了程序的基本构成。由大到小分别为”解决方案-->项目-->类-->方法“。 这一节,我们讲讲方法。 方法可以说是程序的基本构成单位。假如把方法抽象成点的话,我们可以认为程序是一个树状的结构。树根,就是我们的起点方法,也叫主方法。这一点,基本…

用户登录案例练习(flask+微信小程序)

目录 flask 微信小程序 flask 1.项目后端步骤 具体步骤可参考flask官网&#xff1a;flask 中文网 &#xff08;1&#xff09;创建虚拟环境 &#xff08;2&#xff09;激活虚拟环境 &#xff08;3&#xff09;在虚拟环境里边安装Flask &#xff08;4&#xff09; 粘贴官…

达闼面试(部分)(未完全解析)

grpc怎么解决负载均衡问题? Answer by newBing : gRPC提供了多种负载均衡策略&#xff0c;包括轮询、随机、最少连接数等。gRPC客户端可以使用这些策略来选择要连接的服务器。 k8s环境下部署grpc的几种方案 : 在k8s环境中&#xff0c;可以选择headless service&#xff0c;或者…

Leetcode 动态规划详解

动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种解决多阶段决策过程最优化问题的数学方法。动态规划的特点是将原问题分解成多个子问题进行求解&#xff0c;每个子问题只求解一次&#xff0c;并将其结果保存下来&#xff0c;避免重复计算。然后通过组合子问题的…