升级dubbo3方案

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 initializationDubbo3 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升级案例

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分布式架构 漫谈分布式架构 初识分布式架构与意义 如何把应用从单机扩展到分布式 大型分布式架构演进过程 分布式架构设计 主流架构模型-SOA架构和微服务架构 领域驱动设计及业务驱动规划 分布式架构的基本理论CAP、BASE以及其应用 什么是分布式架构下的高可用设计 构架高性能的分布式架构 构建分布式架构最重要因素 CDN静态文件访问 分布式存储 分布式搜索引擎 应用发布与监控 应用容灾及机房规划 系统动态扩容 分布式架构策略-分而治之 从简到难,从网络通信探究分布式通信原理 基于消息方式的系统间通信 理解通信协议传输过程中的序列化和反序列化机制 基于框架的RPC通信技术 WebService/ApacheCXF RMI/Spring RMI Hession 传统RPC技术在大型分布式架构下面临的问题 分布式架构下的RPC解决方案 Zookeeper 分布式系统的基石 从0开始搭建3个节点额度zookeeper集群 深入分析Zookeeper在disconf配置中心的应用 基于Zookeeper Watcher 核心机制深入源码分析 Zookeeper集群升级、迁移 基于Zookeeper实现分布式服务器动态上下线感知 深入分析Zookeeper Zab协议及选举机制源码解读 Dubbo 使用Dubbo对单一应用服务化改造 Dubbo管理中心及及监控平台安装部署 Dubbo分布式服务模块划分(领域驱动) 基于Dubbo的分布式系统架构实战 Dubbo负载均衡策略分析 Dubbo服务调试之服务只订阅及服务只注册配置 Dubbo服务接口的设计原则(实战经验) Dubbo设计原理及源码分析 基于Dubbo构建大型分布式电商平台实战雏形 Dubbo容错机制及扩展性分析 分布式解决方案 分布式全局ID生成方案 session跨域共享及企业级单点登录解决方案实战 分布式事务解决方案实战 高并发下的服务降级、限流实战 基于分布式架构下分布式锁的解决方案实战 分布式架构实现分布式定时调度 分布式架构-中间件 分布式消息通信 消息中间件在分布式架构中的应用 ActiveMQ ActiveMQ高可用集群企业及部署方案 ActiveMQ P2P及PUB/SUB模式详解 ActiveMQ消息确认及重发策略 ActiveMQ基于Spring完成分布式消息队列实战 Kafka Kafka基于Zookeeper搭建高可用集群实战 kafka消息处理过程剖析 Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 RabbitMQ消息路由机制分析 RabbitMQ消息确认机制 Redis redis数据结构分析 Redis主从复制原理及无磁盘复制分析 Redis管道模式详解 Redis缓存与数据库一致性问题解决方案 基于redis实现分布式实战 图解Redis中的AOF和RDB持久化策略的原理 redis读写分离架构实践 redis哨兵架构及数据丢失问题分析 redis Cluster数据分布算法之Hash slot redis使用常见问题及性能优化思路 redis高可用及高并发实战 缓存击穿、缓存雪崩预防策略 Redis批量查询优化 Redis高性能集群之Twemproxy of Redis 数据存储 MongoDB NOSQL简介及MongoDB支持的数据类型分析 MongoDB可视化客户端及JavaApi实践 手写基于MongoDB的ORM框架 MongoDB企业级集解决方案 MongoDB聚合、索引及基本执行命令 MongoDB数据分片、转存及恢复策略 MyCat MySQL主从复制及读写分离实战 MySQL+keepalived实现双主高可用方案实践 MySQL高性能解决方案之分库分表 数据库中间件初始Mycat 基于Mycat实习MySQL数据库读写分离 基于Mycat实战之数据库切分策略剖析 Mycat全局表、Er表、分片预警分析 Nginx 基于OpenResty部署应用层Nginx以及Nginx+lua实战 Nginx反向代理服务器及负载均衡服务器配置实战 利用keepalived+Nginx实战Nginx高可用方案 基于Nginx实现访问控制、连接限制 Nginx动静分离实战 Nginx Location ReWrite 等语法配置及原理分析 Nginx提供https服务 基于Nginx+lua完成访问流量实时上报Kafka的实战 Netty 高性能NIO框架 IO 的基本概念、NIO、AIO、BIO深入分析 NIO的核心设计思想 Netty产生的背景及应用场景分析 基于Netty实现的高性能IM聊天 基于Netty实现Dubbo多协议通信支持 Netty无锁化串行设计及高并发处理机制 手写实现多协议RPC框架

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值