当前位置: 首页 > news >正文

常用中间件封装思路粗记

MQ

  1. 自定义注解 ,编写配置类在bean属性初始化SmartInitializingSingleton#afterSingletonsInstantiated后至处理器 去扫描有自定义注解的bean,去创建对应消费者的容器 并启动
  2. 消费者容器类主要组件DefaultMQPushConsumer SmartInitializingSingleton#afterSingletonsInstantiated 时候会去初始化,包括nameserver、topic、消费模式(集群、广播),顺序消费还是并发消费,并设置对应的 MessageListener(我们可以自己实现MessageListener放进去,从而可以对消费前、后进行添加拦截器,消费拦截器可以帮我们实现 幂等(基于redis),tid、env 项目环境基线消费、消费耗时统计 等传递),通过message property传递
  3. MQAdminInstance.threadLocalMqAdminExt().examineConsumerConnectionInfo(consumerGroup)consumerConnection.getConnectionSet().isEmpty();可以判断消费者组是否在线
  4. 消费者容器类启动 ,容器会实现SmartLifecycle的接口,实现DefaultMQPushConsumer启动 和销毁
  5. 针对发送者DefaultMQProducerImpl的 线程池传递问题,我们可以在SmartInitializingSingleton#afterSingletonsInstantiated 去替换成ttl的DefaultMQProducerImpl发送者本身就有拦截器SendMessageHook,我们可以在配置类里直接给他set进去
  6. 通过实现InitializingBean#afterPropertiesSet手动创建 HttpServerProvider.provider() 服务;实现MQ、Dubbo、Task下线

Task

  1. module 分为 api、abstract、具体实现Api放常量、注解这些、abstract放 抽象的方法 例如 加载、注册处理器,具体实现moudel 实现不同中间件的差异
  2. xxlJob几个原生核心方法IJobHandler loadJobHandler(String name) IJobHandler registJobHandler(String name, IJobHandler jobHandler)
  3. alibaba.schedulerx几个原生核心方法JobProcessorRepository.loadJobProcessor(String name)
    JobProcessorRepository.registJobProcessor(name, jobHandler)
  4. 自定义注解 ,编写配置类在bean属性初始化SmartInitializingSingleton#afterSingletonsInstantiated后至处理器 去扫描有自定义注解的bean的方法,去注册 自定义MethodJobHandler 子类,
    MethodJobHandler实现了IJobHandler 接口,我们可以在自定义MethodJobHandler 重写 execute方法,实现我们定时任务拦截器的注入,这样定时任务调用前后可以拦截
  5. 拦截器前可以使用 AbstractTaskHelper.log 放入我们的tid
  6. 通过实现InitializingBean#afterPropertiesSet手动创建 HttpServerProvider.provider() 服务;实现MQ、Dubbo、Task下线
    Task 使用 xxlJobSpringExecutor.destroy(); 下线

SQL

net.sf.jsqlparser.statement CCJSqlParserUtil提供了 很多SQL对应的JAVA映射的类,可以解析语句,判断是否全表扫描
1.mysql的拦截器
QueryInterceptor的preProcess
可以美化sql、判断是否全表扫描 需要jdbcUrl加上参数
2.mybatisPlus拦截器
DefaultSqlInjector可以实现 自定义basemapper方法
MetaObjectHandler insertFill、updateFill可以对创建时间等设置默认值
PaginationInnerInterceptor
beforeQuery、autoCountSql优化深分页
3.mybatis拦截器
org.apache.ibatis.plugin.Interceptor
我们可以在intercept方法里boundSql里面追加 appName、tid

4.实现druid ResultSetProxyImpl 实现大sql熔断
FilterEventAdapter 注入我们的ResultSetProxy

配置
思路:可以利用 函数试接口 做一个 catch 异常的底层通用模版方法
核心api
MethodHandle JAVA7提供了反射调用方法api — invokeWithArguments
修改配置核心思路:
1.读取自定义框架前缀配置,并改为原生spring的配置 放到Spring environment 或者 System 中
实现EnvironmentPostProcessor接口postProcessEnvironment
MutablePropertySources、PropertiesPropertySource、System.getProperty、ConfigurableEnvironment environment.getProperty
2.
@ConfigurationProperties 直接自己的Properties

创建监听
nacos
1 自定义注解 (可以支持),编写配置类在bean属性初始化SmartInitializingSingleton#afterSingletonsInstantiated后至处理器 去扫描有自定义注解的bean的方法,去注册自定义监听
1.1 nacos 创建 ConfigService (注意用map缓存 防止重复创建)、NacosFactory.createConfigService 、new AbstractListener()、configService.addListener)
1.2 注册监听具体做什么事 可以用函数试接口 交给反射调用
1.3 自定义注解可以支持 key修改类型(add、modify、delete),正则,其实就是在客户端内存过滤
local
1.本地可以用namespace+dataId+group 构成文件路径文件名
2.通过 FileAlterationObserver、FileAlterationMonitor、FileAlterationListenerAdaptor#onFileChange 检测到本地文件配置变化

日志
1.动态修改log等级
监听nacos 使用Spring LoggingSystem修改log等级 以及环境变量中的log等级
2.HttpFilter 可以打印IP、出入参(需要可配置)、统计时长,超时截断、生成响应头TID、解析环境变量(集群、环境code)放入MDC
3.RPCFilyer 同上 ,传递用RpcContext#setAttachment

文件存储
思路
不同存储bean策略
1.@Bean 注解初始化Bean的时候从 配置文件读取配置,初始化工具类里面聚合的策略类接口
2.spi 遍历处理
3.文件冗灾模式 读写冗灾,读写先本地 后云

MINIIO
MinioClient
putObject
getObject
removeObject

Local
就是InputStream那一系列操作了

sentinel
BlockExceptionHandler 自定义限流页面异常提醒
实现EnvironmentPostProcessor接口postProcessEnvironment 拉取限流规则,如果为空重新推送

搜索引擎
配置类 es 基础bean
浅封 ElasticsearchRestTemplate、ElasticsearchOperations

web
跨域、messageConvert、全局异常处理器、重复提交注解 放重复提交切面 使用 redission 限流

rpc

核心API
Offline.offline、online 提供者下线上线
RemoteMetadataServiceImpl、InMemoryWritableMetadataService提供者元数据信息
实现dubbo TelnetHandler接口可以自定义自己的dubbo invoke 命令

1.切面限流 使用 redission 限流
2.filter中从上下文拿到envCode设置 dubbo.tag 属性实现消费过滤 项目环境,提供者EnvironmentPostProcessor 从环境变量中拿到设置到dubbo.provider.tag ->System.setProperty,自定义类RouteInvoker消费者实现 ClusterInvoker#invoke 并且RpcContext#setAttachment,再创建一个RouteClusterWrapper实现Cluster接口#join构建我们的RouteInvoker
3.异常处理 如果org.apache.dubbo.rpc.Result result#hasException 处理异常 包装成统一的基础框架的Result.error
4.filter传递自定义分库信息
5.PRC提供者思路:
5.1 在环境后置处理器中 禁用DubboAutoConfiguration-其实就是排除这个bean spring.autoconfigure.exclude 这个属性
5.2 ServiceClassPostProcessor 我们还是@Bean 配置进去,但是在 BeanDefinitionRegistryPostProcessor我们修改调它里面serviceAnnotationTypes 属性,让原生帮我们自定义注解注册ServiceBean 这样5.4的事件里就可以不用创建了
5.3 BeanDefinitionRegistryPostProcessor 中 移除 DubboBootstrapApplicationListener、DubboLifecycleComponentApplicationListener bean 定义 ,事件监听导出服务 我们自己去做

5.4自定义注解 ,编写配置类在bean属性初始化SmartInitializingSingleton#afterSingletonsInstantiated后至处理器 去扫描有自定义注解的bean的方法,从IOC拿到RegistryConfig、ProtocolConfig、ProviderConfig,从IOC容器获取自定义注解标记的bean,并设置到ServiceConfig中,其中ServiceConfig还要设置interfaceClass
、 RegistryConfig、ProtocolConfig等以及自定义注解上的group、version、timeout,最后调用ServiceConfig.export 进行服务发布,最后调用dubbo的ServiceBeanNameBuilder
build方法去构建ServiceBean BeanName 与 ServiceConfig的Map,最后在应用启动成功的事件里去注册这些ServiceBean,5.1注册bean了不会再注册

6 消费者思路
BeanDefinitionRegistryPostProcessor#postProcessBeanFactory中修改我们annotationTypes包含我们消费者的自定义注解,并注册registerSingleton->ReferenceAnnotationBeanPostProcessor bean,这样我们就可以借助InstantiationAwareBeanPostProcessorAdapter以及AnnotationInjectedBeanPostProcessor能力注入,而注入时的缓存map referenceBeanCache 我们会在下一步处理好

自定义注解 ,在 BeanDefinitionRegistryPostProcessor中 扫描自定义注解,反射调用 rg.apache.dubbo.config.spring.beans.factory.annotation.ReferenceBeanBuilder#create方法创建ReferenceBean,并反射放到ReferenceAnnotationBeanPostProcessor的referenceBeanCache属性中
设置@RefrecebeanName的bean定义 ,使用 RootBeanDefinition(@Nullable Class beanClass, @Nullable Supplier instanceSupplier) ,instanceSupplier 为我们上面创建的代理对象 ReferenceBean,这样改bean 就为 我们的代理对象了并把beanDefinition设置为setAutowireCandidate = true,自动注入

Mysql 常见问题

接口延迟查询、大sql熔断、全表扫描、mysql磁盘碎片整理、单表>50g=医嘱历史表优化,大字段不存镜像

基于camel 实现开放平台协议转换以及插件思路-支持dubbo、mysql、http、mq、canel 互转

可视化界面 mysql 存储 协议转换信息
保存就是 策略、模版方法拼接处 router的xml routes dsl 并存储

上线操作通过redis channel 启动 context、并load 加载数据库读取的xml routes dsl ,然后启动
下线就卸载掉就好了

插件=processer
插件的 黑白名单、限流、权限、登陆人信息
通用 例如 xml、json、byte 转换, 数据映射、token、dubbo、mq、http等中间件支持
routes xml ,xml制定form to ,process ref
compoment endpoint , producer customer 也实现了 processer
META-INF 自定义compoment

相关文章:

常用中间件封装思路粗记

MQ 自定义注解 ,编写配置类在bean属性初始化SmartInitializingSingleton#afterSingletonsInstantiated后至处理器 去扫描有自定义注解的bean,去创建对应消费者的容器 并启动消费者容器类主要组件DefaultMQPushConsumer SmartInitializingSingleton#afte…...

探索SPI:深入理解原理、源码与应用场景

文章目录 一、初步认识1、概念2、工作原理3、作用场景 二、源码分析1、ServiceLoader结构2、相关字段3、核心方法 三、案例connector连接器小案例1、新建SPI项目2、创建扩展实现项目1-MongoDB3、创建扩展实现项目2-Oracle4、测试 Spring应用1、创建study工程2、创建forlan-test…...

Web3名词解释

Web3名词解释 以太坊 ERC20 Defi去中心化金融 Defi是Decentralized Finance的英文缩写。 简单理解点就是与传统的高度中心化金融体系相比,去中心化金融是通过区块链技术,比如基于区块链技术开发的手机钱包软件,通过智能合约代码以实现去除…...

Vatee万腾外汇市场新力量:vatee科技决策力

在当今数字化时代,Vatee万腾崭露头角,以其强大的科技决策力进军外汇市场,成为该领域的新力量。这一新动向将不仅塑造外汇市场的未来,也展现Vatee科技决策力在金融领域的引领作用。 Vatee万腾带着先进的科技决策力进入外汇市场&…...

【HarmonyOS开发】配置开发工具DevEco Studio

1、下载 注意: 1、安装过程中,一定要自定义安装位置,包比较大,包比较大,包比较大!!! 2、可以将该工具添加到右键中,否则,如果你的项目不是HarmonyOS&#xff…...

探索亚马逊大语言模型:开启人工智能时代的语言创作新篇章

文章目录 前言一、大语言模型是什么?应用范围 二、Amazon Bedrock总结 前言 想必大家在ChatGPT的突然兴起,大家多多少少都会有各种各样的问题,比如:大语言模型和生成式AI有什么关系呢?大语言模型为什么这么火&#xf…...

zabbix-proxy分布式监控

Zabbix是一款开源的企业级网络监控软件,可以监测服务器、网络设备、应用程序等各种资源的状态和性能指标。在大型环境中,如果只有一个Zabbix Server来监控所有的节点,可能会遇到性能瓶颈和数据处理难题。 为了解决这个问题,Zabbi…...

springboot生成PDF,并且添加水印

/*** 导出调查问卷*/ApiLog("导出调查问卷")PostMapping("/print/{id}")ApiOperationSupport(order 23)ApiOperation(value "导出报告", notes "导出报告")public void print(PathVariable Long id, HttpServletResponse response…...

Tensorflow2.0:CNN、ResNet实现MNIST分类识别

以下仅是个人的学习笔记 ,内容可能是错误 CNN: import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers# 导入数据 (x_train, y_train), (x_test, y_test) keras.datasets.mnist.load_data()# 数据预处理 x_tra…...

本地jar导入maven

一、通过dependency引入 1.1. jar包放置&#xff0c;建造lib目录 1.2. pom.xml文件 <dependency><groupId>zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.2</version><!--system&#xff0c;类似provided&#x…...

数据结构与算法【堆】的Java实现

前言 之前已经说过堆的特点了&#xff0c;具体文章在数据结构与算法【队列】的Java实现-CSDN博客。因此直接实现堆的其他功能。 建堆 所谓建堆&#xff0c;就是将一个初始的堆变为大顶堆或是小顶堆。这里以大顶堆为例。展示如何建堆。 找到最后一个非叶子节点从后向前&…...

同创永益联合红帽打造一站式数字韧性解决方案

随着AI技术的快速兴起&#xff0c;IT技术已成为推动业务持续增长的重要驱动力&#xff0c;这要求企业不断尝试新事物&#xff0c;改变固有流程&#xff0c;加强IT技术与业务的合作&#xff0c;同时提升数字韧性能力&#xff0c;以实现业务目标。10月26日&#xff0c;红帽2023中…...

c++ call_once 使用详解

c call_once 使用详解 std::call_once 头文件 #include <mutex>。 函数原型&#xff1a; template<class Callable, class... Args> void call_once(std::once_flag& flag, Callable&& f, Args&&... args);flag&#xff1a;标志对象&#xf…...

【rosrun diagnostic_analysis】报错No module named rospkg | ubuntu 20.04

ubuntu20.04使用指令报错 现象 rosrun diagnostic_analysis export_csv.py my.bag -d ~/Desktop报错 Traceback (most recent call last): File "/opt/ros/noetic/lib/diagnostic_analysis/export_csv.py", line 40, in <module> import roslib; roslib.load_m…...

高防CDN有什么作用?

分布式拒绝服务攻击&#xff08;DDoS攻击&#xff09;是一种针对目标系统的恶意网络攻击行为&#xff0c;DDoS攻击经常会导致被攻击者的业务无法正常访问&#xff0c;也就是所谓的拒绝服务。 常见的DDoS攻击包括以下几类&#xff1a; 网络层攻击&#xff1a;比较典型的攻击类…...

盛元广通开放实训室管理系统2.0

开放实训室管理系统是一种基于网络和数据库的实训室信息管理系统&#xff0c;旨在提高实训室的管理水平&#xff0c;实现实训资源的优化配置和高效利用。该系统通常包括用户管理、设备管理、课程管理、考核管理等功能模块&#xff0c;能够实现实训室的预约、设备借用、课程安排…...

3D建模基础教程:编辑多边形功能命令快捷方式

一、打开3D软件并创建新模型 首先&#xff0c;打开你的3D建模软件&#xff0c;比如Blender、Maya或3ds Max。然后&#xff0c;创建一个新的3D模型。你可以使用基本几何体来创建模型&#xff0c;也可以导入现有的模型。 二、进入编辑多边形模式 在主工具栏中&#xff0c;找到并…...

SaleSmartly新增AI意图识别触发器!让客户享受更精准的自动化服务

AI意图识别技术是对话式AI中很重要的组成部分&#xff0c;通俗点来说就是一种可以识别用户在对话中表达的意图的技术。通过对大量数据的分析和学习&#xff0c;AI可以理解用户想要获得的信息&#xff0c;并根据这些信息来采取相应的行动或提供相应的响应。而在对话式AI中&#…...

计算机毕业设计选题推荐-个人博客微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

一篇详解,Postman设置token依赖步骤

前言 postman做接口测试时&#xff0c;大多数的接口必须在有token的情况下才能运行&#xff0c;我们可以获取token后设置一个环境变量供所在同一个集合中的所有接口使用。 一般是通过调用登录接口&#xff0c;获取到token的值 实战项目&#xff1a;jeecg boot项目 项目官网…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...