升级dubbo2.7.4.1版本平滑迁移到注册中心nacos

目录
  • 前言
  • 为什么升级到2.7.4.1?
  • 为什么迁移注册中心到nacos?
  • 两种升级方案
    • 方案一:魔改官方的starter组件
      • 注解兼容
      • 配置兼容
    • 方案二:直接使用官方的starter组件-最终采用的方案
      • 第一步:引入maven依赖
      • 第二步:改造相关的注解
      • 第三步:修改dubbo的配置
  • 平滑迁移到nacos注册中心
  • 结语

前言

dubbo是一款非常优秀的服务治理型RPC框架,dubbo的优秀在于,庞大的架构体系、精湛的模块设计、灵活的SPI设计、丰富的组件实现,博主做微服务技术选型考察dubbo时,非常惊叹在那个年代别人就已经能够产出如此优秀的项目,以至于后面每逢别人说想要学习架构设计时,我都会推荐他读读dubbo的代码,学习下dubbo的架构设计原则。常说dubbo不仅仅是一款RPC框架,是因为他的服务治理特性相对于RPC通讯来说更加的突出,这个特性让我在2017年选型的时候果断选择了他,那个时候dubbo官方还没产出spring boot starter,而我们的项目大部分完成了从spring mvc改造到spring boot项目。为了简化开发集成dubbo组件,我们基于dubbo2.5.6版本自研了一套spring-boot-dubbo-starter组件,并且自定义dubbo服务暴露和引入的注解, 自定义了dubbo的配置装载方式。当时没有专业的运维、搭建高可用zk也费资源,为了简单方便少维护一个组件、当时我们直接选了redis(阿里云高可用实例)作为dubbo的注册中心。以上就是我们这次升级dubbo的背景情况

为什么升级到2.7.4.1?

从2.5.6到2.7.x,中间修复非常多的bug,带来了非常多的新特性。

2.5.x版本不在作为一个保留维护的版本,目前主力维护的就2.6.x和2.7.x版本,还有探索版本3.0.也就是说即使2.5.x以后有问题了,官方也不会在修复了。

之所以选择2.7.4.1版本,是因为经过研究了官方issue和关注了dubbo群里的情况后,发现这个版本相对比较稳定,而且官方也推荐升级到这个版本。

为什么迁移注册中心到nacos?

目前redis注册中心虽然经过了趟坑之后《dubbo使用redis注册中心的系列问题》,趋于稳定了,但是因为太小众,使用的人太少导致很多问题并没有暴露出来(在升级的过程中又发现了一个redis注册中心的问题), 如果继续使用redis注册中心,将会一直处在不断自我趟坑的过程中无法自拔。

nacos是dubbo官方主推的注册中心项目,虽然现在还在迭代磨合,但是一旦发现问题官方反应还是比较及时的。使用nacos人越来越多,相当于趟坑的人也多了,隐藏的bug就无处可藏了。而且nacos和dubbo有天生的血缘关系, 查看nacos近期的release情况,发现有几个特意修复dubbo注册的问题

nacos自带了web管理控制台,可以非常方便的查询dubbo的注册情况,可以作为一个简易的dubbo治理中心来使用

两种升级方案

由于我们目前维护了自己的spring-boot-dubbo-starter,所以在做升级时,我们产生了两种不同的升级方案,并且都做了完整的验证。

方案一:魔改官方的starter组件

为了做到开发侧基本无感知升级到2.7.4.1版本,我们做了两件事情

注解兼容

在做注解兼容时也考虑过两个方案,一个是在自研的starter上做兼容dubbo2.7.4.1的处理,一个是在官方2.7.4.1的starter上兼容我们的处理。后面果断选择了后者,因为dubbo2.7.4.1版本对于我们来说是个黑盒子不知道有哪些改动,正向兼容难度比较大,反向兼容却要容易的多。 我们将原来自研组件里的自定义注解,保留包路径完整的拷贝到官方的starter项目中,然后将 ReferenceAnnotationBeanPostProcessor和ServiceAnnotationBeanPostProcessor从dubbo的spring模块中挪了出来,做了兼容自定义注解的处理。这个地方再次夸下 dubbo的设计,dubbo在捐赠给apache后,包名都改了,为了兼容老的alibaba包下的注解,服务暴露和服务引入都做了非常简易的注解兼容设计。 得益于此,我们在做自定义注解兼容处理时非常轻松就搞定了。

ReferenceAnnotationBeanPostProcessor的构造器传入自定义注解:

public ReferenceAnnotationBeanPostProcessor() {
        super(AutowiredDubbo.class, Reference.class, com.alibaba.dubbo.config.annotation.Reference.class);
    }

ServiceAnnotationBeanPostProcessor扫描时添加自定义注解支持

scanner.addIncludeFilter(new AnnotationTypeFilter(Service.class));
        /**
         * Add the compatibility for legacy Dubbo's @Service
         *
         * The issue : https://github.com/apache/dubbo/issues/4330
         * @since 2.7.3
         */
        scanner.addIncludeFilter(new AnnotationTypeFilter(com.alibaba.dubbo.config.annotation.Service.class));
        // 兼容@DubboService注解
        scanner.addIncludeFilter(new AnnotationTypeFilter(DubboService.class));

最后修改DubboAutoConfiguration中的服务暴露和服务引入处理器为我们魔改的实现即可

配置兼容

自研的自定义配置加载以spring.dubbo.打头的,而官方是以dubbo.打头的,区别如下:

自研的配置:
spring.dubbo.application.name = xxx
spring.dubbo.registry.address = xxx
spring.dubbo.protocol.port = -1
官方starter配置
dubbo.application.name = xxx
dubbo.registry.address = xxx
dubbo.protocol.port = -1

为了做到配置兼容,修改了dubbo starter配置加载逻辑,去掉了spring.打头,修改DubboUtils中的filterDubboProperties,如:

public static SortedMap filterDubboProperties(ConfigurableEnvironment environment) {
        SortedMap dubboProperties = new TreeMap<>();
        Map properties = EnvironmentUtils.extractProperties(environment);
        for (Map.Entry entry : properties.entrySet()) {
            String propertyName = entry.getKey();
            if (propertyName.startsWith(DUBBO_PREFIX + PROPERTY_NAME_SEPARATOR)
                    && entry.getValue() != null) {
                dubboProperties.put(propertyName, entry.getValue().toString());
            }
            if (propertyName.startsWith("spring." + DUBBO_PREFIX + PROPERTY_NAME_SEPARATOR)
                    && entry.getValue() != null) {
                propertyName = propertyName.substring(7);
                dubboProperties.put(propertyName, entry.getValue().toString());
            }
        }
        return Collections.unmodifiableSortedMap(dubboProperties);
    }

最后打包上传到私服,开发只需要升级下jar的版本,配置和代码都不用动就可以升级到2.7.4.1版本的dubbo,可能魔改的地方不止上面贴的这些代码,这里只是引出思路,这个方案到这里结束了,这个方案的优点是对开发比较透明 因为迁移到nacos的步骤是一样的,第二个方案会谈到

方案二:直接使用官方的starter组件-最终采用的方案

最终讨论下来,考虑到内部维护版本,当官方升级时联动升级会比较麻烦,不如,直接痛一次全线改造代码,改造配置,采用了官方的starter直接升级,这样,后面有版本升级不用在投入人力维护自研的和官方的一致。

第一步:引入maven依赖

官方dubbo starter依赖

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.4.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

第二步:改造相关的注解

启用dubbo时:@EnableDubbo 改成

@EnableDubbo【org.apache.dubbo.config.spring.context.annotation.EnableDubbo】

并建议添加scanBasePackages包路径,如:

@EnableDubbo(scanBasePackages = "cn.keking.service")。

提高dubbo暴露服务和引入服务时的扫描速度

服务暴露时:

@DubboService 改成 @Service 【org.apache.dubbo.config.annotation.Service】

服务引入时:

@AutowiredDubbo 改成 @Reference 【org.apache.dubbo.config.annotation.Reference】,

这里需要注意三点:

1、官方的starter默认的服务引入会校验服务是否存在,不存在就抛异常,会影响应用启动,可添加全局的配置,覆盖默认行为,配置如下:dubbo.consumer.check=false

2、自研starter中@AutowiredDubbo 的timeout等参数的单位为秒,官方注解@Reference的参数单位为毫秒,如以前配置为timeout=30, 则在官方starter中只有30毫秒的超时时间。

3、在使用多注册中心时,dubbo会从两个注册中心同时引入服务,虽然你的URL是完全一样的,也会在本地产生两个服务实例,所以,当你的容错模式为广播模式(cluster="Broadcast")或者并行模式(cluster="Forking")时就会产生消费者一次触发,生产者收到两次的问题。而默认的集群策略为 Failover,会正常的走随机负载的方式调用,不会有这种问题。如果有广播模式、或者并行模式的使用,可以通过设置nacos注册中心,只注册不消费。配置方式如下,等所以服务都迁移到nacos上后及时移除这个配置:

dubbo.registries.nacos.parameters.subscribe = false

第三步:修改dubbo的配置

去掉spring.前缀即可,注意,升级官方starter后,需要新增一个配置,用来设置redis的连接池大小,官方默认的8个,

dubbo.registries.redis.parameters.max.total = 200

下面示例了升级后的dubbo配置:

dubbo.application.name = xxx
dubbo.protocol.port = -1
dubbo.provider.timeout = 300000
dubbo.consumer.check = false
dubbo.registries.nacos.address = nacos://xxx:80
dubbo.registries.redis.address = redis://xxx:6379
dubbo.registries.redis.parameters.max.total = 200

平滑迁移到nacos注册中心

利用dubbo支持多注册中心的功能,分两个阶段完成平滑的从redis迁移到nacos,第一阶段,全线升级修改配置为双注册中心,第二阶段,摘掉redis注册中心完成过渡,配置方式如下:

dubbo.registries.nacos.address=nacos://xxx:80
dubbo.registries.redis.address=redis://xx:6379

注意一些问题

使用redis注册中心时,如果只有一个redis实例,区分环境是通过redis的db来控制的,比如如下配置:

dubbo.registry.parameters.db.index = 2

而nacos注册中心通过命名空间来区分的,具体配置如下:

dubbo.registry.parameters.namespace = xxxxxx

如果是多注册中心配置,注意使用相关注册中心前缀,比如:

dubbo.registries.nacos.parameters.namespace=adefa98f-f4d9-4af8-9eb3-e0cab5a39cc7

结语

dubbo升级的方案虽然简单,但是真正升级平滑过渡不是一蹴而就的,期间还是遇到了很多问题,这是一个不断优化稳定的过程。截止目前我们还没全线铺开上生产,只是个别应用推上生产做验证,升级有风险,需要小心又谨慎

以上就是升级dubbo2.7.4.1版本平滑迁移到注册中心nacos的详细内容,更多关于dubbo迁移到nacos的资料请关注我们其它相关文章!

(0)

相关推荐

  • dubbo服务注册到nacos的过程剖析

    目录 前言 简述过程 源码剖析具体实现 服务注册 服务订阅 结语 前言 前面聊到到了我们的dubbo服务从redis迁移到nacos注册中心,迁移后发现,会时不时的抛一个异常 ERROR com.alibaba.nacos.client.naming - [CLIENT-BEAT] failed to send beat:, 所以有了这个剖析过程,当然最后查明异常是我们的SLB网络映射问题,和nacos没有关系. dubbo版本:2.7.4.1 nacos client版本:1.0.0 naco

  • Springcloud-nacos实现配置和注册中心的方法

    最近,阿里开源的nacos比较火,可以和springcloud和dubbo共用,对dubbo升级到springcloud非常的方便.这里学习一下他的配置和注册中心.我主要记录一下它的使用方式和踩得坑. nacos简单介绍 Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. Nacos 帮助您更敏捷和容易地构建.交付和管理微服务平台. Nacos 是构建以"服务"为中心的现代应用架构 (例如

  • spring cloud alibaba Nacos 注册中心搭建过程详解

    这篇文章主要介绍了spring cloud alibaba Nacos 注册中心搭建过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 nacos下载地址 什么是 Nacos? nacos主要起到俩个作用一个是注册中心,另外一个是配置中心. 下面图 是nacos的功能结构图 运行环境 JDK 1.8+: Maven 3.2.x+: 下载 你可以通过源码和发行包两种方式来获取 Nacos. nacos发行包下载地址 选择版本解压 unzip

  • springboot与dubbo的版本匹配问题

    目录 springboot与dubbo的版本匹配 项目里原始版本 升级到2.6.7后错误日志 springboot+dubbo版本对应关系 背景 对应关系 springboot与dubbo的版本匹配 官方链接 参考: 项目里原始版本 springboot:2.1.6.RELEASE dubbo-spring-boot-starter : 0.2.1.RELEASE dubbo: 2.6.5 上面这么写是可以正常运行的.但是当把dubbo升级到2.6.7时候,却报错了,异常如下: 升级到2.6.7

  • dubbo的配置文件详解(推荐)

    一.dubbo常用配置 <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心. eg.<dubbo:service ref="demoService" interface="com.unj.dubbotest.provider.DemoService" /> <dubbo:reference/> 引用服务配置,用于创建一个远程服务代理,一个引用

  • 升级dubbo2.7.4.1版本平滑迁移到注册中心nacos

    目录 前言 为什么升级到2.7.4.1? 为什么迁移注册中心到nacos? 两种升级方案 方案一:魔改官方的starter组件 注解兼容 配置兼容 方案二:直接使用官方的starter组件-最终采用的方案 第一步:引入maven依赖 第二步:改造相关的注解 第三步:修改dubbo的配置 平滑迁移到nacos注册中心 结语 前言 dubbo是一款非常优秀的服务治理型RPC框架,dubbo的优秀在于,庞大的架构体系.精湛的模块设计.灵活的SPI设计.丰富的组件实现,博主做微服务技术选型考察dubbo

  • Nginx1.8.0版本平滑升级新版本1.9.7

    首先查看现在环境nginx的版本为1.8.0 编译的参数只指定了安装路径: 复制代码 代码如下: [root@localhost sbin]# ./nginx -V nginx version: nginx/1.8.0 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) configure arguments: --prefix=/usr/local/nginx 平滑升级步骤如下: 下载nginx1.9.7版本,解压并进入解压后的目录 复制代

  • 图文详解Nginx版本平滑升级方案

    目录 背景: Nginx平滑升级方案 回退步骤 总结 背景: 由于负载均衡测试服务器中nginx版本过低,存在安全漏洞,查询相关修复漏洞资料,需要采取nginx版本升级形式对漏洞进行修复. Nginx平滑升级方案 1.案例采用版本介绍 旧版本 nginx-1.12.2.tar.gz 新版本 nginx-1.20.1.tar.gz 2.nginx-1.12.2版本为当前运行版本 设置端口8080和对主页index.html进行修改,后续进行平滑升级后,依然可以对其访问. 3.解压新版本 nginx

  • 扔掉VPS面板!网站平滑迁移到LNMP或LAMP建站环境的方法图解

    对于刚刚用VPS建站的朋友来说,给VPS主机安装控制面板可以省掉Web环境配置的麻烦,同时又可以方便管理网站,例如绑定域名.FTP上传文件.数据备份等等.现在不少的VPS主机面板已经做得和虚拟主机面板差不多了,大大降低了VPS建站的门槛. 但是,部落发现在长期使用VPS主机控制面板后,越来越觉得VPS主机面板带来的麻烦.第一大问题就是VPS主机面板经常爆出各种漏洞,即便是官方及时修复也依然让人心有余悸,更何况是现在的VPS面板都是长期不更新的,出了问题也无法得到很好的解答. 第二大问题就是VPS

  • Docker版的MySQL5.7升级到MySQL8.0.13,数据迁移

    1.备份旧的MySQL5.7的数据 记得首先要备份旧的数据,防止升级失败导致数据丢失.备份的方式有两种,一种是在宿主机直接执行导出命令,另外一种是先进入Docker环境下进行操作.主要的导出命令如下: #方式一,直接在宿主机器进行数据备份 # 0df568 是docker的id ;-uroot -p123456 是用户名和密码;dbA dbB是要备份的数据,--databases 后面可以接多个数据库名,导出的sql到/root/all-databases3306.sql docker exec

  • ASP.NET 5升级后如何删除旧版本的DNX

    ASP.NET 5各种升级后旧版本的DNX不会删除,想删除旧版本的DNX,可以通过以下命令完成,在此之前先介绍一下DNX架构及运行原理 DNX是ASP.NET程序运行的核心,其遵循如下两个准则: DNX应该是自包含的,DNX在解析完应用程序依赖树以后才能知道要使用哪个Core CLR包,所以在得到解析树之前,DNX是无法加载任何CLR的,但Roslyn编译器除外. 依赖注入(Dependency Injection,简称DI)贯穿着整个系统栈,DI是DNX的一个核心部分,所有DNX上的类库都构建

  • 修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法

    之前把现有这台阿里CentOS7.2系统的Python2.7.5升级成Python3.6后,yum工具就不能不觉使用了.当时查了下说明python版本的问题,但是用网上的方法还是没解决,后面也就一直没管了.最近要弄一个Nodejs小程序,需要用yum安装一些开发工具,不得不修复这个问题. 1 yum工具报错情况 直接执行 yum 命令就会提示 /usr/bin/yum 文件第34行有错误: [root@typecodes ~]# yum File "/usr/bin/yum", lin

  • CentOS 7.9 升级内核 kernel-ml-5.6.14版本的方法

    一.CentOS 7.9 升级内核 kernel-ml-5.6.14版本 地址 http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS 默认内核版本为3.10.0,现升级到 5.6.14 版本 查看当前内核版本 [root@localhost ~]# uname -r 3.10.0-1160.53.1.el7.x86_64 wget 下载 wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/

  • PHP重要安全升级说明 推荐升级php 5.2.17版本

    以下文档发布于2011-3-22日 为了进一步提高PHP程序的安全问题,星外要求所有用户升级到PHP5.2.17以上版本,升级办法如下: (对于装了Zend的用户,您需要删除ZEND,删除zend时全部选默认就可以,升级PHP成功后您可以再一路默认装上ZEND.) 1.停止IIS,在控制面板,添加删除中删除PHP安装包 2.删除C:\windows\php.ini 3.下载最新版本PHP安装包.下载地址 http://www.jb51.net/softs/26087.html 4.安装最新版本P

  • Centos5.x下升级python到python2.7版本教程

    首先到官网下载python2.7.3版本,编译安装 复制代码 代码如下: $wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz $tar zxvf Python-2.7.3.tgz $cd Python-2.7.3 $./configure $make && make install 然后备份原来的python,并把python2.7做软连接到新的位置 复制代码 代码如下: $mv /usr/bin/python /us

随机推荐