范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

基于ShardingSphereMybatisPlus实现影子库

  基于ShardingSphere+MybatisPlus实现影子库ShardingSphere影子库简介
  Apache ShardingSphere 通过解析 SQL,对传入的 SQL 进行影子判定,根据配置文件中用户设置的影子规则,路由到生产库或者影子库。架构图如下所示:
  应用场景
  影子库的应用场景是在全链路压测中对DB进行数据隔离。大白话就是压测数据进入影子库,用户正常请求的数据进入线上正式库,如下图所示:
  项目搭建技术框架
  SpringBoot + MybatisPlus + ShardingSphere + MySQL POM依赖                          org.springframework.boot             spring-boot-starter-web                                                                                                                                      org.springframework.boot             spring-boot-starter-test             test                               org.projectlombok             lombok             ${lombok.version}                               org.mybatis.spring.boot             mybatis-spring-boot-starter             ${mybatis.version}                               com.baomidou             mybatis-plus-boot-starter             ${mybatis.plus.version}                               com.baomidou             mybatis-plus-generator             ${mybatis.plus.version}                                org.apache.shardingsphere             shardingsphere-jdbc-core-spring-boot-starter             5.1.0                               org.apache.shardingsphere             shardingsphere-jdbc-spring-boot-starter-infra             5.1.0                               org.apache.shardingsphere             shardingsphere-shadow-spring-boot-starter             5.1.0                      影子库实现场景需求
  假设一个电商网站要对下单业务进行压测。压测相关表  t_order   为影子表,生产数据执行到  master   生产数据库,压测数据执行到数据库  shadow   影子库。
  压测标识使用ThreadLocal来存储,值为true:表示压测流量,false:表示正常流量。影子算法使用Hint 影子算法,配置的属性test: test。压测数据需要在原sql基础上添加 /*test:test*/  路由到影子库。
  建表脚本CREATE TABLE `t_order` (   `order_id` int(11) NOT NULL,   `user_id` int(11) NOT NULL,   PRIMARY KEY (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4yml配置############################## #      影子库配置 ############################## spring:   shardingsphere:     datasource:       names: master,shadow       master:         type: com.zaxxer.hikari.HikariDataSource         driver-class-name: com.mysql.cj.jdbc.Driver         jdbc-url: jdbc:mysql://127.0.0.1:3306/test?useSSL=true&charset=utf8mb4&serverTimezone=Hongkong         username: root         password: 123456        shadow:         type: com.zaxxer.hikari.HikariDataSource         driver-class-name: com.mysql.cj.jdbc.Driver         jdbc-url: jdbc:mysql://127.0.0.1:3306/test_shadow?useSSL=true&charset=utf8mb4&serverTimezone=Hongkong         username: root         password: 123456      rules:       sql-parser:         #  开启支持Hint影子算法         sql-comment-parse-enabled: true       shadow:         data-sources:           # 定义影子数据源笔名           shadow-data-source-0:             source-data-source-name: master             shadow-data-source-name: shadow         tables:           # 定义影子表t_order           t_order:             # 使用数据源别名             data-source-names: shadow-data-source-0             # 影子算法             shadow-algorithm-names:               - fltest-hint-algorithm         shadow-algorithms:           fltest-hint-algorithm:             type: SIMPLE_HINT             props:               # ShadowInterceptor拦截SQL,在原SQL后添加/*test:test*/,有这个hint就会路由到shadow库中。               test: test      props:       # 日志输出到控制台       sql-show: true  mybatis-plus:   mapper-locations: classpath*:mapper/*.xml   type-aliases-package: com.hqg.study.example.entity   global-config:     db-config:       id-type: AUTO       field-strategy: NOT_NULL   configuration:     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  swagger:   enable: trueSQL拦截器
  拦截器根据ThreadLocalUtil.isTest()来检测当前是否是压测流量,如果是的话,会在原sql基础上添加 /*test:test*/  路由到影子库。 @Component @Setter @Accessors(chain = true) @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})}) public class ShadowInterceptor extends AbstractSqlParserHandler implements Interceptor {      @Override     public Object intercept(Invocation invocation) throws Throwable {          StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget());         MetaObject metaObject = SystemMetaObject.forObject(statementHandler);          // SQL 解析         this.sqlParser(metaObject);          // 针对定义了rowBounds,做为mapper接口方法的参数         BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");         String originalSql = boundSql.getSql();          // 压测时,通过注解走的影子库         if (ThreadLocalUtil.isTest()) {             originalSql = originalSql + "/*test:test*/";         }          metaObject.setValue("delegate.boundSql.sql", originalSql);         return invocation.proceed();     }      @Override     public Object plugin(Object target) {         if (target instanceof StatementHandler) {             return Plugin.wrap(target, this);         }         return target;     } }代码测试    /**      * 测试影子库      */     @Test     public void testShadow(){         ThreadLocalUtil.setTest(true);         TOrder tOrder = new TOrder();         tOrder.setOrderId(3);         tOrder.setUserId(3);         tOrderMapper.insert(tOrder);     }结果演示
  Actual SQL: shadow ::: INSERT INTO t_order ( order_id,user_id ) VALUES ( ?,? ) /test:test/ ::: [3, 3]

在这杯解压神器面前,快乐水也黯然失色越到年底,越是躁动,内心早已进入放假模式,但还是要打起十二分精神来应对各种年终大礼包职场人拼命追赶的KPI无从下手的年终总结公开处刑的年终汇报学生党考不完的试做不完的实验写不完的论湖南卫视11。11超拼夜节目单曝光吴亦凡压轴出场嗨爆全场大家都知道每年的双11晚会,各大电商平台都会请来很多的大牌明星嘉宾前来助阵,只有大家想不到的没有双11晚会做不到的!而随着双11的临近很多小伙伴造就翘首以盼今年的晚会,尤其是湖南卫春节送礼送什么?鹰牌高颜值新年礼盒带你免除不会送礼的焦虑新年新气象,今年你立了新的flag吗?是脱单加薪还是健康。作为当代打工人,少一点加班和焦虑,多一点头发和工资,是我们共同的愿望。然而,打工人的春节假期前,却还将迎来各种工作冲刺阶段一款产品如何满足全家需求?恒洁卫浴为你轻松搞定上有老下有小,家庭生活虽然美满和睦,却要照顾到方方面面。以卫浴空间的体验来说,就需要照顾到不同家庭成员的需求。但是以马桶为例,家庭中不可能按照每个人的需求一人一台,那么,又该如何更10个超强家居装饰小妙招床头半堵墙床头的一堵半高假墙其实能放很多东西,却占用不了多大空间。书墙抠出阅读角书墙中抠出了一块阅读区,很有味道很舒服,大量使用靠垫也是技巧之一。在朴素中添加细节不是个很大的卧室,新环境下企业发展该如何推进?丁威先生表示要拥抱变化企业发展从来都不是一件容易事,如何应对市场的变化经济大环境的变化,是一个需要不断深入思考的问题。丁威先生认为,企业发展要敢于变化勇于变化拥抱变化。在丁威先生看来,企业成功靠的不是规e万种超会生活,你学fei了么?今天你今天你饿饿饿饿饿了么?听说当代年轻人已经不满足于只用饿了么叫餐了,手机膜突然碎了,打开饿了么!牙刷沾水后才发现牙膏没了,打开饿了么!到了海边才发现忘带防晒,打开饿了么这得益于联想YOGAPro14sCarbon2022发布在即,亮点提前知在今晚(11月2日)1930分,联想将举办秋季轻薄新品发布会,届时也将发布新品联想YOGAPro14sCarbon2022。抢在发布之前,我们先来了解一下这这款新品的亮点。据了解,实力所属,众望所归!中兴Axon30入选最受欢迎5G手机名单随着5G网络的广泛普及,5G手机已成为广大消费者的购机首选。国内厂商纷纷在该领域的持续发力,市面上涌现出非常多的优秀5G手机,极大丰富了消费者选择。近日,知名周刊通信世界评选出最受停更对李子柒的影响有多大?观众们已经等不及看新视频了前段时间,关于李子柒停播的事情在网上掀起了轩然大波,不少人都很好奇为什么李子柒会停播。虽说现在的各种自媒体视频很火,但李子柒的风格很难复制,而且出片质量很高,已经积累了扎实的粉丝群消费者在期待什么?互联网大会丁磊不仅是技术,还有超前的理念9月26日至28日,2021年世界互联网大会乌镇峰会在乌镇举行,互联网圈科技界大咖云集,精彩观点的交锋也奉上了一场场思维碰撞的盛宴。作为新世界第一科技豪华品牌,华人运通高合汽车受邀
iPhone14Pro设计定稿,感叹号屏4800万主摄2TB存储,加量不加价众所周知,每一代iPhone新机在发布之前,各种设计配置消息满天飞。尽管iPhone13系列发布还没几个月,而距离9月份新机发布还有好几个月时间,但有关iPhone14系列的消息几求电脑高手指点迷津电脑大神在哪里?最近新搞了一下电脑CPU换成了12400,主板是华硕primeB660plusD4,加了一根海盗船32G内存,显卡硬盘机箱都没换!等以后4080能两千买到手的时候再买手机不能小气,2022年最值得入手的3款手机,几乎零差评很多消费者在买手机的时候喜欢斤斤计较,但在商场上,一分钱一分货。所以买手机不能消息,2022年最值得入手的3款手机,快看看有你喜欢的手机吗?第一款小米12Pro秉承着买新不买旧的原4款1500元档手机,均是物超所值,售价更加良心曾几何时,卢伟冰发布首款2000元内5G手机,搭载骁龙765G,发布价就是1999元起,很多网友直呼良心,卢伟冰就是做慈善!时间没过多久,千元市场的手机已经破防了,搭载骁龙870天老牌厂商彻底爆发,骁龙8708GB运存,屏下摄像头手机不足2000元在功能机时代,最受欢迎的国产品牌是华为,中兴,酷派和联想,在当时这四个品牌也尊称被称为中华酷联。随着后来智能手机兴起,这四个品牌只有华为混得比较好,不过近年来华为的遭遇大家也都看到如何把照相机当作直播摄像头如何用照相机当直播摄像头呢?这是很多网友想学会的方法。(这里以型号为索尼a7m3的相机为例)首先我们要打开浏览器进入这个网站,httpsimagingedge。sony。netzhTCL发布5款30系列手机,起售价139欧元IT之家2月28日消息,以智能电视系列而闻名的中国制造商TCL今日发布了五款新的入门安卓智能手机,新机属于其30系列。与今年早些时候为美国市场推出的TCL30XE5G和TCL30V手机不停地收到大量验证码短信怎么办?简单设置有效屏蔽轰炸短信网上有很多网友反应手机莫名其妙不停地收到大量验证码短信怎么办?手机在收到短信的时候会有短信铃声和通知提醒,要是一直有短信的话肯定会严重影响手机的正常使用。一直收到验证码短信怎么办碰刚交付就召回!全年交付没有一家破千?美国造车新势力们真实情况电子发烧友网报道(文梁浩斌)在20142015年,国内推出了多项针对新能源汽车的优惠政策,自此掀起了一股电动汽车创业的热潮,一时间各路资本涌入造车赛道。到2017年底的统计数据中,支持1小时闪充,最高续航200公里,这3款电动车,解决充电的痛点您在阅读前请点击上面的关注二字,后续会为您提供更多有价值的相关内容,感谢您的支持。无论是上下班代步,日常接送孩子买菜购物出行,还是从事于外卖快递等配送行业,电动车都是一个不错的出行江西人速看!3月1日起,这些新规将落地实施3月起一批新规将正式落地实施一起看看,哪些与你息息相关全国新规四部门不得利用算法对消费者实施不合理价格差别待遇国家网信办等四部门联合发布互联网信息服务算法推荐管理规定,自2022年