dubbo2.7升级到dubbo3--dubbo2.7升级到dubbo3系列

news2024/10/4 19:26:08

最近在做老系统升级(springboot2+dubbo2.7.1+zookeeper+nacos-config),去掉zookeeper的注册中心,替换成nacos2.1版本(阿里云已经不支持1.X版本了)-对应的需要升级springboot和dubbo3。最终升级完成了,其中遇到的诸多问题,能记住多少就总结多少
有在升级过程中,遇到问题的小伙伴,欢迎交流。

升级原因

抛弃zookeeper做为注册中和es job中心
升级技术组件
使用阿里云微服务中心:nacos
阿里云微服务中心nacos不再支持1.X版本

技术体系

分布式体系
原技术体系:springboot+dubbo+nacos配置中心+zookeeper+redis+rocketmq+elastic-job+mysql
升级后体系:springboot+dubbo+nacos配置注册中心+redis+rocketmq+xxl-job+mysql

技术旧版本新版本
springboot2.1.1.release2.3.1.release
dubbo2.7.13.1.0
nacos 配置中心1.4.12.1.0
nacos 注册中心2.1.0
zk 注册中心3.5.5
elastic-job2.1.2
xxl-job2.3.1

资料网站

需要注意版本依赖
https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-autoconfigure/3.1.0
https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-config-spring/3.1.0
https://mvnrepository.com/artifact/com.alibaba.boot/nacos-config-spring-boot-starter/0.2.10
https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter/3.1.0
https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-nacos/3.1.0
nacos官网
https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-dubbo.html
dubbo官网和参数说明
https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/properties/#application

尝试dubbo小版本升级

尝试dubbo升到2.7.22,2.x版本的最新版本,查了下依赖,
在这里插入图片描述
最高支持到nacos-cliient 1.4.2,不符合咱们的2.1.0版本,怎么办?
那就排除掉1.4.2版本,增加2.1.0 nacos-client依赖
说下关键的点和问题

dubbo2.7.x的注册级别

目前dubbo往注册中心上注册的数据是接口级,而应用级服务发现是往注册中心上注册实例(ip+port),两者的区别只是注册的粒度不同。
至于为什么会出现应用级服务发现,有如下几点原因

与业界主流微服务模型对齐,比如 SpringCloud、Kubernetes Native Service 
等减少注册数据,提升性能

如果只是注册接口级别,其实很烦,一堆的接口,还是应用级别比较爽
怎么配置,网上找了多久资料,还看了看源码,最后在注册中心的注册数据中发现端倪
提供者

dubbo.registry.parameters.registry-type: service

消费者同样要配置,而且需要指定消费的服务者

说实话,放到parameters参数中真的是。。。。。

nacos配置中心–多出来很多的接口和应用级的配置信息

config、注册、metadata是2.7之后引入的“三大中心”,老版本都是缓存到本的用户和元数据,为什么新版本直接到config了??
网上查资料,说这么配置

dubbo.registry.use-as-config-center: false
dubbo.registry.use-as-metadata-center: false

启动后,第一个参数配置起作用了,第二个直接报错,

java.util.NoSuchElementException: null
	at java.util.HashMap$HashIterator.nextNode(HashMap.java:1447)
	at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
	at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
	at org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl.lambda$publishMetadata$0(RemoteMetadataServiceImpl.java:69)
	at java.util.concurrent.ConcurrentHashMap.forEach(ConcurrentHashMap.java:1597)
	at org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl.publishMetadata(RemoteMetadataServiceImpl.java:63)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.publishMetadataToRemote(DubboBootstrap.java:1211)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.doRegisterServiceInstance(DubboBootstrap.java:1193)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.registerServiceInstance(DubboBootstrap.java:1174)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.start(DubboBootstrap.java:894)
	at org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener.onContextRefreshedEvent(DubboBootstrapApplicationListener.java:70)
	at org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener.onApplicationContextEvent(DubboBootstrapApplicationListener.java:63)
	at com.alibaba.spring.context.OnceApplicationContextEventListener.onApplicationEvent(OnceApplicationContextEventListener.java:52)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:404)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:361)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:898)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:554)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
	at com.domes.base.support.BaseSupportApplication.main(BaseSupportApplication.java:13)

查了老半天源码,反正,就是得有元数据存储地方,尝试配置缓存到本地,参数没起作用
没办法,在nacos配置中心新增一个命名空间,专门做元数据存储,

dubbo.metadata-report.address: nacos://ip:8848
dubbo.metadata-report.parameters.namespace: 211d0b5e-2267-4309-9df8-xxxxxxx4

反正能起来也能跑,就是还有一些小的问题,就不一一说了,
如果有兴趣的同学可以一起交流
果断放弃了,毕竟老项目升级,搞稳妥一些,找一个支持nacos2.1的dubbo版本,最后选了dubbo3.1.0

最后的dubbo3.1.0

查了dubbo3.1.0的一些相关的资料,是一个很大的版本升级,使用Triple协议,支持云原生,据说,性能提升很明显,等有时间研究下

中间过程先省略。。。
pom.xml配置

<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>

		<dubbo.version>3.1.0</dubbo.version>
		<spring-boot.version>2.3.1.RELEASE</spring-boot.version>
	</properties>

<dependency>
			<groupId>com.alibaba.boot</groupId>
			<artifactId>nacos-config-spring-boot-starter</artifactId>
			<version>0.2.10</version>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.alibaba.nacos</groupId>
					<artifactId>nacos-client</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<!-- Dubbo Spring Boot Starter -->
		<dependency>
			<groupId>org.apache.dubbo</groupId>
			<artifactId>dubbo-spring-boot-starter</artifactId>
			<version>${dubbo.version}</version>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-autoconfigure</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.apache.dubbo</groupId>
			<artifactId>dubbo-registry-nacos</artifactId>
			<version>${dubbo.version}</version>
		</dependency>

		<dependency>
			<groupId>com.alibaba.spring</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>1.0.11</version>
		</dependency>

application.yaml配置

spring:
  application:
    name: xx-xxx-xxx-support
  # 允许bean重写,因为重写了事物
  main:
    allow-bean-definition-overriding: true

nacos:
  config:
    server-addr: ip:8848
    namespace: 2c047fc5-bcf4-47eb-a9ce-fxxxxxxx4
    bootstrap:
      enable: true
    type: yaml
    data-id: xx-xxx-xxx-support
    auto-refresh: true

nacos配置中心—dubbo部分

dubbo.registry.address: nacos://ip:8848
dubbo.registry.register-mode: instance
dubbo.registry.parameters.namespace: 2c047fc5-bcf4-47eb-a9ce-xxx
dubbo.scan.base-packages: com.xxx.dubbo
dubbo.metadata-report.address: nacos://ip:8848
dubbo.metadata-report.parameters.namespace: 211d0b5e-2267-4309-9df8-xxx
dubbo.protocol.name: dubbo
dubbo.protocol.port: -1
dubbo.protocol.payload: 41943040
dubbo.consumer.check: false
dubbo.consumer.timeout: 6000

SpringBootApplication 启动类去掉NacosPropertySource
去掉dubbo自动配置加载类,使用默认的配置加载

增加nacos dubbo 应用名


import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

/**
 * @author weidong
 * @date 20230429
 * @description nacos消费应用名称配置
 */
@Configuration
public class ProjectNameConfig implements EnvironmentAware {

    @Value("${spring.application.name}")
    private  String applicationName;

    @Override
    public void setEnvironment(Environment environment) {
        if(StringUtils.isBlank(System.getProperty("project.name"))){
            System.setProperty("project.name",applicationName);
        }
    }
}

结束

效果
在这里插入图片描述

订阅者
在这里插入图片描述

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

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

相关文章

Unity VFX -- (1)概览

视觉特效&#xff08;Visual Effects&#xff0c;VFX&#xff09;在实时3D项目中能够带来惊艳的效果&#xff0c;其范围很广&#xff0c;比如水花四溅、迷雾、火焰、爆炸效果等。 如果没有VFX&#xff0c;整个环境会让人感到非常呆板无聊。这些特效会让环境生动起来&#xff0c…

nodejs微服务:RPC与GRPC框架

RPC RPC(Remote Procedure Call Protocol)&#xff0c;是远程过程调用的缩写通俗的说就是调用远处的一个函数&#xff0c;与之相对应的是本地函数调用 本地函数调用&#xff1a;参数&#xff0c;返回值&#xff0c;代码段都在本地的一个进程空间内远程函数调用&#xff1a;远程…

【pan-sharpening 攻击:目标检测】

Adversarial pan-sharpening attacks for object detection in remote sensing &#xff08;对抗性泛锐化攻击在遥感目标检测中的应用&#xff09; 全色锐化是遥感系统中最常用的技术之一&#xff0c;其目的是将纹理丰富的PAN图像和多光谱MS图像融合&#xff0c;以获得纹理丰…

docker上面安装mysql

一、docker安装mysql 新建配置 /data/mysql3306/conf/my.cnf(新建logs,data,conf/my.cnf 后面要用) 详情&#xff1a; [mysql] #设置mysql客户端默认字符集 default-character-setUTF8MB4[mysqld] #设置3306端口 port3306#允许最大连接数 max_connections200#允许连接失败的次…

Spring事务(3)-TransactionInterceptor实际事务执行

Spring事务&#xff08;2&#xff09;-EnableTransactionManagement实现源码解析 中介绍了Spring事务开启和代理的实现&#xff0c;现在了解实际事务执行TransactionInterceptor。 TransactionInterceptor TransactionInterceptor类图 MethodInterceptor&#xff1a;AOP代理后…

vue 高德地图设置鼠标样式

高德地图JS API 2.0 设置鼠标样式在线示例 首先&#xff0c;在 index.html 中引入图标&#xff1a; <link rel"stylesheet" href"https://at.alicdn.com/t/font_873139_0v65kqy674.css" >封装工具文件 utils/map.js &#xff1a; export default …

itop-3568开发板驱动学习笔记(9)高级字符设备(三)信号驱动 IO

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录应用层信号机制应用层开启异步通知驱动层异步通知接口实验代码信号驱动 IO 不需要像 poll 一样查询设备的状态&#xff0c;一旦设备有目标事件发生&#xff0c;就会触发 SIGIO 信号&#xff0c;然后处理信号…

网卡的 Ring Buffer 详解

1. 网卡处理数据包流程 网卡处理网络数据流程图&#xff1a; 图片来自参考链接1 上图中虚线步骤的解释&#xff1a; 1 DMA 将 NIC 接收的数据包逐个写入 sk_buff &#xff0c;一个数据包可能占用多个 sk_buff , sk_buff 读写顺序遵循FIFO&#xff08;先入先出&#xff09;原…

Redis(四)事务 multi、exec

哈喽&#xff0c;大家好&#xff0c;我是有勇气的牛排&#xff08;全网同名&#xff09;&#x1f42e;&#x1f42e;&#x1f42e; 有问题的小伙伴欢迎在文末评论&#xff0c;点赞、收藏是对我最大的支持&#xff01;&#xff01;&#xff01;。 文章目录1 前言1.1 什么是Redi…

从零开始的Web渗透:信息收集步骤详解

一、域名信息收集 1.获取域名的whois信息是、 什么是Whois Whois是一种传输协议&#xff0c;用于查询域名注册所有者等信息。它可以帮助您查询域名是否已被注册&#xff0c;以及获取有关已注册域名的详细信息&#xff0c;例如域名注册商和域名所有人。 早期的Whois查询通常…

Docker 部署Jira8.1.0

Jira与Confluence一样&#xff0c;都需要用到独立的数据库&#xff0c;对于数据库的安装我们不做介绍&#xff0c;主要介绍如何用Docker部署Jira以及对Jira进行破解的操作。 1、数据库准备 关于数据库官方文档说明&#xff1a;https://confluence.atlassian.com/adminjiraserv…

【Spring6】| Spring对事务的支持

目录 一&#xff1a;Spring对事务的支持 1. 事务概述 2. 引入事务场景 3. Spring对事务的支持 3.1 Spring实现事务的两种方式 3.2 Spring事务管理API 3.3 声明式事务之注解实现方式 3.4 事务属性 3.5 事务传播行为propagation 3.6 事务的隔离级别isolation 3.7 事务…

【Android安全】Soot 静态分析教程

参考教程 https://github.com/noidsirius/SootTutorial Windows Soot 环境配置 下载代码 git 拷贝仓库 git init git clone https://github.com/noidsirius/SootTutorial.git ./gradlew.bat build 报错&#xff1a;Unsupported class file major version 57 ./gradlew.b…

JDK定时/延迟任务实现原理

刚刚好点进去看了,做个笔记 先读 这样子的延迟任务代码很常见,在保持心跳、延迟确认等等场景 从源码的角度看他是怎么实现的 Testpublic void delayTest() throws InterruptedException {Executors.newScheduledThreadPool(1).schedule(() -> {System.out.println("一…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的拉普拉斯算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的拉普拉斯算法增强&#xff08;C#&#xff09;Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回调…

数学与应用数学有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是数学与应用数学领域的几个知名SCI期刊&#xff1a; Annals of Mathematics&#xff1a; 成立于1884年&#xff0c;是数学领域最古老和最著名的期刊之一&#xff0c;由普林斯顿大学出版。 该期刊发表了许多重要的数学成果&#xff0c;如Gdel不完全定理、费马大定理证明…

景点VR全景虚拟体验系统定制

为深度挖掘行业特色&#xff0c;利用5G、VR&#xff0c;AI&#xff0c;AR等数字化技术&#xff0c;为行业领域量身打造数字化解决方案已成趋势 VR内容定制可包括: VR旅游、VR展馆、VR教育、VR汽车、VR电商、VR地产等等。我们是国内较早从事沉浸式VR内容开发的企业&#xff0c;在…

Python将Excel文件内容写入Word文件

在日常办公中我们经常需要将Excel文件中的数据写入Word中&#xff0c;如果是手动一个一个进行复制粘贴&#xff0c;那将会非常的耗时且繁琐&#xff01; 遇到这种问题我们首先想到就是利用b编程解决&#xff0c;今天我分享一个excel转word的小方法&#xff01; 首先我有一个E…

儿童乙肝的预防和治疗,看这一篇就够了

儿童乙肝治疗应早期进行从1967年发现乙型肝炎&#xff08;以下简称乙型肝炎&#xff09;病毒&#xff0c;1969年开发乙型肝炎疫苗&#xff0c;到乙型肝炎治疗药物不断出现&#xff0c;乙型肝炎的防治取得了显著成效。目前&#xff0c;乙型肝炎的预防已经取得了积极的效果。儿童…

配置FTP/TFTP协议的ASPF

在多通道协议和NAT的应用中&#xff0c;ASPF是重要的辅助功能。通过配置ASPF功能&#xff0c;实现内网正常对外提供FTP和TFTP服务&#xff0c;同时还可避免内网用户在访问外网Web服务器时下载危险控件。 组网需求 如图1所示&#xff0c;FW部署在某公司的出口&#xff0c;公司提…