常用中间件封装思路粗记

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

@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

相关推荐
隔着天花板看星星14 小时前
Kafka-Consumer理论知识
大数据·分布式·中间件·kafka
隔着天花板看星星14 小时前
Kafka-副本分配策略
大数据·分布式·中间件·kafka
wenyue112116 小时前
Ease Monitor 会把基础层,中间件层的监控数据和服务的监控数据打通,从总体的视角提供监控分析
运维·中间件·监控
谷大羽2 天前
Kafka Stream实战教程
spring boot·后端·中间件·kafka·stream
隔着天花板看星星2 天前
Kafka-创建topic源码
大数据·分布式·中间件·kafka
get2003 天前
Gin 框架中间件详细介绍
中间件·gin
一水鉴天3 天前
智能工厂的设计软件 为了监管控一体化的全能Supervisor 的监督学习 之 序5 架构for认知系统 总述 (架构全图)
人工智能·学习·中间件·架构
谢尔登3 天前
【Next】中间件
服务器·javascript·中间件
极客先躯3 天前
高级java每日一道面试题-2024年11月09日-缓存中间件篇-Redis和Memecache有什么区别?
java·缓存·中间件·每日一道面试题·高级java·缓存中间件篇
隔着天花板看星星4 天前
Kafka-Controller角色需要做什么?
大数据·分布式·中间件·kafka