阿拉丁基础开发框架 以SpringCloud及SpringCloud Alibaba为基础做上层通用功能包扩展,已发布至https://mvnrepository.com/artifact/cn.aradin
- 规范依赖
- 降低集成复杂度
- 扩充能力以更好的满足线上场景
- 解决部分新旧组件交替淘汰时发生的兼容性问题
SpringCloud 2021.0.8
SpringBoot 2.7.18
SpringCloudAlibaba 2021.0.4.0
Dubbo 3.1.11
SpringCloud 2022.0.4
SpringBoot 3.1.9
SpringCloudAlibaba 2022.0.0.0
Dubbo 3.2.11
RELEASE版 0.0.3.25(springcloud.Hoxton.SR12+springboot2.3.12.RELEASE+dubbo2.7)
RELEASE版 0.0.3.26(springcloud.Hoxton.SR12+springboot2.3.12.RELEASE+dubbo3.1)
RELEASE版 0.0.4.2(springboot2.7.5+dubbo3.1)
RELEASE版 1.0.0(springboot2.7.10+dubbo3.1)
RELEASE版 1.0.1(springboot2.7.12+dubbo3.1)
RELEASE版 1.0.2(springboot2.7.15+dubbo3.1)
RELEASE版 1.1.0(springboot3.1.4+dubbo3.2)
RELEASE版 1.1.1(springboot3.1.9+dubbo3.2)
依赖管理
<dependencyManagement><dependencies>
<dependency>
<groupId>cn.aradin</groupId>
<artifactId>aradin</artifactId>
<version>${aradin.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
spring加强,面向线上使用场景,扩充协议文档、缓存、模板、心跳集成能力
- aradin-spring-core
基础能力模块
① cn.aradin.spring.core.algo.* 算法包 目前只有SWRR负载均衡
② cn.aradin.spring.core.bean.* BEAN工具
AradinBeanFactory BEAN工厂类支持对指定Class通过Prefix命名方式进行路由,常用于某个类需要按规则初始化数量大于1的有限个BEAN,比如分库逻辑,读写分离逻辑;
AradinPropertySourceFactory 支持对yml配置文件的加载,使用方式
@Configuration@PropertySource(value = "classpath:config.yml", factory = AradinPropertySourceFactory.class)
方便灵活的布局配置文件
③ cn.aradin.spring.core.context.* 上下文运行时变量 支持三种模式,借鉴SpringSecurity源码中该功能实现方式
MODE_THREADLOCAL;MODE_INHERITABLETHREADLOCAL;
MODE_GLOBAL; 默认为MODE_THREADLOCAL当前线程本地变量,支持配置入口 aradin.context.strategy
④ cn.aradin.spring.core.enums.* 常量包,字面理解
⑤ cn.aradin.spring.core.net.http.* HTTP工具包,使用入口 HttpClientUtils
⑥ cn.aradin.spring.core.queue.* 轻量级内存队列,可用于低可靠性要求的使用场景,参考AradinQueue构造方法可以注入生产者及消费者
⑦ cn.aradin.spring.core.thread.* 线程池包,使用入口AradinThreadManager
⑧ cn.aradin.spring.core.session.* Session配置,需要搭配@EnableSpringSession、@EnableRedisHttpSession或者@EnableAradinHttpSession使用,用于替换webserver容器的默认session机制
参考配置
spring:session:
cookie:
name: ${COOKIE_NAME}
max-age: 3600
http-only: false
security: false #若指定domain与当前域名不一致需要设置为true
same-site: None #若指定domain与当前域名不一致需要设置
domain: #若domain与当前域名不一致需要设置
- aradin-spring-acutator-starter
心跳组件模块,在spring原生actuator基础上增加inited,offline,online三个服务管理节点
① /inited 查看服务的初始化状态
② /online 持续集成发布时增加上线后的处理逻辑,比如容器应用启动应用后执行指定的脚本文件(如日志采集),也支持扩展Handler实现业务高度定制的启动逻辑
cn.aradin.spring.actuator.starter.extension.IOnlineHandler 会自动调用应用上下文中所有该类型的BEAN
此外还支持配置项 aradin.actuator.online.shell 配置启动脚本路径
③ /offline 方便下线时平滑关闭应用
cn.aradin.spring.actuator.starter.extension.IOfflineHandler 会在自动调用应用上下文所有该类型的BEAN后才去调用Spring上下文的close方法
平滑下线处理逻辑中包含Kafka消费端注销、Rabbit消费端注销、Dubbo服务端下线、SpringCloud服务下线(以各项只有存在对应的依赖时才会执行对应的下线动作)
平滑下线增加等待时间配置,即在上述注销动作结束后会Sleep配置的等待时间才会执行context的destroy动作
④ /state 运行状态检查
offline调用后会实时变更状态,替换原生的/health
集成方式
management.endpoints.web.exposure.include: inited,offline,online,state #开启需要的endpoints
补充配置
aradin:acutator:
online:
shell: #定制启动脚本
offline:
shut-wait: #优雅停机配置,服务注销和销毁context间的时间间隔,单位ms
- aradin-spring-velocity-starter
springboot2.x之后不支持velocity的集成,考虑到旧项目模板代码迁移的复杂性,特别提供velocity的兼容包,能够很好的支持springboot2及springboot3
配置方式与原velocity1.x版本一致,例如
spring:velocity:
enabled: true #设定是否允许mvc使用velocity
cache: true #是否开启模板缓存
check-template-location: true #是否检查模板路径是否存在
prefix: null
suffix: .vm #设定velocity模板的后缀
date-tool-attribute: null
number-tool-attribute: null
resource-loader-path: classpath:/template/ #设定模板路径,默认为:classpath:/templates/
toolbox-config-location: classpath:/toolbox.xml #设定Velocity Toolbox配置文件的路径,比如 /WEB-INF/toolbox.xml.
prefer-file-system-access: true #是否优先从文件系统加载模板以支持热加载,默认为true
其中关于toolbox.xml的格式,参考https://velocity.apache.org/tools/3.1/config-xml.html
(注:此处xml的格式为velocity3.1版本,与旧版比有较大的格式改动且新旧不兼容,若旧项目使用velocity1.x的需要做格式调整,但大体配置逻辑一致调整比较简单)
- aradin-spring-swagger-starter
Swagger-bootstrap-ui集成组件,选型的原因是相对原生UI更加友好
① cn.aradin.spring.swagger.starter.dto。Resp 标准返回结构
② 配置方式
aradin:swagger:
base-package: pk1;pkg2;pk3
ant-path:
title: 协议标题
description: 协议描述
version: 1.0.0
enable: true
contact-name:
contact-email: liudaax@126.com
contact-url:
license:
license-url:
use-default-status: false
- aradin-spring-caffeine-starter
使用Caffeineson类包装内存缓存Caffeine,实现对应的CacheManager,支持spring-cache注解方式集成
一般情况下,对于内存缓存的更新机制也分为两种:
① 利用Caffeine缓存自身的超时机制进行延时Evict,在触发之前持久层对应的数据可能已经发生变更,
所以对于更新的数据一定时间内存在不一致情况,此种使用方式更适合对一致性要求不严格或者不可变数据的缓存处理,
比如SessionID上的使用可以有效降低Redis调用损耗;题目的缓存;热点商品信息的缓存;
② 利用分布式中间件,比如nacos,zookeeper进行变更的通知,以实现各节点内存缓存的同步更新;cachename级别的版本变更控制,需要搭配**aradin-version**模块使用,**aradin-version-zookeeper-starter**和**aradin-version-nacos-starter**均提供了配置样例
所以该模块对应支持普通模式以及基于版本管理机制的分布式更新模式:
对应配置如下:
aradin:cache:
caffeine:
clean-interval: PT20M #1.0.1之后增加定时执行cleanUp逻辑,此处为执行间隔,主要原因是Caffeine的缓存过期逻辑为惰性清理,可能造成内存无法及时释放,线上场景建议按照实际需求进行适配
defaults: #默认缓存配置
expire-after-access: 1200000 #访问后过期时间,单位毫秒
expire-after-write: 1800000 #写入后过期时间,单位毫秒
initial-capacity: 100 #初始化大小
maximum-size: 10000 #最大缓存对象个数,超过此数量时之前放入的缓存将失效
allow-null-values: true #是否允许空值
is-soft: true #是否启用软引用
record-stats: true #是否开启状态统计
configs: #自定义cacheName对应的缓存配置
base: #具体的cache名,与springcache配合使用
expire-after-access: 3600000
expire-after-write: 3600000
initial-capacity: 100
maximum-size: 100000
allow-null-values: true
soft: true
record-stats: true #是否开启状态统计
session:
expire-after-access: 7200000
expire-after-write: 7200000
initial-capacity: 100
maximum-size: 100000
allow-null-values: true
soft: true
record-stats: true #是否开启状态统计,可以配合management.endpoints.web.exposure.include: caffeineson 来使用
使用方式如下几种:
① 直接引用Caffeineson Bean,配置参考aradin.cache.caffeine.defaults
② 引用CaffeinesonCacheManager Bean 按CacheName获取Caffeineson实例
③ 搭配@EnableCache注解,使用方式@Cachable(cacheManager=CaffeinesonConfiguration.CACHE_MANAGER)
④ 提供Endpoint入口查询Caffeine状态 caffeineson,参考record-stats配置说明,可以按照aradin-spring-acutator-starter的配置方式进行开放
注:各配置项的设置可以参考https://github.com/ben-manes/caffeine/wiki/Memory-overhead-zh-CN中的内存占用指标
- aradin-spring-redis-starter
这个模块目前实现了两个重点功能:
一、针对于spring-cache注解的使用优化
替换掉了spring-boot-starter-data-redis中默认CacheManager实现(由于原生实现不支持多种缓存方式共存),对于各CacheName的初始化使用自定义配置项
配置方式如下
首先是原生配置
spring:
data:
redis:
database: 0 #Redis数据库索引(默认为0)
host: #Redis服务器地址
port: 6379 #Redis服务器连接端口
password: #Redis服务器连接密码(默认为空)
lettuce:
pool: #连接池配置,不再详细列出
cache:
redis:
defaults:
ttl: PT60M #https://blog.csdn.net/huang007guo/article/details/81625061
ttl-offset: PT60M #指定随机offset,解决缓存雪崩问题
cache-null-values: true
key-prefix: default_
use-key-prefix: true
configs:
base:
ttl: PT12H
ttl-offset:
cache-null-values: true
key-prefix: base_
use-key-prefix: true
client:
ttl: PT4H
ttl-offset:
cache-null-values: true
key-prefix: client_
use-key-prefix: true
二、针对于redis大集合分桶操作的支持(v1.0.2+)
面向实际业务场景时,随着数据量的增加,对于hashmap和set的操作往往伴随着大key问题,这时候常用的策略都是对数据进行分桶,但目前spring针对于redis的实现并未支持,需要集成方在上层手动进行,并不方便。
该模块做的,就是提出了RedisBucketTemplate的概念,并提供了BucketHashOperations,BucketSetOperations(单机模式),ClusterBucketSetOperations(集群模式)操作类,来统一托管分桶逻辑以及桶聚合操作。
对于Set的操作类之所以提供了两个Operations,是由于set提供的api存在跨Key操作,单机可以完全在redis中进行,而集群模式下由于key的分布在不同的slot中,跨key操作的支持需要转到内存中进行。
- aradin-spring-redisson-starter
RedissonClient实例初始化,配置方式与spring-redis配置一致,无需额外配置项
- aradin-spring-session-starter(v1.0.2+)
spring-session-data-redis的实现依赖spring.redis.*配置,这会造成session用的redis和业务redis高度绑定,在实际使用场景中,存在多服务共享session但不愿共享redis的场景。spring-session-data-redis中RedisConnectFactory引入方式虽然提供了@SpringSessionRedisConnectionFactory扩展槽来定制redis,但会造成默认RedisConnectFactory实例不再初始化,所以并不实用。
该模块实现了对默认redissession实现的替换,使用aradin.session.redis.*来定制session用的redis实例,同时使用@EnableAradinHttpSession注解实现对@EnableRedisHttpSession注解的替换。
配置方式如下
aradin:session:
redis:
database: 0 #Redis数据库索引(默认为0)
host: #Redis服务器地址
port: 6379 #Redis服务器连接端口
password: #Redis服务器连接密码(默认为空)
lettuce: #连接池配置,不再详细列出 pool: #连接池配置,不再详细列出
- aradin-spring-salarm-starter
告警通知模块,类似log4j的API,实现Content的组装和发送,发送目标默认只提供控制台输出
① cn.aradin.spring.salarm.starter.handler.ISalarmHandler 实现该接口Bean实例,自定义各个通知渠道逻辑
② cn.aradin.spring.salarm.starter.notifier.ISalarm 调用入口,负责告警消息的拼装,去重以及全局ISalarmHandler的分发,引用方式为Bean引用
③ 配置项
aradin:salarm:
ttl: PT1H # Min interval for sending a same alarm
level: warn # Min level to send
- aradin-spring-xxljob-starter
Xxljob自动配置,配置项与官方建议一致
配置项
xxl:job:
admin:
addresses:
access-token:
executor:
appname:
ip:
port:
logpath:
logretentiondays:
合并了必要的依赖项和配置样例,并未做额外开发
-
aradin-alibaba-nacos-starter
-
aradin-alibaba-sentinel-starter
- aradin-mybatis-plus-starter
增加了开启分页的配置,由于默认情况下Page查询是必要的,无需下沉到项目实现中再开启
- aradin-lucene-solr-starter
使用自定义配置初始化CloudSolrClient Bean
配置如下 spring:data:
solr:
zk-hosts:
- 192.168.1.1:2181
- 192.168.1.2:2181
- 192.168.1.3:2181
chroot: /solrcloud
- aradin-zookeeper-boot-starter
可同时配置多个ZK集群,并绑定事件路由机制
支持的使用方式如下
① 事件接收方式 实现cn.aradin.zookeeper.boot.starter.handler.INodeHandler Bean实例 通过support方法进行事件过滤,handler方法实现事件的处理
② ZK集群配置方式
aradin:zookeeper:
addresses: #支持多组
- id: CUSTOMIZED-ZOOKEEPER-ADDRESS-ID
address: 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181/CHROOT
③ ZKClient获取方式 ZookeeperClientManager.getClient(String id)
版本分发引擎,建立标准的版本控制分发机制,并支持选择性集成zookeeper,nacos中间件
- aradin-version-core
版本分发通用模块,对版本分发的上层逻辑进行抽象,并提供分布式一致性中间件的扩展入口,目前支持zookeeper、nacos
① cn.aradin.version.core.dispatcher.VersionDispatcher 唤起所有的IVersionHandler(Bean)进行版本变更的发布
② cn.aradin.version.core.gentor.IVersionGentor 新版本号生成器,提供默认实现
③ cn.aradin.version.core.handler.IVersionBroadHandler 版本发布逻辑,默认实现只打印至控制台,需要根据不同中间件对应不同具体实现
aradin-version-zookeeper-starter.VersionZookeeperBroadHandleraradin-version-nacos-starter.VersionNacosBroadHandler
④ cn.aradin.version.core.properties.VersionProperties 相关配置项 **aradin.version**
- aradin-version-zookeeper-starter
① cn.aradin.version.zookeeper.starter.handler.VersionsNodeHandler
*接收ZK事件并使用VersionDispatcher(Bean)进行分发,接收方为所有的cn.aradin.version.core.handler.IVersionHandler(Bean)*
② cn.aradin.version.zookeeper.starter.handler.VersionZookeeperBroadHandler
*ZK的版本广播触发入口,方便人工触发版本变更事件*
③ 配置样例
aradin:
version:
zookeeper:
address-id: CUSTOMIZED-ID
zookeeper:
enable: true #default true
session-timeout: 5000 #default 5000
connection-timeout: 5000 #default 5000
addresses:
- id: CUSTOMIZED-ID
address:
- aradin-version-nacos-starter(v1.0.0+)
① cn.aradin.version.nacos.starter.listener.VersionNacosConfigListener
*接收Nacos事件,并使用VersionDispatcher(Bean)进行分发,接收方为所有的cn.aradin.version.core.handler.IVersionHandler(Bean)*
② cn.aradin.version.nacos.starter.handler.VersionNacosBroadHandler
*Nacos的版本广播触发入口,方便人工触发版本变更事件,另外初始化时同时为指定的group data-id绑定listener*
③ 配置样例
version:
nacos:
server-addr: #若不配置与spring.cloud.nacos一致
username: #若不配置与spring.cloud.nacos一致
password: #若不配置与spring.cloud.nacos一致
namespace: #若不配置与spring.cloud.nacos一致
group: #必填
data-ids: #必填,data-id列表
spring:
cloud:
nacos:
username:
password:
config:
enabled: true
server-addr: 192.168.1.1:8888,192.168.1.2:8888,192.168.1.3:8888
namespace: d78b658c-182a-420a-9005-e8e8f36a1e7d
group-id: aradin.version.nacos.group
data-id: aradin.version.nacos.data-id
- aradin-version-caffeine-starter整合aradin-version-zookeeper-starter实现分布式内存缓存
aradin-version-caffeine-starter中实现了位于VersionDispatcher(Bean)下游的IVersionHandler(cn.aradin.spring.caffeine.manager.version.CaffeinesonVersionHandler)实现内存信息的版本淘汰机制
① 相关配置如下:可以参考复用至nacos集成
aradin:version:
zookeeper:
address-id: CUSTOMID
zookeeper:
addresses:
- id: ${aradin.version.zookeeper-address-id}
address: 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181/chroot
cache:
caffeine:
defaults: #默认缓存配置
expire-after-access: 1200000 #访问后过期时间,单位毫秒
expire-after-write: 1800000 #写入后过期时间,单位毫秒
initial-capacity: 100 #初始化大小
maximum-size: 10000 #最大缓存对象个数,超过此数量时之前放入的缓存将失效
allow-null-values: true #是否允许空值
is-soft: true #是否启用软引用
configs: #自定义cacheName对应的缓存配置
base: #具体的cache名,与springcache配合使用
expire-after-access: 3600000
expire-after-write: 3600000
initial-capacity: 100
maximum-size: 100000
allow-null-values: true
is-soft: true
versioned: true #标识当前cache是否开启分布式更新,默认为false
session:
expire-after-access: 7200000
expire-after-write: 7200000
initial-capacity: 100
maximum-size: 100000
allow-null-values: true
is-soft: true
② 缓存失效的手动触发
**IVersionBroadHandler(Bean).broadcast(String group, String key);**group为aradin.cache.caffeine.group,key为cacheName,对应的cache将被清空达到被动更新的目的
- aradin-version-caffeine-starter整合aradin-version-nacos-starter实现分布式内存缓存
aradin-version-caffeine-starter中实现了位于VersionDispatcher(Bean)下游的IVersionHandler(cn.aradin.spring.caffeine.manager.version.CaffeinesonVersionHandler)实现内存信息的版本淘汰机制
① 相关配置如下:可以参考复用至nacos集成
aradin:version:
nacos:
username: #选填,默认与spring.cloud.nacos一致
password: #选填,默认与spring.cloud.nacos一致
server-addr: #选填,默认与spring.cloud.nacos一致
namespace: #选填,建议与项目配置做隔离
group: #必填
data-ids: #必填,data-id列表,需要管理的cacheName加进来即可
cache:
caffeine:
defaults: #默认缓存配置
expire-after-access: 1200000 #访问后过期时间,单位毫秒
expire-after-write: 1800000 #写入后过期时间,单位毫秒
initial-capacity: 100 #初始化大小
maximum-size: 10000 #最大缓存对象个数,超过此数量时之前放入的缓存将失效
allow-null-values: true #是否允许空值
is-soft: true #是否启用软引用
configs: #自定义cacheName对应的缓存配置
base: #具体的cache名,与springcache配合使用
expire-after-access: 3600000
expire-after-write: 3600000
initial-capacity: 100
maximum-size: 100000
allow-null-values: true
is-soft: true
versioned: true #标识当前cache是否开启分布式更新,默认为false
session:
expire-after-access: 7200000
expire-after-write: 7200000
initial-capacity: 100
maximum-size: 100000
allow-null-values: true
is-soft: true
② 缓存失效的手动触发
**IVersionBroadHandler(Bean).broadcast(String group, String key);**group为aradin.cache.caffeine.group,key为cacheName,对应的cache将被清空达到被动更新的目的
- aradin-cluster-core
集群模块,可以借助zookeeper,nacos实现集群节点的注册和节点列表的获取,该模块通过IClusterNodeManager对集群信息进行托管,依赖zk或nacos模块实现集群信息的更新。此外,该模块还提供了集群的通用注册配置
① 相关配置如下:
aradin:cluster:
node-name: #节点注册名
register: true #当前节点是否注册到集群中,默认为true
prefer-ip-address: #节点注册名是否偏向于ip地址,当node-name不指定时,可以生成默认名
max-node: #当前集群支持的最大节点数
- aradin-cluster-zookeeper-starter
基于ZK实现集群节点的注册和同步
① 相关配置如下:
aradin:cluster:
zookeeper:
address-id: #和aradin-zookeeper-boot-starter的配置关联
- aradin-cluster-nacos-starter
基于nacos实现集群节点的注册和同步,原理是借助cluster独占的方式来确定各节点的序号,注意的是发布建议逐节点滚动发布,原因是目前nacos注册+注销操作频繁可能会有数据一致性问题,
① 相关配置如下:
aradin:cluster:
nacos:
username:
password:
server-addr:
namespace: #建议和服务注册发现的命名空间分离,防止有干扰
group:
service-name:
外部模块重写,目前包含springfox-swagger,原因是swagger近两年未做更新,与spring新版有兼容问题,所以做了本地化适配修改,0.0.4.x以后,兼容springboot2.7.X
- springfox-core
- springfox-schema
- springfox-spi
- springfox-spring-web
- springfox-swagger2
- springfox-swagger-common
- swagger-bootstrap-ui
swagger近两年未做更新,与spring新版有兼容问题,所以做了适配修改,1.0.x+版本兼容springboot2.7.x,1.1.x兼容springboot3.1.x,可直接引用aradin-spring-swagger-starter
- velocity-tools-jakarta(v1.1.0+)
springboot3正式进入jakarta时代,但velocity已经停止了迭代,由于老项目的velocity模板迁移到其他模板的工程量巨大,对老项目框架升级造成了阻碍,所以针对这块做了适配修改,可直接引用aradin-spring-velocity-starter
- xxl-job-core
原版core包在log4j和spring-context存在强依赖,导致jar包出现包冲突,本地化适配修改,可直接引用aradin-spring-xxljob-starter
方便客户端调用方的构造,目前先对Http各种请求模式进行了支持,
- aradin-easy-http
参考springmvc注解方式提供Http接口类的注解及执行代理,同时做到对spring无依赖,新旧项目均能接入,基于jdk动态代理实现对Http接口类的代理
- aradin-easy-http-buddy
对aradin-easy-http中代理实现的构造进行了重写,基于ByteBuddy实现对Http接口类的代理
代理类构造,使用工厂模式 EasyBuilder.ins().service(NcClient.class)
请求方法支持GET、POST,请求体支持QueryParam, Formdata, JSON, String,同时支持加密方法的注册,实现传参前的编码
在Http接口类的代理构造上,对jdk动态代理和bytebuddy字节码增强进行了对比,参考#6
目前最新发布的1.0.3(springboot2.7.18)以及1.1.1(springboot3.1.6)版本,经过大量的线上场景验证和磨合,已基本满足日常项目快速搭建需求,且已经普遍运行于线上环境。
JVM兼容jdk8至17,当前支持springboot3.1.6,spring官方已于2023年11月停止维护2.7.x并推出3.2.x,
aradin框架将从1.2.x开始以jdk21为基座支持springboot3.2.x,同时保持1.1.x对springboot3.1.x的支持,跟进SpringCloud及Alibaba全家桶的生态升级
我们致力于为Javaer提供更加快捷的项目搭建途径,所以无论对该项目有任何的见解,都欢迎来交流,如果有其他需要补充的功能或者对现有模块的Fix,也欢迎不吝提交你的issue,审核通过即可加入本项目开发
开发者邮箱 liudaax@126.com