自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

梵高

世间皆苦

  • 博客(207)
  • 问答 (1)
  • 收藏
  • 关注

原创 日均千万订单的供应链交易平台设计稿

平台业务主要是售卖电子商品,之前的架构,主要分为平台商家和自营店。

2024-09-18 20:20:25 784

原创 短链接系统设计方案

设计一个短链接系统.

2024-08-18 18:04:34 891

原创 购物车系统设计方案

在电商领域,购物车(Shopping Cart)扮演着至关重要的角色,它是连接用户浏览商品与最终完成购买行为的桥梁。

2024-08-18 11:42:42 633

原创 交易系统JVM内存优化

交易系统配置:JDK8、4C8G、垃圾回收器(PreNew + CMS)

2024-08-17 21:36:25 1007

原创 交易系统创单接口优化

交易系统最为重要的一个功能就是收单,而创单接口的性能和rt成为了我们关注的重点问题。

2024-08-17 15:42:24 420

原创 订单全局唯一ID设计方案

交易系统最重要的就是收单,庞大的订单量如何保证订单号唯一,成为了目前我们要解决的问题。

2024-08-17 13:40:47 281

原创 订单数据最终一致性解决方案

主要采用了基于TCC思想的TOC柔性事务补偿方案.

2024-08-17 12:40:10 692

原创 单库平滑迁移至分库分表架构方案

如何将同一个交易系统的数据由单数据库表平滑迁移至分库分表的数据库表中,成了目前主要的问题。

2024-08-15 18:43:31 396

原创 系统重构新旧流量平滑迁移方案

如何让前置流量从旧系统平滑迁移至新系统,成为了我们现在主要解决的问题。

2024-08-15 15:03:16 1060

原创 基于Kahn算法|动态线程池,支持扩展点并发执行|召回|过滤

针对于一次会话,同时会调很多外部服务,同时这些RPC服务会有多种直接或间接的关系,是否有更高效的方式能够让我们的一次会话时间变更更高效,同时也能够保证系统的相对稳定性呢?

2024-08-04 12:25:36 560

原创 分布式领域扩展点设计稿

作为一名工程师,我深知一个框架引入到系统中会带来很大的便利,但同时也会让系统设计和架构升级以及业务迭代变得更加复杂。

2024-08-03 17:44:44 1395 5

原创 商品中心防止缓存热key击穿的解决方案

缓存热key一旦被击穿,流量势必会打到数据库,如果数据库崩了,游戏直接结束。

2024-07-27 15:02:21 528

原创 美团到家平台业务探索

到家业务发展已经近10年,目前最为火热的应该有美团到家、抖音到家等,这种极具挑战性的业务,值得学习和思考。

2024-07-12 14:03:35 1394

原创 多级缓存架构最佳实践

缓存架构的最佳实践

2023-05-30 02:07:11 2594 6

原创 企业如何从SpringBoot应用平滑迁移到云原生K8s平台

企业从SpringBoot应用向云原生转型技术解决方案

2023-05-28 23:33:22 1485 7

原创 【Netty系列・高级篇】Netty核心源码解析

注意发送的数据未必能够一次读完,因此会触发多次 nio read 事件,一次事件内会触发多次 pipeline read,一次事件会触发一次 pipeline read complete。NioEventLoop 线程不仅要处理 IO 事件,还要处理 Task(包括普通任务和定时任务),主要任务是执行死循环,不断看有没有新任务,有没有 IO 事件。我们就来看看 netty 中对下面的代码是怎样进行处理的。nio 中如下代码,在 netty 中的流程。启动 EventLoop 主循环。

2023-02-27 10:05:55 1819 74

原创 【Netty系列・中级篇】序列化算法优化、参数优化、RPC设计与实现

SO_TIMEOUT 主要用在阻塞 IO,阻塞 IO 中 accept,read 等都是无限等待的,如果不希望永远阻塞,使用它调整超时时间。在 linux 2.2 之前,backlog 大小包括了两个队列的大小,在 2.2 之后,分别用下面两个参数来控制。第 1,2,3 个客户端都打印,但除了第一个处于 accpet 外,其它两个都处于 accept queue 中。目前的代码仅支持 Java 自带的序列化,反序列化机制,核心代码如下。序列化,反序列化主要用在消息正文的转换上。

2023-02-24 13:47:26 1399 98

原创 【Netty系列・初级篇】粘包与半包解决方案、协议设计、聊天室设计

魔数,用来在第一时间判定是否是无效数据包版本号,可以支持协议的升级序列化算法,消息正文到底采用哪种序列化反序列化方式,可以由此扩展,例如:json、protobuf、hessian、jdk指令类型,是登录、注册、单聊、群聊… 跟业务相关请求序号,为了双工通信,提供异步能力正文长度消息正文/*** 用户管理接口/*** 登录* @param username 用户名* @param password 密码* @return 登录成功返回 true, 否则返回 false。

2023-02-23 09:08:44 950 1

原创 【Netty系列・扫盲篇】Netty从入门到学废

Netty技术

2023-02-22 10:15:28 940

原创 【Netty系列・NIO】一文读懂NIO:三大组件、 文件编程、网络编程、IO模型

non-blocking io 非阻塞 IOchannel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层channelbuffer常见的 Channel 有buffer 则用来缓冲读写数据,常见的 buffer 有selector 单从字面意思不好理解,需要结合服务器的设计演化来理解它的用途socket1t

2023-02-20 16:03:02 2126 89

原创 【Mybatis源码解析】一级缓存和二级缓存源码解析

新版的源码并没有太多改变,发送请求时,先从二级缓存中取,未取到则去一级缓存中取,仍未取到会去数据库中查,再存到一级缓存中,当事务提交之后,会存到二级缓存中,值得注意的是,mybatis中的一些cashe相关类挺有意思的,用来解决不同场景的问题,比如脏读。MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。useCache :是否用缓存,默认为true。

2023-02-17 18:04:19 2215 3

原创 【Mybatis源码解析】mapper实例化及执行流程源码分析

基于SpringBoot的Mybatis源码解析:1.如何对mapper实例化bean在加载BeanDefinition时,会将SqlSessionFactory、SqlSessionTemplate、MapperScannerConfigurer加载到注册表中,以供后续进行实例化。而且在此期间,mapper接口已经实例化完成了,后续从缓存中取出即可。初始化时,第一步,使用SqlSessionFactoryBean来生成SqlSessionFactory。

2023-02-16 17:07:51 2898 133

原创 【SpringBoot3.0源码】启动流程源码解析 •下

最后返回一个SpringApplicationRunListener实例。显式删除代理的目标(如果已注册),以避免对同一侦听器进行双重调用。add到applicationListeners的set集合中。根据不同的web类型创建不同实现的Environment对象。读取项目中环境变量、jvm配置信息、配置文件信息等。设置了一些初始化器和监听器,接下来我们讲解下。

2023-02-14 15:53:49 5107 36

原创 【SpringBoot3.0源码】启动流程源码解析 • 上

SpringBoot启动类:步入方法:这里分为两步:初始化步入SpringApplication的构造方法中:首先获取资源加载器、保存primarySources属性、web类型,设置初始化器和监听器,获取main方法所在的类重点看一下获取初始化器和监听器这部分。在此之前,看一下271行的代码:在SpringBoot的老版本中,是没有这快代码的,这里主要是提前加载一些初始化器、监听器和其他配置放入缓存中,以便后续获取。步入方法中:最终来到这里:这里首先构造一个加载器,再去调用load方法。步

2023-02-13 16:13:03 2285 71

原创 【Spring6源码・MVC】请求处理流程源码解析

值得一提的是我们这个demo没有文件,也没有参数,所以撸流程还是很容易的,如果有参数还要注意是如何解析参数的,如果用@RequestParam注解的话,直接通过反射就可以获取到,Spring也提供了处理这个注解的解析器,如果不加注解,会默认使用名称绑定,底层用asm框架读取字节码来获取参数名称,所以编码记得用@RequestParam声明参数,之后会放进一个缓存数组中,在。我们知道,在IOC容器加载的同时,初始化了registry这个HashMap,这个HashMap中存放了请求路径和对应的方法。

2023-02-10 18:09:09 2027 72

原创 【Spring6源码・MVC】初始化registry,完成url和controller的映射关系

首先调用createRequestMappingInfo方法,获取方法上的数据,包括请求类型和请求路径,最后封装成RequestMappingInfo类。综上所述:再启动SpringBoot项目的时候,就已经解析了所有的请求路径和对应的请求方法,并且将他们封装进registry这个HashMap中。紧接着,依旧调用createRequestMappingInfo方法,上面那个参数是方法,那么就会解析方法上的请求类型和请求路径。之后就可以通过请求路径来找到对应的方法,然后去invoke方法。

2023-02-10 11:27:27 2035 70

原创 【SpringBoot3.0源码】自动装配源码解析

根据前面几章,我们对IOC源码的分析,应该不难理解:我们先去扫描指定的包下所有的@Component、@Configuration,以及配置类内的@Import、@Bean等。所谓自动装配,就是自动将第三方jar包的配置类注入到IOC容器中,常见的xxx-spring-boot-starter。自动装配应该是SpringBoot最有东西的标志,因为可以通过这种约定大于配置的设计,让编程变得简单,让工资变的更低,让java开发不在有门槛。既如此,我们可得知启动SpringBoot后,会将。

2023-02-07 12:52:17 1321 4

原创 【SpringBoot3.0源码】内置tomcat启动源码解析

又是这两个方法,我就不点进去看了,这一看不就是先去根据web服务工厂类型找beanName,底层应该还是遍历所有的beanDefination,在这里肯定就是SpringBoot自动装配,把相关的类已经封装成beanDefination了。也就是说,Tomcat服务器的启动带动了IOC容器的加载。前面谈到IOC的时候,讲过这个方法,这个refresh方法,使用了模版设计,可以提高代码复用性和扩展性。SpringBoot内置了Tomcat,那就是相反,IOC容器的加载,伴随着Tomcat服务的启动。

2023-02-07 01:39:59 1152 5

原创 【Spring6源码・事务】事务核心源码解析

这里怪我了,我应该写两个sql操作的,但是流程太过繁琐,比如事务的隔离级别我并不能一一枚举出来,而且,我也没有写SpringBoot3的一些源码,就用SpringBoot环境来讲解,是有一些麻烦。这里会提交事务,当然在提交事务之前会判断这个是不是新事务,如果是新事务则会提交事务,如果不是新事务,则会保存当前事务,跳出当前事务后,执行新事务,一并提交。这里有两个核心步骤:第一个步骤是返回一个包含事务相关信息的事务状态,第二个步骤是将事务信息设置进线程本地变量。,我们知道事物的代理对象是如何创建的。

2023-02-06 17:12:33 1300 3

原创 【Spring6源码・事务】事务的代理对象的创建

其内部有个静态内部类,里面还有两个静态内部类,一个是JDK动态代理配置,一个是CgLib代理配置。那么问题来了,org.springframework.transaction.config.internalTransactionAdvisor对象又是在什么时候加载的呢?当然了,这只是冰山一角,SpringBoot3.0的坑,我给你们慢慢踩,你们慢慢看,哈哈哈哈哈。类,应该是被Spring6移除了,那这个时候就因应该看Mybatis有没有什么解决办法了。

2023-02-06 12:54:11 1034 3

原创 你说反射有点难追,我觉得应该知难而退。

我们来好好看看这个方法,这个方法中是反射修改属性的核心方法,包括修改静态属性、final属性、volatile属性等。步入setInt()方法,注意这三个红色框框:一个是上面我们抛出的错误,这里主要是解包失败,类型没匹配成功。完结了,撒花,又浪费10分钟写文章,你们谁要是看到这里,就帮忙看看上面为什么修改属性类型之后不能设置值?它里面会有一下setXx、getXx方法,除了set()方法之外,其余都是抛出非法参数异常。jdk8:类型是可以转换成功,但是值设置不进去,具体原因不详,谁知道记得评论告诉我。

2023-02-01 17:29:36 2826 8

原创 【Spring6源码・AOP】AOP源码解析

让我们看看是如何进行转换的,步入registry.getInterceptors方法,初始化拦截器集合,获取Advice【切面相关的配置】,对适配器进行循环,找到符合的拦截器,然后加入我们初始化好的拦截器List集合中,创建完代理对象之后,最终,会真正的执行我们的目标方法,但是步入该方法,会进入cglib代理类的拦截方法。调用after方法。不行了,我得去吃饭了,妈妈叫我吃饭了,呜呜呜,你们自己看看,挺简单的。好了,好了,累死了,好像有个问题没有写,就是三级缓存相关的,明天吧,专门给三级缓存写一篇。

2023-01-17 17:04:08 1372 3

原创 【Spring6源码・AOP】代理对象的创建

前几章bean实例化之后,我们对bean进行了属性填充,紧接着就会调用initializeBean()方法返回该bean的代理对象,如果不需要被代理,那么就会直接返回该bean。然后就是调用 createProxy 方法创建代理对象,这里做了一个判断,如果这个bean包含一些切面的配置,那么就会调用createProxy对bean创建代理。因为我们这里的bean是testImpl,所以,我们这里使用的是cglib代理。最终,会真正的执行我们的目标方法,但是步入该方法,会进入cglib代理类的拦截方法。

2023-01-16 09:34:36 512

原创 【Spring6源码・IOC】Bean的初始化 - 终结篇

上一篇,我们实例化了bean之后,将bean放入了第三级缓存,看一下这个addSingletonFactory方法,如果一级缓存中没有对应的bean,那么会将未初始化的bean放入三级缓存,会将bean提前暴露出来。我们来一起看一下这个处理属性的doWithLocalFields方法,首先通过getDeclaredFields方法获取类的属性集合,然后进行遍历调用函数去处理。这里主要有两点,一个是针对属性上的注解,一个是针对方法上的注解,大部分的时候会放在属性上,也有时候会放在方法上,比如set方法上。

2023-01-12 10:10:44 6596 185

原创 【Spring6源码・IOC】Bean的实例化

bean的实例化

2023-01-09 14:02:28 4032 7

原创 【Spring6源码・IOC】BeanDefinition的加载

环境:Spring6、SpringBoot3.0、JDK17多看注释梳理整体设计思想IOC是一个容器,对象的创建、使用和销毁都是由IOC容器来管理。《五分钟带你速通Spring IOC》加载配置文件(XML\YAML…)、配置类,并解析成BeanDefinitionBeanFactoryPostProcessor对BeanDefinition做一些处理实例化bean对象初始化bean对象(属性填充等),并且在初始化前后通过BeanPostProcessor对bean对象进行相关处理。

2023-01-06 05:27:27 6994 42

原创 Java程序猿如何用Supplier来优化代码?

之前的文章《Supplier的作用及其使用》提到过Supplier,昨天后台有小伙伴问到有没有实际的案例。今天来分享一下实际项目的用法,以此提高代码的健壮性。log日志打印,大家都应该不陌生,生产上不会用System.out.println()的方式,因为可能会造成死锁。我们日常调试可能都会用debug模式进行,然后生产环境的日志级别是info,debug不会输出,但是这里的入参只是不会输出,但是会执行,这样一看来,不是太影响自己代码的质量了么?有没有一种方式,如果不是debug模式,就不执行,是dub

2022-12-05 15:39:07 748 10

原创 Volatile有什么作用?

文章目录volatile有什么作用?可见性证明指令重排证明不能保证原子性证明Volatile与Synchronized的区别volatile有什么作用?保证线程的可见性禁止指令重排但是不能保证原子性可见性证明有如下静态成员变量num,初始值为0;有两个线程,一个是main主线程,另一个是子线程,让子线程休眠2秒,触发主线程的死循环,2秒后,子线程开始修改值为100,此时主线程的死循环仍未停止,由此可证,线程之间不可见。在num前加上volatile关键字之后,主线程的死循环立刻停止,由此可

2022-11-29 16:05:55 487

原创 Object o = new Object()占用多少字节?

文章目录工具查看内存分配Java内存模型访问对象方式GC为什么Survivor要分为两个区域(S0和S1)?Survivor 为什么不分更多块呢?对象的生命周期小知识工具查看内存分配Object o = new Object();占用多少字节,我们借助openjdk的工具来看一下:Maven依赖<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core<

2022-11-28 16:48:11 3820 3

原创 午休时间,手写了红黑树,转啊转~变啊变~

午休时间,手写了红黑树,转啊转~变啊变~

2022-11-25 19:19:38 522 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除