- 博客(7)
- 收藏
- 关注
原创 基于渠道、租户动态加载spring bean
背景在做saas项目时,我们既想统一接口提供给各端调用,又希望各端在通用功能基础上做差异化定制,并满足不同租户做个性化定制的诉求,代码层面我想好好设计一下,其中比较关键的一步就是如何动态的根据渠道和租户加载不同的实现,本文将围绕“统一接口”、“渠道定制”、“租户定制”方面进行实现。概念抽象上面我们抽象出来两个概念,渠道和租户。渠道比如pc页面、移动app1、移动app2,租户就是我们saas系统中不同的商家。由简入难,我们先提供一个基础功能,渠道和租户基于基础功能可定制可不定制,不定制就默认使用基础实
2020-10-17 22:54:01 252 1
原创 Mysql索引结构
Mysql索引是一种经过排序的数据结构,究竟是什么样的数据结构呢,我们来谈一下常见的几种数据结构的演变历史。二叉查找树特征:任意结点(包括根结点)的左子树上的结点的值都比这个结点得值小;任意结点(包括根结点)的右子树上的结点的值都比这个结点得值大输入一组数据:8,5,9,7,10,4 可以看到这种结构:二叉查找树-输入无序树高度为3,遍历。。。如果我们输入一组有序的数据呢,4,5,7,8,9,10 会变成什么样子?二叉查找树-输入有序这个时候树的高度为 6,遍历。。。,很...
2020-09-04 11:19:10 156
原创 javaagent + javassist实战
提供的能力可以让我们在main之前、之后做一些事情。提供的能力可以动态修改字节码,可以在不修改源码的基础上动态编译class文件。我们尝试基于现有服务通过javaagent+javassist的方式对原类做功能增强,开始!原服务:wsth增强代理工程:javagentwsth启动类或main函数配置jvm启动参数:-javaagent:/xxx/javagent/target/javagent-1.0-SNAPSHOT.jar...
2020-08-31 17:56:01 1271
原创 aviator实战
aviator规则引擎轻量、高性能可以帮我们解决很多配置规则的问题官方文档参考:https://www.yuque.com/boyan-avfmj/aviatorscript实战一把aviator,举个栗子对年龄在40岁以内、职级大于等于3的“宋姓”销售人员发放提成,提成计算公式=“销售量 * 单件提成金额 * 10%”代码设计:上述逻辑抽象出两个规则表达式:"age <= 40 && clazz >= 3 && string.startsWith
2020-08-25 17:17:34 1083
原创 Groovy加载spring bean
强大的groovy框架,可以帮我们解决很多问题,今天我们聚焦其中一个场景简单介绍其功能。有时我们遇生产数据问题,我们在修复时可能直接写sql比较复杂,又没有现成的运维接口可以使用,这时怎么处理呢,一般情况下就是现开发代码上线后调用运维接口,这就涉及到要发包的过程了,如果我们不想发包能不能有什么办法处理类似场景呢,我们来看下groovy能帮我们做什么?不建议经常使用此类功能处理生产问题我们先写一个接口做新增用户的动作@RestController@RequestMapping("/user")@S
2020-08-14 18:23:25 828
原创 springboot单元测试丢失异步任务
@Testvoid test(){ //注册jvm关闭钩子函数 Runtime.getRuntime().addShutdownHook(new Thread(() -> log.info("钩子开始执行:{}, {}", Thread.currentThread().getName(), Thread.currentThread().isDaemon()))); log.info("{}-{}", Thread.currentThread().getName(), Thread.
2020-08-13 20:55:12 1245
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人