自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

梵高

世间皆苦

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

原创 到家平台业务探索

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

2024-07-12 14:03:35 1165

原创 【技术解决方案】(多级)缓存架构最佳实践

缓存架构的最佳实践

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

原创 【技术解决方案】企业如何从SpringBoot应用平滑迁移到云原生K8s平台

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

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

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

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

2023-02-27 10:05:55 1664 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 1356 98

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

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

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

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

Netty技术

2023-02-22 10:15:28 600

原创 【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 1746 89

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2023-01-16 09:34:36 489

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

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

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

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

bean的实例化

2023-01-09 14:02:28 4008 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 6872 42

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

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

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

原创 Volatile有什么作用?

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

2022-11-29 16:05:55 463

原创 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 3790 3

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

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

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

原创 3分钟火速手写一个二叉查找树,搞快点。

二叉查找树(Binary Search Tree,BST),又叫做二叉排序树、二叉搜索树,是一种对查找和排序都有用的特殊二叉树。二叉查找树或是空树,或是满足如下三个性质的二叉树:若其左子树非空,则左子树上所有节点的值都小于根节点的值 若其右子树非空,则右子树上所有节点的值都大于根节点的值 其左右子树都是一棵二叉查找树二叉查找树的特性:左子树

2022-11-24 16:11:38 777 6

原创 ssrs【2016】快速入门 | 安装 | 报表配置 | 报表制作

ssrs入门

2022-11-18 17:48:29 495 3

原创 【布隆过滤器】世界上大概有1 亿种小蛋糕,客户康宝要求这辈子不吃重复的小蛋糕。

文章目录需求概念思想问题优点缺点应用手写布隆过滤器补充需求现在客户康宝有一个需求:世界上大概有 1 亿 种小蛋糕,康宝要求这辈子不吃重复种类的小蛋糕。因为小蛋糕的种类很大可能只会增加,而不会减少,面对这种大数据量的要求以及结果无非是true还是false的难题,所以应该首选布隆过滤器。考虑到甜品行业的发展以及人们生活水平的提高,蛋糕的种类很有可能成指数性增长,那么我们假设世界上有10亿种小蛋糕。为了更好的满足康宝的需求,我们提供三种实现方案:手写布隆过滤器Guava实现Redis实现(具体

2022-11-16 17:36:38 523 1

原创 Timer应用小案例补充----Notify、while相关

Java线程实现采用内核线程实现,线程的休眠及唤醒(状态切换)需借助操作系统进行,这是一个极其耗时耗力的操作。但若线程休眠及运行的时间都很短(例如毫秒/秒,文中案例就是一个典型案例),系统将频繁的对线程状态进行切换,导致严重的性能损耗,并对着循环次数的递增而放大。创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

2022-11-09 16:08:36 318

原创 阿光附体,浅谈Timer,源码分析。

说到Java的定时器,是不是想起了伟大的Timer,提起Timer是不是想起Netflix的Spring Cloud的注册中心Eureka,如果没记错,它内部定时发送心跳的的机制就是用Timer做的,不过后来的一些注册中心(比如Nacos)都用ScheduledExecutorService代替了,今天我们来浅谈一下这个Timer。进而start之后会执行TimerThread的run方法。我们来简单分析一下,从new Timer()开始。奥里给,奥里给,每天充满正能量!那么它又是怎么实现定时任务的呢?

2022-11-09 11:22:54 329

原创 什么是孤独

孤独是洗了个头发,换了双干净的鞋子,换上喜欢的衣服,然后去楼下超市买了瓶可乐就回来了。是睡了一下午,醒来时黑漆漆的一点声音也没有,抬头望了望窗外天还没完全暗下来,四处摸了摸手机,打开屏幕上一条消息都没有。是你总兜兜转转遇到不合适的,总是差点意思,不是时间问题就是性格问题,好像总是阴差阳错的和长久的幸福擦肩而过,那就冷敷几分钟迷迭维视,降低一下度数,擦亮眼睛明亮自己也明亮未来的路。是一个人走在街上,为了避免尴尬,总是拿出手机来回的滑动,只有自己知道只是把手机解锁,刷刷动态,看时间再锁屏放回兜里 一遍遍

2022-10-27 08:44:55 599 14

原创 分布式系统认证方案

随着软件环境和需求的变化,软件的架构由单体结构演变为分布式架构,具有分布式架构的系统叫分布式系统,分布式系统的运行通常依赖网络,它将单体结构的系统分为若干服务,服务之间通过网络交互来完成用户的业务处理,当前流行的微服务架构就是分布式系统架构。分布性每个部分都可以独立部署,服务之间交互通过网络进行通信,比如订单服务、商品服务。伸缩性每个部分都可以集群方式部署,并可针对部分结点进行硬件及软件扩容,具有一定的伸缩能力。共享性。...

2022-10-15 19:10:06 5358 1

原创 【微服务|OAuth②】从0到1搭建一个oauth2.0服务

文章目录环境介绍授权服务器配置EnableAuthorizationServer配置客户端详细信息管理令牌令牌访问端点配置配置授权类型(Grant Types)配置授权端点的URL(Endpoint URLs)令牌端点的安全约束web安全配置环境介绍Spring-Security-OAuth2是对OAuth2的一种实现,并且跟我们之前学习的Spring Security相辅相成,与Spring Cloud体系的集成也非常便利,接下来,我们需要对它进行学习,最终使用它来实现我们设计的分布式认证授权解 决方

2022-10-12 15:49:07 6188

原创 【微服务|OAuth①】OAuth2.0介绍

OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不 需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth1.0,即完全废止了OAuth1.0。很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。Oauth协议目前发展到2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。OAauth

2022-10-12 13:55:39 5518

原创 写了一行“System.out.println()”代码,于是我被开除了

作为资深的cv工程师,想必大家都知道System.out.println()吧。看一下源码: /** * Prints a String and then terminate the line. This method behaves as * though it invokes <code>{@link #print(String)}</code> and then * <code>{@link #println()}</code>.

2022-10-12 02:00:15 380

原创 【手写Nacos系列】上厕所的功夫,带你手写一个注册中心的服务注册功能

文章目录手写Nacos客户端生产者微服务手写Nacos服务端测试上一篇文章《Nacos是如何实现服务注册功能的》,我们全面解析了Nacos是如何实现服务注册的,那么这篇文章,我们就来手写一个Nacos,完成注册中心的服务注册功能。源码在文末为了更加贴近Nacos,我们本次总共开发三个模块。模拟Nacos客户端【接入微服务】模拟Nacos服务端生产者微服务【为了测试】手写Nacos客户端对于这个模块的设计,主要有几下几点:编写/META-INF/spring.factories文件加入

2022-09-29 19:29:56 6235 3

原创 Vue3快速上手

Vue3快速上手1.Vue3简介2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600+次提交、30+个RFC、600+次PR、99位贡献者github上的tags地址:https://github.com/vuejs/vue-next/releases/tag/v3.0.02.Vue3带来了什么1.性能的提升打包大小减少41%初次渲染快55%, 更新渲染快133%内存减少54%…2.源码的升级使用Proxy

2022-09-29 18:19:47 203

空空如也

空空如也

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

TA关注的人

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