- 博客(18)
- 收藏
- 关注
原创 基于WebFilter实现断言和转发的灰度流量控制方案
因为涉及到的项目是交易核心链路,这也是灰度的重要作用。在进行核心链路的重构替代的时候,必须使用灰度方案,逐步进行迁移。落实到具体操作就是,前期只对小商家、非核心商家的流量路由到Go,确保Go项目没问题再逐步提高灰度的比例。一个好的需求要实现可灰度、可回滚、可监控。
2024-04-23 15:27:49
1434
4
原创 AspectJ框架的解析及应用
运行类->右键单击->Run As->Run.,可以在弹出的Run设置窗口设置该类的各项运行属性,切换到ArgumentsTab页,在VM arguments中通过-javaagent指定Aspect织入器类包。相比于加载时织入和运行时织入,编译时织入在编译阶段就将切面织入到目标类的字节码中,这样在程序运行时就无需再进行切面的织入操作。LTW是一种在类加载时织入切面的方式。与CTW和RTW相比,加载时织入提供了更大的灵活性,并且可以在不修改原始源代码的情况下,将切面逻辑应用到已编译的类中。
2024-04-12 15:24:52
801
原创 Go语言抽象自定义 Tag 及其处理方法
在Go语言中,结构体字段可以附带一个可选的字符串标签(Tag),该标签用于在运行时通过反射获取字段的元信息。标签是结构体字段后面紧跟着的一段以反引号包裹的字符串。Tag由一个或多个键值对组成,键值对中间由空格隔开。在Go中,通过反射可以在运行时获取结构体字段的标签信息,用于动态地处理结构体。Name string `json:"name" doc:"我的名字"`for i := 0;i++ {return docfmt.Printf("name字段为:%s\n", doc["name"])
2024-04-02 18:33:36
922
1
原创 策略模式链路任务的抽象异常处理方案
如上,交易系统会对接很多不同的第三方扣款服务,比如说paypal、onekpay等。交易系统向第三方扣款服务发出请求,然后会收到对应的信息。下层服务包含两个方法,链式调用,也就是第一个方法出错的话,第二个方法也会出错。比如说返回的是json信息,就会对这个json信息解析并处理。但是由于第三方服务的不可控,假如返回了一些非json数据的context,就会导致解析失败,返回null,但不会停止。这个错误的context会继续往下传递,进入到下一个方法,这个方法对这个错误的context处理,从而产生空指针。
2024-03-21 14:47:37
1271
1
原创 Apollo配置中心迁移Consul落地技术方案(Spring项目)
实习接到的第一个需求,网上找遍资料也没有Apollo迁移Consul的具体文章,所以还是自己动手来做。Apollo相对Consul提供了更多方便实用的api,所以在代码方便需要改动的地方比较多,这也是本文的重点。公司相关信息已做隐私处理。
2024-03-07 16:51:33
1500
2
原创 SpringBoot的基本原理
在这个过程中,虽然会生成Bean的原始定义,但由于循环依赖的存在,无法将完整的Bean放入三级缓存中。在传统的编程模式中,开发者需要自己创建对象并处理对象之间的依赖关系,而在IoC模式下,容器负责管理对象的创建和依赖关系。容器的一种具体实现。它是Spring框架的核心容器,负责管理Bean的生命周期和依赖关系,并提供了丰富的功能和灵活的配置方式。Spring的二级缓存无法解决代理对象的问题是因为代理对象的创建需要在Bean的初始化阶段进行,而二级缓存是在Bean的实例化阶段进行的,为此引入了三级缓存。
2023-09-19 18:11:06
429
原创 线程池相关原理
5、workQueue:当没有空闲核心线程时候,新来的任务会加入到此队列,队列满会创建救急线程执行任务;6、threadFactory:线程工厂,定制线程对象的创建,比如设置线程名字,是否守护线程等;3、keepAliveTime:救急线程的生存时间,生存时间内没有新任务,此线程资源会被释放;2、maximumPoolSize:最大线程数目,等于核心线程数+救急线程的最大数目;7、handler:拒绝策略,核心线程繁忙,workQueue也放满时的策略。1、corePoolSize:线程核心数目;
2023-09-18 17:35:49
367
原创 【设计模式】单例、工厂、装饰器、代理、适配器
代理模式是一种结构型设计模式,它允许通过代理对象来控制对其他对象的访问。代理模式通过在代理对象和目标对象之间添加一层间接层,来实现对目标对象的间接访问和控制。在代理模式中,有三个核心角色:1. 目标对象(Subject):被代理的对象,它定义了代理对象所要代理的方法。2. 代理对象(Proxy):代理目标对象,它持有对目标对象的引用,并在其自身的方法中调用目标对象的方法,可以在调用目标对象方法前后添加额外的逻辑。3. 客户端(Client):使用代理对象的对象,它通过代理对象来访问目标对象。
2023-09-16 17:45:21
396
1
原创 2023.9.7 SpringAOP
早上一节软件工程课,我真不懂为什么这课能上的像文科一看,全是概念,什么软件开发的流程,照例写两道力扣。写了两道多维动态规划的第一道,在只能往下或往右走的二维矩阵从左上出发求到达右下的最小路径。之前讲过,动态规划一定要留意初始化,这道题就要对最左和最上初始化,因为只有一种路线,所以唯一值也是最小值。之后就可以从[1][1]开始计算了,昨天讲过,到达某个位置只有从左边或者上边到达,所以从两个之中选一个,加上本身就可以了。第二道,求两个字符串的最长公共子序列,注意是按顺序的。
2023-09-07 19:27:57
301
原创 手写RPC远程服务调用框架各功能实现原理
这部份相比上面实际几个实际功能实现就略显抽象了。自定义通信协议是指开发人员可以根据自己的需求设计和实现的用于在客户端和服务器之间进行通信的规则和格式。具体能够自定义的内容包括但不限于下面几种:1、消息格式:自定义通信协议需要定义消息的格式,包括消息头和消息体。消息头可以包含一些元数据信息,如消息类型、消息长度等。消息体则是具体的业务数据;2、序列化和反序列化:通信协议需要定义数据的序列化和反序列化方式,将数据在网络中进行传输。常见的序列化方式有JSON、XML、Protobuf等。
2023-09-06 16:57:29
683
1
原创 2023.9.6 类加载器和双亲委派模型、ClickHouse和PostgreSQL
类加载器对于一个类是否唯一起重要的作用,判断两个类是否相等,前提就是看这两个类是否是由同一个类加载器加载的,否则即使来自同一个Class文件,它们也是不同的两个类。双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。
2023-09-06 14:04:57
281
1
原创 2023.9.5 JVM类加载过程、Netty底层NIO模型的底层实现原理
开始,顾名思义,阻塞的IO,BIO是最传统的I/O模型,它是同步阻塞的。当然,我的程序中也进行了简单的优化,我会在接受到新的连接之后,单独创建一个线程去处理它,不过这不是一劳永逸的方法,随着连接数的增多,性能也会有下降;了,NIO是Java 1.4中引入的一种非阻塞I/O模型。这题一眼看上去倒是简单,无脑叠乘积就行,但是这题有负数的存在,所以要同时维护一个dpMin来防止"闲鱼翻身",时间复杂度是O(n),dpMax[i]指的是以nums[i]为结尾的子数组的最大乘积和,看代码应该能直接看懂,就不细说了。
2023-09-05 22:23:46
252
原创 2023.9.4 内存分配与回收策略、Redis优化业务
对象在Eden区中诞生,经过一次Minor GC后仍存活,会被转移到Survivor区中,并将其年龄设置为1岁,在Survivor区中没存熬过一次Minor GC,年龄就会增加1岁,当增加到15岁(默认)就会进入老年代,因为对象头中存储分代年龄的大小是4比特,所以只能记录到15岁,而年龄阈值是可以修改的;第一道,经典跳跃问题,用贪心算法写,只关注能跳到的最远距离,并且暂定为当前位置,遍历数组,寻找最远的位置,当最远位置大于数组最后一位时返回true。4、动态对象年龄判定,上面讲的是比较死板的年龄判定方法。
2023-09-04 21:13:42
299
1
原创 2023.9.3 三色标记、Shenandoah和ZGC收集器、Redis消息队列
从前,需要在对象上存放一些个别的信息,通常会在对象头中添加额外的字段,但是在对象移动的过程中,怎么确保这些数据的可访问性问题呢?(2)原始快照要破坏的是第二个条件,当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次。(1)增量更新要破坏的是第一个条件,当黑色对象插入新的指向白色对象的引用关系时,就将这个新插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次。
2023-09-03 18:56:04
246
原创 2023.9.1 经典垃圾收集器、分布式锁的实现、Redisson
学习了一个基于Redis实现的高并发场景下的分布式锁框架Redisson,这个框架实现了可重入锁,底层结构是Redis的Hash结构,通过记录线程的uuid和当前锁的重入次数实现。最后学习了秒杀场景下的结构优化,可以先把完成结果返回给用户,而需要写进数据库的信息先暂时存放在阻塞队列中,让后台执行,这样可以优化用户体验,下面直接放总结。今天周五,只有早八一节课,数据库的课,讲了一大堆连第一句sql都没讲,也罢,大学的课都是这样的,遂台下写力扣。但是与CMS不同的是,最后一个阶段G1是需要STW的。
2023-09-01 21:46:05
198
1
原创 2023.8.31 垃圾收集算法、高并发场景下通过互斥锁和CAS解决单体问题
4、标记-整理算法,与标记-清除算法类似,只是会让存活的对象往内存的某一端移动再进行清理边界以外的内存,这种做法虽然可以节省空间也可以减少内存碎片的产生,但是移动对象会消耗额外的性能,因为要重新更新该对象下的所有引用,基于这点有一种"和稀泥"的做法,就是暂时用标记-清除算法,当内存碎片多到无法容忍时再采用标记-整理算法。这缺点是执行效率不稳,如果存在大量需要被清除的对象,那么就必须进行大量的标记、清除动作,对象越多效率越低,也会产生大量内存碎片,分配内存的时候有些内存碎片可能不能使用,造成空间浪费;
2023-08-31 22:02:24
149
原创 2023.8.30 判断是否GC的算法、Redis存在的三种问题及解决方法
另一个叫可达性分析算法,通过维护一个GC Root Set来寻找所有与GC Roots(根对象)存在引用链的对象来标记不应该被回收的对象,当然GC Roots与一个对象存在引用链,而这个对象与其他对象存在引用链,那么这个其他对象也不该被回收,以此类推。2、如果一个对象只存在"被引用"和"不被引用"的两种状态,这样不利于性能优化,所以引出对象的四种引用状态:强引用,通过new创建出来的,只要强引用关系而在,就永远不会被回收;一共两种情况,一个是第i-2加上i,另一个是i-1。
2023-08-30 21:20:24
180
原创 2023.8.29 JVN运行时数据区、Redis代替Session实现登陆验证
第二道,查找排序数组中目标元素第一次和最后一次出现的位置,用二分查找挺快的,设置两个方法,一个查第一次出现,优先往左二分,另一个方法查最后一次出现,优先往右二分。另一个时摩尔投票法,时间复杂度更低。简单说下个人情况,目前学习完SpringCloud及各种中间件,有过两段实习,一段测试一段开发,学历是广州一本科班。第一道,搜索二维递增矩阵的目标值,还算简单,从右上角开始设置一个搜索值,大于目标值则左移,小于目标值则下移。3、学习了对象的内存布局,java的对象必须是8字节的整数倍,字节一般时4字节或8字节;
2023-08-29 22:13:51
270
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人