支持监控SQL、感知事务状态、回溯数据源的动态数据源框架是什么?

分类:编程技术 时间:2024-02-20 15:40 浏览:0 评论:0
0
本文主要讲解“什么是支持监控SQL、感知事务状态、回溯数据源的动态数据源框架”。文章中的讲解内容简单明了,易学易懂。请跟随小编的思路,深入研究一下“什么是支持监控SQL、感知事务状态、回溯数据源的动态数据源框架”!

项目更名

easymulti-datasource-spring-boot-starter之后,作者Hotkit-r2dbc 已开发。这两个项目都支持动态数据源切换。前者支持mybatis框架,后者支持响应式编程spring-data-r2dbc框架。由于它们都是ORM框架,所以最好将它们合并到一个项目中进行维护。

GitHub 上原来的 easymulti-datasource-spring-boot-starter 项目已更名为 easymulti-datasource,并且原来的easymulti-datasource-spring-boot-starter模块已更名为easymulti-datasource-mybatis。从3.0.1开始版本号发生了变化。新版本添加了easymulti-datasource-r2dbc(原来的hotkit-r2dbc)。

项目背景

多数据源的动态切换似乎已经成为微服务的标配功能。在经历了这么多项目之后,我发现每个项目都需要它。动态数据源需要编写aspect来实现动态切换。因此,我将这些繁琐的配置封装到一个starter中,并且可以开箱即用。

easymulti-datasource的两个模块:

easymulti-datasource-mybatis(原easymulti-datasource-spring-boot-starter)

easymulti-datasource-r2dbc (原hotkit-r2dbc)

easymulti-datasource-mybatis

mybatis版本的多数据源框架,提供声明式和编程式动态切换数据源的兴盛。 。

easymulti-datasource-mybatis自动集成mybatis-plus,提供两种动态多数据源模式,分别是主从数据源模式和非主从多数据源模式,每种数据源采用独立的连接池配置,可以针对每个数据源单独配置连接池。

支持多数据源的动态切换并不是easymulti-datasource-mybatis框架的最大亮点。 easymulti-datasource-mybatis区别于其他动态数据源切换框架的主要特点如下:

支持监听SQL,监控修改表某些字段的SQL,用于实现埋藏事件;

支持事务状态监控和事务监听器的注册,用于在事务回滚/提交时重新启动事务。完成一些后台操作;

For 详细用法请参考wiki。

依赖配置

maven中使用:

 com.github .wujiuye easymulti-datasource-mybatis ${version} 

旧版本是:

<前 > com.github.wujiuye easymulti-datasource-spring-boot-starter ${version}

版本选择注意事项如下图所示。

动态切换数据源

使用注解切换数据源:@EasyMutiDataSource;

使用切换数据源的API:DataSourceContextHolder#setDataSource。

在AOP中注册事务监听

在应用配置文件中打开跟踪事务方法调用链接的开关,配置如下。

## 监听交易方法调用link easymuti: transaction: open-chain: true

定义切面,拦截Mapper方法,在周边方法中实现更新缓存的逻辑。代码如下。

TransactionInvokeContext.currentExistTransaction:判断当前调用链接是否有事务;

TransactionInvokeContext.addCurrentTransactionMethodPopListener:为当前绑定一个监听器(PopTr​​ansactionListener) transaction ,当事务提交或回滚时调用监听器。

如上面代码所示,第一步是判断当前调用链路上是否有交易。如果存在,则在当前事务中注入监听器,监听器完成缓存更新逻辑。如果没有事务,在执行完目标方法并且没有抛出异常后,执行更新缓存逻辑。

监控SQL

easymulti-datasource-mybatis支持sql埋点监控功能,支持监控事务状态。如果当前执行的sql存在于事务中,则事务提交后会回调sql监听器。

第一步:开启SQL埋点监控功能,开启事务调用链路追踪功能。

easymuti: transaction: open-chain: true sql-watcher:enable: true

第二步:编写观察者,可以有n个或多个观察者也可以观察同一张表甚至相同的字段。

@Component @Slf4j public class TestTableFieldObserver Implements TableFieldObserver , InitializingBean { @Override public SetobserveMetadatas() { // 在这里注册你想监控哪些表的哪些字段 }                                                                        * 监控sql时同步调用* * * @param commandType 事件类型 * @param matchResult 匹配 ITEM * @return 返回异步消费者 */ @Override public AsyncConsumerobserve(CommandType commandType, MatchItem matchRes ult) {   // 同步消费 // 这是在sql执行之前。你可以在sql执行之前做一些事情,比如比较新旧数据。在这里您可以找到旧数据。 // 异步消费,当sql执行完成时,或者事务方法执行时。完成时(如果有事务),完成的意思是:正常执行完成或者方法异常退出 return throwable -> { // sql执行抛出的异常不处理 if (throwable != null) { return; } 。 ... }; } }

observe方法在监听sql时同步调用。该方法返回的AsyncConsumer会在事务提交后回调。如果事务回滚,则不会被调用。

如果乘以调用链路上发生了多个事务,那么根据事务传播机制,只有当当前方法所在的事务提交时,才会回调该事务上注册的所有AsyncConsumer。

easymulti-datasource-r2dbc

spring-data-r2dbc 版本的多数据源组件,用于反应式编程。

easymulti-datasource-r2dbc 为 spring-data-r2dbc 实现了动态路由接口,为反应式编程提供声明式和编程式多数据源的动态切换支持。它还支持两种多数据源模式,覆盖常见的多数据源使用场景,即主从模式和集群模式。集群模式最多支持配置3个数据源,主从模式支持一主一从。

添加依赖并配置数据源

使用easymulti-datasource-r2dbc后,无需再添加spring-boot-starter-data-r2dbc 对项目的依赖,也不需要添加 spring-data-r2dbc 的依赖。

easymulti-datasource-r2dbc的版本号对应spring-data-r2dbc的版本号:

easymulti-datasource-r2dbcspring-data-r2dbc
1.1.0.RELEASE

添加easymulti-datasource-r2dbc的依赖项目,如下。

 com.github.wujiuye easymulti-datasource-r2dbc ${version} < /pre>

此时,只需添加与所使用的数据库类型对应的额外驱动依赖,例如添加mysql的r2dbc驱动。

 dev.miku r2dbc-mysql 0.8.2.RELEASE 

如果使用主从模式,请使用以下配置。

easymuti: 数据库: r2dbc: 主从模式: master: url: r2dbc:mysql://127.0.0.1:3306/r2dbc_stu 用户名: root 密码: pool: max-size: 5 idel- timeout: 60 Slave: url: r2dbc:mysql://127.0.0.1:3306 /r2dbc_stu 用户名: root 密码: pool: max-size: 5 idel-timeout: 60 

Master 将被设置为默认数据源。如果配置了slave,则可以为空。虽然slave允许为空,但是如果你确实不需要更多的datasource,就没有必要使用easymulti-datasource-r2dbc。

如果使用集群模式,请使用以下配置。

easymuti:数据库:r2dbc:集群模式:第一个:url:r2dbc:mysql://127.0.0.1:3306/r2dbc_stu 用户名:root 密码:池:最大大小:5 idel-timeout: 60 第二: url: r2dbc:mysql://127.0.0.1:3306/r2dbc_stuusername: root 密码:池:max-size: 5 idel-timeout: 60 第三: url: r2dbc:mysql://127.0.0.1:330 6 /r2dbc_stu 用户名: root 密码:pool: max-size: 5 idel-timeout: 60

第一个将被设置为默认数据源,第二个和第三个可以为空。

数据源的声明式动态切换

数据源的声明式动态切换使用注解来动态切换数据源。只需要在spring bean的public方法或者类中添加@R2dbcDataBase注解即可。 ,指定注解的value属性作为使用的数据源。

示例代码如下。

@Service public class PersonService { @Resource private PersonRepository personRepository; // 方法返回值类型为 Mono test @R2dbcDataBase(MasterSlaveMode.Master) @Transactional(rollbackFor = Throwable.class) public Mono< Integer> addPerson (Person...persons) { Mono txOp = null; for (Person person : Persons) { if (txOp == null) { txOp = personRepository.insertPerson(person.getId(), person.getName(), person.getAge()); else { txOp = txOp.then(person Repository.insertPerson(person.getId (), person.getName(), person.getAge())); ; = Throwable.class) public Flux addPersons(Flux Persons) { return Persons.flatMap(person -> personRepository.insertPerson(person.getId(), person.getName(), person.getAge())) ; } }

如果是主从模式,@R2dbcDataBase注解的value属性的可选值可以在MasterSlaveMode接口声明的常量中找到;

如果如果是Cluster模式,@R2dbcDataBase注解的value属性是可选的。取值请参见ClusterMode接口声明的常量;

数据源的编程式动态切换

数据源的声明式切换的实现依赖于实现数据源的程序化切换。因此,我们也可以直接编写代码来切换数据源,而无需将方法改为public来暴露。

只需要调用静态方法putDataSource pEasyMutiR2dbcRoutingConnectionFactory提供的用于编写Context使用的数据源。代码如下。

public class RoutingTest extends SupporSpringBootTest { @Resource private DatabaseClient client; @Resource私有ReactiveTransactionManagerreactiveTransactionManager; @Test public void test() throws InterruptedException { TransactionalOperator 运算符 = TransactionalOperator.create(reactiveTransactionManager); MonoatomicOperation = client.execute("INSERT INTO person (id , name,age) VALUES(:id, : name, :age)")              .bind("id", "joe")            .bind("name ", "Joe")             .;34) .fetch().rowsUpdated() .then(client.execute("INSERT INTO person (id, name) VALUES(:id, :name)") .bind("id" , "乔") .bind ("名字", "乔")                 .fetch(). rowsUpdated())                         nbsp;.then(); // 封装交易 Mono txOperation = operator.transactional(atomicOperation); // 封装切换数据源 EasyMutiR2dbcRoutingConnectionFactory.putDataSource(txOperation, MasterSlaveMode.Slave) .subscribe(); TimeUnit.SECONDS.sleep(Integer.MAX_VALUE); } }

需要注意的是,如果需要使用事务,必须先调用TransactionalOperator对象的事务方法,然后再调用EasyMutiR2dbcRoutingConnectionFactory的putDataSource方法。

感谢您的阅读。以上就是《支持监控SQL、感知事务状态、回溯数据源的动态数据源框架是什么?》的内容。经过文章的学习,相信大家对支持监控SQL、感知事务状态、回溯数据源的动态数据源框架有了更深入的了解。具体用法需要在实践中验证。在此,小编将为大家推送更多相关知识点的文章,欢迎关注!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 支持监控SQL、感知事务状态、回溯数据源的动态数据源框架是什么?

用户评论