利用FatJar彻底解决Jar包冲突(三)

利用FatJar彻底解决Jar包冲突

  • Spring 容器的加载与隔离
    • ⽀持注解
    • 配置⽂件定位与容器初始化
    • 嵌套Spring容器的加载
  • 隔离优化
  • EagleEye traceId不⼀致问题
    • 原因
    • 解决

Spring 容器的加载与隔离

⽀持注解

这个⽐较容易,主要是我们之前的应⽤不⽀持⼆⽅包内部的注解,现在在隔离的情况下通过配置⽂件设置component-scan 来⽀持@Resource,@PostConstruct,@Component 注解。
在这里插入图片描述
在这里插入图片描述

配置⽂件定位与容器初始化

由于FatJarClassLoader为我们所有,因此使⽤ClassPathXmlApplicationContext通过classpath的⽅式定位配置⽂件最⽅便。 由于隔离,我们需要使⽤⼆⽅包中Spring的 来初始化容器,通过反射调⽤:
在这里插入图片描述
如果直接从构造函数中传⼊xml路径会提示⽂件找不到,通过debug和分析,唯⼀的原因就是在定位classpath的时候使⽤的 不是FatJarClassLoader,接下来⼀步步分析相关源码。
定位最初传⼊(创建)classloader的位置在DefaultResourceClassloader类:
在这里插入图片描述
getClassloader⽅法返回的是该类的属性,在构造函数中初始化:
在这里插入图片描述
初始化时调⽤ClassUtils的getDefaultClassLoader⽅法:
在这里插入图片描述
同时DefaultResourceLoader也提供了setClassloader⽅法设置属性:
在这里插入图片描述
⽽ClassPathXmlApplicationContext是继承⾃DefaultResourceLoader,⼤致加载类图如下:
在这里插入图片描述
现在就是要找可以hack的地⽅了,即在定位配置⽂件前设置classloader,如果直接使⽤带参的构造函数,调⽤的⽅法如下:
在这里插入图片描述
所以可以使⽤⽆参的构造函数创建实例之后设置classloader,设置配置⽂件位置,最后refresh:
在这里插入图片描述

嵌套Spring容器的加载

在迁移某个二方包业务时,发现它使⽤了地址库的jar,⽽地址库本身也使⽤了Spring容器,通过直接创建 ClassPathXmlApplicationContext带参(配置⽂件位置)构造函数初始化⾃身的Spring容器。这样我们就⽆法再修改地址库 配置⽂件加载流程了,下图是⽬前Spring容器结构:
在这里插入图片描述
根据上⼀节的分析,我们知道ClassUtils的getDefaultClassLoader⽅法返回的当前线程上下⽂的ClassLoader:
在这里插入图片描述
因此,这边我们只能通过设置当前线程的ContextClassLoader来确保容器中的容器能从ClassPath加载到配置⽂件并成功初始化容器。

隔离优化

由于完全隔离,⼆⽅包和应⽤⽆法共享⼀些通⽤的⼯具类⽐如中间件,这样对于应⽤和⼆⽅包都需要使⽤中间件且中间件 不⽀持同时创建多个实例(因为不同classloader加载的相同类实际是不同的两个类)。⽐如在迁移智能发货过程中发现应 ⽤和⼆⽅包都使⽤了Switch,⽽Switch是通过服务端推送的⽅式更新客户端,这就需要客户端开启端⼝监听,由于服务端 是向固定端⼝发送请求的所以⼆⽅包或应⽤会通知不到;再⽐如 HSFprovider也会开启端⼝监听,开启同⼀个端⼝的时候会出错。虽然⽬前是通过折中的⽅式解决的,⽐如利⽤Diamond代替Switch,或者在应⽤层不使⽤HSF provider,只由⼆⽅包 ⾃⼰提供HSF 接⼝。但是这种⽅式明显不是⻓久之际,最终⽅案应该是类共享与隔离共存。如何实现类共享?⼀开始想到 的⽅案是利⽤委托机制,在加载AppClassloader前先创建 SDKClassloader,由SDKClassLoader加载公共类,并创建 AppClassLoader和FatJarClassLoader,并把SDKClassLoader作为他俩的parent。同时容器层⾯将应⽤的Spring容器作为⼆⽅包容器的⽗容器,如图:
在这里插入图片描述
这种⽅式⼀个很⼤的缺点是需要在AppClassLoader创建之前就创建SDKClassLoader,这就需要修改系统启动时的默认 ClassLoader。
另⼀种⽅案是在⿊客⻢拉松时和队友讨论出来的,参考pandora插件隔离与共享的⽅式,使⽤⼀个Map缓存共享类,FatJarClassLoader优先从Map加载类。
在这里插入图片描述

EagleEye traceId不⼀致问题

原因

在迁移某个业务过程中,发现由于应⽤和⼆⽅包使⽤的是不同的classloader,即EagleEye也是不同的两个类。由于不同 classloader context不同,在通过反射调⽤服务的时候应⽤和⼆⽅包打印的eagle eye traceId不⼀致,需要在调⽤前设置 context并在调⽤完成之后恢复,类似加载Spring容器时设置的contextClassLoader。

解决

通过询问EagleEye相关的同学,发现EagelEye提供了设置context的⽅法,现在就是怎么设置的问题了。从之前的分析中我 们知道应⽤和⼆⽅包使⽤的是两个不同的ClassLoader即两个EagleEye,现在就需要设置⼆⽅包加载的EagleEye的context即 可,通过反射设置:
在这里插入图片描述
在调⽤⼆⽅包中服务逻辑⽅法前设置并在调⽤后恢复(为了不影响⼆⽅包⾃身内部的 traceId 获取)即可:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThinkPHP8.0+MySQL8.0搭建简单实用电子证书查询系统

客户花了100元买了一个系统,开始不能导入,到处找人帮忙解决。给解决能导入了,不能修改,满足不了用户的需求。用户一狠心,花200块钱,叫我给他定制了一个电子证书查询系统。还免费给部署到服务器。惭愧惭愧……

越早越好!8 个反直觉的金钱真相|金钱心理学

很多人都追求财富自由,但成功的人少之又少。 这可能是因为,人们往往忽略了一些金钱的真相和常识。 01 金钱常识 & 真相 为了构建健康的金钱观,我读了一本有点反直觉,有点像鸡汤,但都是财富真相的书。 来自 Morg…

文本转语音-音画适时推送rtsp并播放

文本语音 rtsp适时播放叫号系统的底层逻辑 发布Linux, unix socket 和window win32做为音频源的 python10下的(ffmpeg version 7.1) 可运行版本. 这两天在弄这个,前2篇是通过虚拟声卡,达到了最简单的一个逻辑,播放文本就从声卡发声&#xff0…

类和对象(中)

1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成…

搜索插入位置(js实现,LeetCode:35)

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入…

【问题记录】如何编译nv_peer_memory模块?依赖OFED的4个目录和2类文件?如何解决没有rdma/peer_mem.h文件?

背景 GDR:GPUDirect RDMA。这项新技术在 GPU 内存之间直接与 NVIDIA HCA/NIC 设备之间提供直接的 P2P(点对点)数据路径。这显着降低了 GPU-GPU 通信延迟,并完全减轻了 CPU 的负担。nv_peer_memory模块是网卡提供给GPU使用GDR技术…

3.6c语言

#define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> int main() {int sum 0,i,j;for (j 1; j < 1000; j){sum 0;for (i 1; i < j; i){if (j % i 0){sum i;} }if (sum j){printf("%d是完数\n", j);}}return 0; }#de…

李彦宏:紧抓AI智能体爆发元年机遇 推动新质生产力加快发展

来源 人民网 3月5日公布的政府工作报告&#xff0c;“智能”一词被提及10次&#xff0c;“大模型”则首次被写入。作为大模型和人工智能领域的领军企业&#xff0c;我们感到非常振奋&#xff0c;同时深感责任重大。 报告在介绍今年政府工作任务时提出&#xff0c;“因地制宜发…

基于Python Django的人脸识别上课考勤系统(附源码,部署)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

5G基本概念

作者:私语茶馆 1. 5G应用场景概述 1.1.5G应用场景 ITU域2015年定义了三大应用场景:eMBB(增强型移动宽带)、uRLLC(低时延高可靠通信)、mMTC(海量物联网通信); emBB:Enhanced Mobile Broadband ,移动互联网应用,是4G MBB(移动宽带)的升级,主要侧重于网络速率、带…

VSCode+AI编程生态实战:从环境配置到智能编码的全栈指南

Python环境的搭建&#xff0c;我们选择了Anaconda环境&#xff0c;有Python环境&#xff0c;接下来要搭建当然是AI辅助编程环境了。在搭建这个之前&#xff0c;或者说大家在打算安装VSCode之前&#xff0c;需要先检查自已电脑是否已经安装了VSCode&#xff0c;因为这个软件是Wi…

Ubuntu工控卫士在制造企业中的应用案例

在当今数字化时代&#xff0c;信息安全已成为各行各业关注的焦点。特别是在工业控制领域&#xff0c;网络安全Linux工控机&#xff08;简称“工控卫士”&#xff09;作为信息安全防护的核心设备&#xff0c;正发挥着越来越重要的作用。本文将深入探讨工控卫士在信息安全防护场景…

Stable Diffusion教程|快速入门SD绘画原理与安装

什么是Stable Diffusion&#xff0c;什么是炼丹师&#xff1f;根据市场研究机构预测&#xff0c;到2025年全球AI绘画市场规模将达到100亿美元&#xff0c;其中Stable Diffusion&#xff08;简称SD&#xff09;作为一种先进的图像生成技术之一&#xff0c;市场份额也在不断增长&…

惊喜操作!强制DeepSeek和豆包轻松生成你的专属图片提示词

大家好&#xff0c;我是抖知书&#xff01;大伙儿平时用DeepSeek或者豆包&#xff0c;多半是写文章、搞数据&#xff0c;谁会天天想着用它生成图片啊&#xff1f;不过话说回来&#xff0c;还真有人动这个心思。 很多人大概觉得&#xff0c;AI不就是弄文字、数据的么&#xff1…

缓存之美:Guava Cache 相比于 Caffeine 差在哪里?

大家好&#xff0c;我是 方圆。本文将结合 Guava Cache 的源码来分析它的实现原理&#xff0c;并阐述它相比于 Caffeine Cache 在性能上的劣势。为了让大家对 Guava Cache 理解起来更容易&#xff0c;我们还是在开篇介绍它的原理&#xff1a; Guava Cache 通过分段&#xff08;…

日期类、Date、Calendar、IO 流、File

DAY9.2 Java核心基础 日期类 java对日期使用提供了良好的封装&#xff0c;包括java.util.Date和java.util.Calender Date Date类使用比较简单&#xff0c;直接通过构造函数实例化对象接口&#xff0c;Date对象标识当前的系统时间&#xff0c;默认的格式并不是我们所熟悉的&…

【Linux】详谈 基础I/O

目录 一、理解文件 狭义的理解&#xff1a; 广义理解&#xff1a; 文件操作的归类认知 系统角度 二、系统文件I/O 2.1 标志位的传递 系统级接口open ​编辑 open返回值 写入文件 读文件 三、文件描述符 3.1&#xff08;0 & 1 & 2&#xff09; 3.2 文件描…

【HarmonyOS Next之旅】DevEco Studio使用指南(二)

目录 1 -> 工程模板介绍 2 -> 创建一个新的工程 2.1 -> 创建和配置新工程 2.1.1 -> 创建HarmonyOS工程 2.2.2 -> 创建OpenHarmony工程 1 -> 工程模板介绍 DevEco Studio支持多种品类的应用/元服务开发&#xff0c;预置丰富的工程模板&#xff0c;可以根…

transformer模型介绍——大语言模型 LLMBook 学习(二)

1. transformer模型 1.1 注意力机制 **注意力机制&#xff08;Attention Mechanism&#xff09;**在人工智能中的应用&#xff0c;实际上是对人类认知系统中的注意力机制的一种模拟。它主要模仿了人类在处理信息时的选择性注意&#xff08;Selective Attention&#xff09;&a…

RAG 常见分块策略全解析:从原理到代码实践(2025 深度版)

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 更多文章可关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! 引言 在检索增强生成(RAG)系统中,分块策略是决定系统…