自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

徐小陌的博客

I will always catch up with those who are ahead of me!

  • 博客(85)
  • 资源 (3)
  • 收藏
  • 关注

原创 Guava限流器原理浅析

本文并不过多深度剖析源码和原理。旨在以初学者的角度窥探Guava限流器的限流实现思路,并解答一些理解中存在的疑惑。

2023-09-28 11:21:01 2855

原创 【必看!】动态修改SpringBoot定时任务执行周期

带着问题阅读源码比通篇无脑阅读源码更容易,找到问题、解决问题以后也更有成就感。

2023-07-20 14:22:51 1019

原创 Spring中如何获取Bean方法上的自定义注解

Spring中获取Bean方法上的自定义注解引发的一些思考

2023-06-09 17:10:11 3370

原创 Go语言 和 Java语言对比理解系列五:锁

通过写一个简单的计数器程序来看看Java和Go的锁分别如何使用。

2023-06-01 15:24:39 629

原创 Go语言 和 Java语言对比理解系列四:门闩(WaitGroup/CountDownLatch)

如果内部计数器变为0,Wait方法阻塞等待的所有线程都会释放,如果计数器小于0,方法panic。注意Add加上正数的调用应在Wait之前,否则Wait可能只会等待很少的线程。一般来说本方法应在创建新的线程或者其他应等待的事件之前调用。父线程调用Add方法来设定应等待的线程的数量。为了和Java的门闩形成对比,这里用Go的WaitGroup实现“使用三个线程,按顺序打印X,Y,Z,连续打印10次”的功能。【Done】方法减少WaitGroup计数器的值,应在线程的最后执行。

2023-04-07 16:24:14 325 1

原创 SpringBoot中Jackson序列化处理自定义注解

上篇文章 Jackson序列化带有注解的字段的原理浅析 里已经简单介绍了Jackson如何序列化带有注解的字段。本文尝试自己定义一个注解,让Jackson序列化时对标注了该注解的字段进行脱敏。

2023-03-07 21:09:45 3728 8

原创 Jackson序列化带有注解的字段的原理浅析

序列化器指的是包含对某种类型的数据的序列化方式的类。如自带的有:对String类型序列化的StringSerializer,对Date类型序列化的DateSerializer,对Bean序列化的BeanSerializer。经过上面的分析,知道了Jackson如何序列化标注的字段。那能否自己定义一个注解,让Jackson通过自定义的序列化器来处理该注解标注的字段🤔️?且等下篇文章再来探究~

2023-02-05 16:27:33 984 2

原创 Go语言 和 Java语言对比理解系列三:函数作为参数和返回值

对于将函数作为参数和返回值,Go和Java都有自己的语言特性实现,但是在理解上是有异曲同工的,这样对比下来更能加深印象~

2022-12-30 09:47:52 162

原创 Go语言 和 Java语言对比理解系列二:延迟执行&资源释放

Go中defer关键字和Java中finally语句块的对比理解。

2022-11-01 11:46:08 159

原创 Go语言 和 Java语言对比理解系列一:函数参数传递

Go里面struct和数组属于值类型;Java里的对象和数组属于引用类型。Go对struct和数组的函数传递、赋值操作,是复制一块新的内存,与原有的数据相互独立,互不影响。

2022-09-10 17:12:27 758

原创 Server-Sent Events 一种轻量级的Push方式

Server-Sent Events 一种轻量级的Push方式。

2022-07-31 14:21:00 2373

原创 Mybatis动态SQL踩坑记

Mybatis动态SQL的一个踩坑复盘~

2022-06-24 10:40:57 1235 1

原创 一个简单的Java抽奖程序

文章目录需求背景设计思路代码实现定义奖品及中奖概率执行抽奖中奖率测试测试结果数据本文逻辑思想比较简单,旨在了解后端如何设计抽奖以及控制抽奖概率。需求背景现在奖品池有如下奖品:序号名称中奖率0代金券10元20%1代金券50元14%2蓝牙耳机10%3Switch游戏机5%4iPhone 13Pro1%5谢谢参与50%需要设计一个抽奖程序,保证最终的抽奖结果近可能贴近每个奖品的中奖率。设计思路首先看看现实生活中的抽奖

2022-05-21 15:15:11 6252

原创 MySQL协议长什么样子

文章目录如何抓包使用软件过滤规则注意事项抓包结果分析客户端登录Mysql服务客户端退出Mysql服务总结在学计算机网络的时候都知道TCP协议要进行三次握手,四次挥手。TCP协议是传输层协议,应用层协议建立在传输层协议之上。本文以Mysql协议为切入点,通过抓取通信包来看看Msql协议到底是什么样的。如何抓包使用软件Wireshark 3.6.1Mysql 8.0.19使用Wireshark抓取安装在本地的Mysql服务的通信包。过滤规则tcp.port == 3306 and

2022-05-04 22:03:11 801

原创 SkyWalking Agent数据采集和上报原理浅析

Skywalking是一款云原生的APM(应用性能管理)系统。包含了事件日志、链路追踪、指标监控能力,同时提供了数据的采集、数据存储以及数据展示三个先对独立的子系统。是一款“广义的”分布式链路追踪系统。上一篇文章《SkyWalking如何通过修改字节码让插件生效》讲了SkyWalking的插件工作原理,这篇文章就来探索一下SkyWalking到底是如何实现链路追踪和指标监控的功能的。整体工作原理采集数据过程分析链路追踪核心概念:Trace、Span。具体在这里不展开,可以自行参考《Ope.

2022-03-25 17:40:42 5862 1

原创 分布式一致性协议-Gossip

文章目录Gossip诞生背景Gossip工作原理Gossip特性Gossip缺点Gossip传播模式反熵传播谣言传播Gossip通信方式PushPullPush/PullGossip的应用Gossip诞生背景Gossip 最早由施乐公司(Xerox,现在可能很多人不了解施乐了,或只把施乐当一家复印产品公司看待,这家公司是计算机许多关键技术的鼻祖,图形界面的发明者、以太网的发明者、激光打印机的发明者、MVC 架构的提出者、RPC 的提出者、BMP 格式的提出者……) Palo Alto 研究中心在论文《E

2022-02-26 18:46:17 769

原创 深入理解负载均衡

文章目录负载均衡分类四层负载均衡真的是在四层吗数据链路层负载均衡网络层负载均衡IP隧道传输(IP Tunnel)网络地址转换(NAT)负载均衡到底是转发还是代理总结负载均衡分类工作学习中我们接触过形形色色的负载均衡产品,但他们从形式上说都可以分为两种:四层负载均衡和七层负载均衡。这里所说的四层、七层指的是经典的OSI七层网络模型的传输层和应用层。这里我们再来回顾一下OSI模型:四层负载均衡的优势是性能高,七层负载均衡的优势是功能强。然而四层/七层负载均衡这种我们已经习以为常的说法,真的就是字

2022-02-04 13:52:56 1921

原创 我的2021回忆录

文章目录人生大事之买房行业风波再起????最美逆行者人生大事之拍婚纱照有家难回技术方面总结人生大事之买房在这之前我从来没有认真想过买房这件事,因为我知道对于北漂的我来说,现在考虑这个事很不靠谱。一个北漂的人,在我看来有两种想法:努力打拼,通过不断的晋升或者其他机遇有一个客观的收入水平,然后考虑在北京买房定居。多漂几年,攒够钱然后回老家发展。第一个想法,我觉得如果不是创业经商找到了机遇,或者在一家企业当上了管理层,即使砸锅卖铁,省吃俭用买了一套房,那以后还房贷、消费也会压的人喘不过气,尤其是像

2022-01-29 13:19:09 780

原创 图解MESI(缓存一致性协议)

MESI(缓存一致性协议)

2021-12-30 12:17:10 4260 3

原创 基于Dubbo SPI来统计接口的TP90、TP99指标

主要原理还是依赖Dubbo的Filter机制。import org.apache.dubbo.common.constants.CommonConstants;import org.apache.dubbo.common.extension.Activate;import org.apache.dubbo.rpc.*;import org.springframework.util.CollectionUtils;import java.math.BigDecimal;import java.

2021-11-09 15:14:42 499 2

原创 为什么Volatile能保证双重检查锁的线程安全

文章目录1、双重检查锁的由来1.1、非线程安全的懒汉式单例1.2、线程安全的懒汉式单例2、问题的根源3、解决方案3.1、基于volatile的解决方案3.2、基于类初始化的解决方案4、总结单例模式分为懒汉式和饿汉式。懒汉式其实就是为了延迟初始化来降低初始化类和创建对象的开销。1、双重检查锁的由来1.1、非线程安全的懒汉式单例一种懒汉式的单例写法如下:public class UnsafeLazyInitialization { private static Instance inst

2021-11-08 20:42:22 464 1

原创 分布式一致性协议-Raft

文章目录1、什么是Raft2、Raft相关概念3、原理解析3.1、日志复制3.2、Leader选举3.3、Leader节点宕机3.4、多个Candidate竞争选举3.5、网络分区处理4、总结5、参考1、什么是RaftPaxos 是论证了一致性协议的可行性,但是论证的过程据说晦涩难懂,缺少必要的实现细节,而且工程实现难度比较高, 广为人知实现只有 zk 的实现 zab 协议。Paxos协议的出现为分布式强一致性提供了很好的理论基础,但是Paxos协议理解起来较为困难,实现比较复杂。然后斯坦福大学

2021-10-19 20:45:49 605

原创 分布式一致性协议-Paxos

文章目录什么是PaxosPaxos到底解决了什么问题主要的Paxos算法介绍Basic Paxos角色介绍决策模型流程图Multi-Paxos流程图什么是PaxosPaxos协议主要说的是Paxos算法。该算法致力于解决分布式一致性问题,基于消息传递且具有高度容错性。Tips:“Paxos由 莱斯利·兰伯特(Leslie Lamport)于1998年在《The Part-Time Parliament》论文中首次公开,最初的描述使用希腊的一个小岛Paxos,描述了Paxos小岛中通过决议的流程,并

2021-09-22 14:31:00 1448

原创 使用三个线程,按顺序打印X,Y,Z,连续打印10次

/** * 题目描述:使用三个线程,按顺序打印X,Y,Z,连续打印10次。 * @author xujian * 2021-06-25 13:38 **/public class PrintXYZ { //定义CountDownLatch,起到线程通知的作用 private static CountDownLatch cd1 = new CountDownLatch(1); private static CountDownLatch cd2 = new CountDownL

2021-06-25 15:54:26 257

原创 Tomcat学习笔记

文章目录第⼀部分:Tomcat 系统架构与原理剖析1.1 浏览器访问服务器的流程1.2 Tomcat 系统总体架构1.2.1 Tomcat Servlet容器处理流程1.2.2 连接器组件 Coyote1.2.3 容器组件Catalina第二部分:⼿写实现迷你版 Tomcat第三部分:核⼼流程源码剖析3.1 Tomcat启动流程3.3 Tomcat请求处理流程第四部分:Tomcat 类加载机制剖析第五部分:Tomcat 性能优化5.1 虚拟机运⾏优化(参数调整)5.2 Tomcat 配置调优第⼀部分:To

2021-06-21 15:31:38 231

原创 实现一个增强版的JDK动态代理V2.0

文章目录分析之前实现的不足1)前、后增强是通过写死执行增强的位置来实现2)没有实现环绕增强优化改进之前有个文章实现了一个简单的增强版JDK动态代理:实现一个增强版的JDK动态代理。但是当时只是实现了方法前增强和方法返回后增强的效果,至少还有如下两个不足:1)前、后增强是通过写死执行增强的位置来实现;2)没有实现环绕增强;分析之前实现的不足1)前、后增强是通过写死执行增强的位置来实现先来回顾一下之前实现的代码public Object proceed(JoinPointInfo joinP

2021-06-18 18:27:59 209

原创 SpringBoot学习笔记

文章目录第一部分:SpringBoot应用回顾1.1 概述1.2 主要特性1.3 抛出疑问1.4 热部署1.5 全局配置文件1.6 属性注入1.6.1 属性注入常用注解1.6.2 如何覆盖第三方配置1.7 日志框架第二部分:SpringBoot源码剖析2.1 【重点】自动配置2.2 Run方法执行流程2.2.1 SpringApplication() 构造方法2.2.2 run(args)2.3 内嵌Tomcat2.3.1 内嵌Tomcat自动配置原理2.3.3 自动配置SpringMVC第三部分:Spri

2021-06-14 14:32:37 353

原创 探索Spring循环依赖的细节

文章目录背景回顾细节探索为什么一样什么情况下会不一样lagouBean.getItBean()问题之前在Spring学习笔记,挺全的!这个博客中提到了Spring对循环依赖的解决原理,这篇博客对一些细节做个补充。背景回顾@Servicepublic class LagouBean { @Autowired private ItBean itBean; public ServiceB getServiceB() { return serviceB; }}

2021-06-08 20:26:27 208 5

原创 SpringMVC学习笔记

文章目录1.1 Spring MVC 简介1.1.1 MVC 体系结构1.1.2 SpringMVC介绍1.2 SpringMVC请求处理流程1.3 参数绑定1.4 RESTful支持1.5 和Ajax Json交互第⼆部分 Spring MVC ⾼级技术1.1 拦截器(Inteceptor)使⽤1.1.1 监听器、过滤器和拦截器1.1.2 拦截器的执⾏流程1.1.3 多个拦截器的执⾏流程1.2 处理multipart形式的数据1.3 在控制器中处理异常1.4 重定向请求参数传递第三部分 ⼿写 MVC 框架

2021-05-31 19:42:51 229 5

原创 Spring学习笔记

Spring学习笔记第一部分:Spring 概述1.1 Spring 简介轻量级开源框架核心是IOC和AOP使⽤最多的 Java EE 企业应⽤开源框架1.2 Spring 发展历程EJB->Expert One-to-One J2EE Design and Development论文->Spring1.3 Spring 的优势⽅便解耦,简化开发通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进⾏控制,避免硬编码所造成的过度程序耦合。⽤户也不

2021-05-27 18:25:25 1573 2

原创 实现一个增强版的JDK动态代理V1.0

文章目录背景现状目标方案定义拦截器定义拦截器链定义InvocationHandler定义增强的代理生成类测试总结背景看了Spring AOP JDK动态代理部分的源码,想尝试借鉴Spring的思想,实现一个“增强版”的JDK动态代理。本博文以及相关代码仅作为练习使用,欢迎指正和交流探讨。现状UserService userService = new UserServiceImpl();MyInvocationHandler myInvocationHandler = new MyInvoca

2021-05-27 18:17:06 204 1

原创 Mybatis学习笔记,挺全的!

文章目录第一部分:自定义持久层框架1.1 分析手动编写JDBC操作面临的问题1.2 针对性的给出问题的解决思路1.3 尝试编写自定义框架解决面临的问题第二部分:Mybatis相关概念2.1 简介2.2 历史2.3 优势第三部分:Mybatis基本应用3.1 入门3.2 常用开发方式3.2.1 传统开发方式3.2.2 代理开发方式第四部分:Mybatis配置文件深入4.1 核心配置文件4.1.1 层级关系4.1.2 常用配置4.2 映射配置文件4.2.1 动态sql之if标签4.2.2 动态sql之forea

2021-05-19 15:12:42 284 3

原创 这么强大的Mybatis插件机制原来就是这?

文章目录Mybatis插件机制介绍自定义一个Mybatis插件插件执行原理分析插件定义插件初始化插件如何生效总结Mybatis开发中经常会用到pagehelper分页插件,除此之外还有慢sql上报等各种各样的插件,那么Mybatis是如何来实现如此强大的插件机制呢?一起来看看吧。Mybatis插件机制介绍MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:Executor (update, query, flushSta

2021-05-18 15:33:51 377 8

原创 Swagger API Spec + Swagger Codegen + YAPI管理接口文档

文章目录1、项目接入Swagger2、项目引入maven插件3、编写Swagger API Spec(接口定义文档)4、代码生成生成方式生成的目录结构5、项目中加入Swagger配置文件背景:使用SpringCloud进行微服务开发,且后端服务调用大都使用Feign Client进行调用。1、项目接入Swagger<dependency> <groupId>io.springfox</groupId> <a

2021-04-25 11:18:36 907 1

原创 什么是“可AI”型问题?

相比于“可计算”型问题,什么是“可AI”型问题?

2021-03-15 16:41:56 98

原创 Java Attach API使用笔记

文章目录需求和目的实现过程创建Attach程序创建Agent程序启动程序达到的效果总结手敲代码来体验IDEA+ASM+Java Attach API实现方法增强的一个示例过程记录。需求和目的/** * 模拟业务方法 * @author xujian * 2021-03-12 10:52 **/public class MyBizMain { public String foo() { return "------我是MyBizMain-----"; }

2021-03-15 14:21:14 749 5

原创 Skywalking如何通过修改字节码让插件生效

文章目录ByteBuddy入门自定义Skywalking插件1、引入依赖编写插件定义编写拦截器使用的哪种字节码操作框架如何修改字节码总结背景:大家都在说Skywalking Agent实现的核心原理就是Java Agent+字节码操作。但是这两者是如何起作用的,一直比较模糊,所以通过这篇博客来记录一下解疑答惑的过程。通过这篇博客应该可以解答如下几个问题:Skywalking具体使用什么来操作字节码;Skywalking的插件是怎么开发的;Skywalking是怎么让插件生效的;ByteB

2021-03-06 19:53:07 1435 4

原创 基于Canal的数据同步

目录常用的数据同步方案数据库迁移场景数据同步场景应用代码中同步定时任务同步通过MQ实现同步通过CDC实现实时同步CDC(change data capture,数据变更抓取)Canal基于日志增量订阅&消费支持的业务工作原理Mysql主备复制实现Canal架构Canal是怎么假装成是Mysql Slave的?Canal是怎么解析binlog的?Quick Start准备启动总结常用的数据...

2021-02-17 14:50:00 25

原创 Gson序列化LinkedHashMap.Entry失败的探索

文章目录问题重现原因探究验证结论使用Gson序列化LinkedHashMap本身为什么没问题其他拓展总结问题重现示例代码如下:Map<String, Object> map = new LinkedHashMap<>(); map.put("name", "xujian"); map.put("age", 25); Gson gson = new Gson(); for (Map.Entry<String,

2021-02-05 15:44:45 489 5

原创 我的2020回忆录

掸去衣服上的尘土,昂首阔步迎接明天。(文章的字数有彩蛋哦~)

2021-01-02 12:47:35 445 1

arthas-boot.jar

阿里代码诊断工具,帮你轻松查找生产环境Java服务的问题

2021-06-09

mat.app.zip

java堆栈分析工具,轻松分析内存快照,查找潜在的死锁问题和内存泄漏问题。通过该工具支持导入堆转储文件。

2020-12-07

gerrit-3.1.4.war

CodeReview工具,代码仓库,团队代码协同,同步到gitlab,最新版,代码审核,提升代码质量

2020-06-12

空空如也

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

TA关注的人

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