- 博客(107)
- 资源 (1)
- 收藏
- 关注
原创 Eclipse MAT分析内存案例
本文记录一次使用Eclipse MAT排查内存问题的案例,缘由是线上某服务OOM,排查得知jvm old区占满,但是gc也无法释放。
2023-05-24 20:40:13
1012
原创 dubbo不同接口配置不同序列化方式
前言dubbo作为目前比较流行的rpc框架,目前发展比较快,本文介绍下dubbo配置序列化相关的一些方式配置全局配置首先可以配置全局的序列化方式,在application中配置,在协议protocol中配置对应的序列化方式,表示采用这种协议的接口统一使用这种序列化方式dubbo.protocol.name=dubbodubbo.protocol.port=-1dubbo.protocol.serialization=hessian2接口级别配置如果你采用的是xml形式来配置dubbo的接
2022-05-06 22:28:41
3411
原创 Spring扩展机制之ImportBeanDefinitionRegistrar
文章目录前言案例总结前言spring有一个接口ImportBeanDefinitionRegistrar,在很多源码中大量使用,本文就介绍下这个接口案例ImportBeanDefinitionRegistrar的定义public interface ImportBeanDefinitionRegistrar { /** * Register bean definitions as necessary based on the given annotation metadata of *
2022-04-29 10:17:05
2396
原创 Spring扩展机制之InstantiationAwareBeanPostProcessor
前言spring中一个InstantiationAwareBeanPostProcessor接口,本文介绍下它的作用介绍InstantiationAwareBeanPostProcessor的定义public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { org.springframework.beans.factory.support.AbstractBeanDefinition#getFac
2022-04-28 15:02:52
1749
原创 Spring扩展机制之MergedBeanDefinitionPostProcessor
前言spring中有这样一个接口MergedBeanDefinitionPostProcessor,本文介绍下这个接口的作用,已经在一些源码中的使用介绍MergedBeanDefinitionPostProcessor接口的定义如下public interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor { /** * Post-process the given merged bean definition f
2022-04-28 14:31:22
3671
原创 apollo配置中心源码全解析
文章目录前言前言紧接前文nacos配置中心,本文继续讲目前比较火热的动态配置中心apollo,从源码层面分析一下它的实现以apollo-client-1.9.2源码进行分析,关于如何使用apollo本文不再赘述,笔者是下载官方1.9.2的源码到本地启动项目的,至于如何启动可以看这篇文章pom.xml文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"
2022-04-26 15:08:05
4184
1
原创 nacos自定义@Value注解动态配置解析器
文章目录前言实现总结前言紧接上文,nacos-spring-boot版本不支持@Value注解的属性的动态更改,那么我们可以依赖nacos提供的一些扩展机制,自己来实现这个功能实现直接利用nacos配置更改时会发布的事件NacosConfigReceivedEvent,扩展一个监听该事件的监听器即可package com.alibaba.nacos.example.spring.boot.controller;import com.alibaba.nacos.spring.context.e
2022-04-24 22:03:26
2513
原创 nacos2.0配置中心源码解析
文章目录前言前置说明springboot中如何装配nacos从服务端加载配置内容服务端处理gRpc请求客户端监听机制前言nacos作为目前较为主流的服务注册和动态配置的组件,目前已有很多公司在内部使用,本文以nacos的springboot集成版本进行分析下动态配置中心实现原理本文以nacos2.0.2版本进行源码分析,对应nacos-config-spring-boot-starter版本为0.2.10nacos 2.0.2在1.x版本上做了重大的重构,具体可看官网本文只讨论nacos作为动态配
2022-04-24 20:23:44
4007
1
原创 浅谈java中的编码
前言之前一直对java中的编码一知半解,这一次在一次工作中,遇上了一个让我疑惑的问题,最终发现是由编码导致的,借此机会对编码有了进一步的理解问题本次的问题是由一次对字符串的MD5的功能引起的,代码如下public static String MD5encryption(String plain) { String re_md5 = new String(); try { MessageDigest md = MessageDigest.getI
2022-04-17 21:52:46
651
1
原创 Spring @Value注解解析源码
前言我们使用spring最常用的属性注入方式就是@Value,而要注入的属性我们一般都配置在配置文件application.properties中,上文讲解了配置文件application.properties加载到spring环境变量environment的过程这一篇就来讲解一下spring是如何把environment中的属性值使用@Value注入到字段中的源码解析...
2022-04-17 13:00:35
2597
2
原创 springboot environment对象之application文件加载源码解析
前言首先我们都知道springboot的约定大于配置的一条约定就是classpath下指定application.properties或者yaml文件的配置文件会被加载到spring中作为配置文件那么在springboot中它是如何加载的呢?本文就是从源码介绍application文件的加载源码解析从springboot启动类入手SpringApplication.run(ProvideApplication.class, args)public static ConfigurableAppl
2022-04-12 22:13:33
1202
原创 dubbo 3服务消费源码分析
前言紧接上文,dubbo 3服务注册源码分析,本文开始分析dubbo 3服务消费源码,消费端的源码相对注册端来说要更加复杂一些首先需要了解以下,服务消费需要做哪些操作,本文从dubbo和springboot的结合开始分析服务消费必须做的以下一些事情扫描@DubboReference的字段,并把这些对象注入到spring中成为bean,后续其他字段无论使用@DubboReference还是@Autowird都能够注入对象注入的对象在被调用时必定会发起一个远程RPC调用访问远程服务,这个就很容易想到
2022-04-07 22:36:01
1820
2
原创 dubbo 3服务注册源码分析
前言本文从源码层面介绍dubbo3的服务注册机制,会同时讲到2.x的接口级注册以及3.x的应用级注册的关键源码关于接口级和应用级的区别,请参考本文:https://blog.youkuaiyun.com/qq_31086797/article/details/123998512首先需要了解以下,服务注册需要做哪些操作,本文从dubbo和springboot的结合开始分析服务注册必须做的以下一些事情肯定要进行扫描,扫描哪些接口是dubbo需要发布的接口,以注解为例dubbo2.x是url驱动的,肯定会把接口
2022-04-06 23:25:58
2622
1
原创 dubbo3 应用级服务发现机制
前言dubbo3发布的最大的特性就是应用级服务发现机制,原先的是接口级服务发现机制,那么应用级服务发现机制能带来什么好处呢,按官方说法,以下是官网的原文相比于 2.x 版本中的基于接口粒度的服务发现机制,3.x 引入了全新的基于应用粒度的服务发现机制, 新模型带来两方面的巨大优势:进一步提升了 Dubbo3 在大规模集群实践中的性能与稳定性。新模型可大幅提高系统资源利用率,降低 Dubbo 地址的单机内存消耗(50%),降低注册中心集群的存储与推送压力(90%), Dubbo 可支持集群规模步入百万
2022-04-06 20:48:44
1763
原创 dubbo SPI机制
前言SPI(Service Provider Interface):服务提供接口本文主要介绍dubbo源码中大量使用的SPI机制,dubbo中的spi和jdk中的不同SPIdubbo中提供了一个ExtensionLoader.getLoadingStrategies()方法,但是在dubbo3.0.6版本已经废弃,取而代之的是几个区分了模块的类基于名称的扩展点Cluster failsafeCluster = ApplicationModel.defaultModel().getExtensio
2022-04-06 19:59:51
2950
原创 ReentrantLock源码分析
前言本文从源码来介绍下ReentrantLock的实现细节源码话不多说直接上源码,从lock方法开始看当我们不传参是,默认是NonfairSync,非公平锁,本文只看非公平锁,看懂了非公平锁,则公平锁只是一些细节的差异public ReentrantLock() { sync = new NonfairSync();}public void lock() { sync.lock();}final void lock() { // 如果state=0,则cas尝试修改s
2021-08-16 22:39:29
147
原创 从Mybatis源码分析插件原理
插件(plugins)MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParameters)ResultSetHandler (handleResultSet
2021-08-12 17:14:36
156
原创 一文读懂什么是MySQL的MVCC机制
前言现在网络上对于mvcc的文章很多,笔者看完之后也是较难理解,经过一番学习之后对个人理解做一个记录MVCCMVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。概念看起来比较模糊,简单的说是数据库为了解决事务隔离性存在的三大问题:脏读、幻读、不可重复度针对这三个问题的概念此处不做解释,可以看这篇文章:https://blog.youkuaiyun.com/qq
2021-04-23 23:27:06
488
原创 解析RedisTemplate默认是否使用连接池
介绍在我们使用SpringBoot项目时使用Redis变的非常简单,我们只有引入springboot提供给我们的依赖就可以直接使用一个RedisTemplate的bean来操作redis了使用1、引入redis的依赖,这是一个starter自动装配组件<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-
2021-04-20 15:00:08
9247
3
原创 redis使用lua脚本回滚失败的原因
前言redis作为当下比较热门的nosql 缓存中间件,使用起来非常简单,但是当我们需要让多个命令保持原子性时,应该如何使用呢,本文就来介绍下案例1、redis提供了事务操作,multi和exec指令,我们来简单的模拟一下首先启动redis服务,连接到客户端执行完上述过程最后get k1的值是2,上述可以理解为multi开启了事务,只是多次set,此时的返回结果为QUEUED,代表进入了执行队列,此时还没有执行命令,直到执行exec时才会把队列的命令依次执行我们再按以下操作执行当执行hse
2021-04-14 20:30:50
5115
3
原创 SpringBoot处理静态文件缓存机制详解
前言紧接上文SpringBoot处理静态文件源码分析,分析下其中处理静态文件时的缓存机制http协议http协议有一条规则:当response header中携带Last-Modified时,当再次发起一个相同请求时会把Last-Modified的值放到request header的If-Modified-Since字段中当服务端返回http状态码为304时就会从当前缓存中获取资源源码基于上述协议我们来看SpringBoot中的源码直接看ResourceHttpRequestHandle
2021-03-30 13:22:36
1761
原创 SpringBoot处理静态文件源码分析
前言在使用SpringBoot框架进行开发时,如果我们要在应用上放一下静态文件访问,那么只要遵守SpringBoot的规范,在指定目录下放我们的静态文件即可使用我们新建一个SpringBoot工程,在resources目录下新建了一个public目录,在public目录下创建一个a.txt,如图所示启动项目,直接访问http://localhost:8080/a.txt可以看到浏览器返回了我们的文件内容源码我们从springmvc的入口DispatcherServlet的doDispatch
2021-03-29 20:28:23
397
原创 Springboot集成Mybatis源码解析
前言Mybatis现在作为我们项目中几乎必备的框架,让我们日常开发中操作数据库变得十分简单那么Mybatis是如何集成到项目中的呢?本文就从源码层面解析Mybatis是如何工作的源码我们在项目中使用Mybatis都是优先在pom.xml引入一下jar包<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-start
2021-03-13 22:33:34
294
原创 PageHelper关闭count语句优化
目录前言分析源码总结前言PageHelper是一个很好用的分页插件,在这个插件中使用分页会执行两句sql1、count语句的sql,因为分页需要总数2、分页语句,使用分页参数进行服务端分页的sql分析我们在调用分页方法时正常会调用PageHelper.startPage(1,10);但是如果我们不需要分页总数时可以关闭count的sql语句查询,使用重载的方法即可/** * 开始分页 * * @param pageNum 页码 * @param
2021-03-13 11:07:35
5696
1
原创 从源码理解Druid连接池原理
前言在我们平时开发中,使用数据库连接池时使用阿里的Druid连接池已经比较常见了,但是我们在集成到Springboot时似乎非常简单,只需要简单的配置即可使用,那么Druid是怎么加载的呢,本文就从源码层面进行揭秘使用首先简单的介绍下如何使用1、pom.xml加载jar包,直接使用集成springboot的jar<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-
2021-03-11 09:03:18
904
1
原创 Mybatis插件原理及集成到springboot
目录前言Plugin插件源码使用插件前言本文介绍的内容如下Mybatis提供的插件(Plugin)机制基于插件实现一个记录sql语句及耗时的小案例分析下插件的原理PluginMybatis提供了四大对象,可供我们使用插件进行扩展,扩展的原理是使用动态代理Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)ParameterHandler (getPara
2021-03-06 17:10:13
372
原创 Springboot集成tkMybatis源码分析
前言本文不介绍springboot如何集成tkMybatis,只介绍下集成的原理什么是tkMybatistkMybatis是对Mybatis的一个封装的框架,有点类似于hibernate的jpa,其作用是可以简化场景增删改查的sql语句,以及可以支持不使用mapper.xml配置文件,并且在接口上也可以支持编写sql语句源码我们直接从入口开始,tkMybatis的扫描注解MapperScan,该注解使用时需要配置扫描的路径,参数为value@Retention(RetentionPolicy.R
2021-03-04 21:26:04
548
3
原创 基于Lock Condition实现自己的阻塞队列
前言本文介绍下JUC包下的Lock以及Condition组件,以及实现自己的阻塞队列阻塞队列阻塞队列顾名思义是一个队列,那么为什么叫阻塞队列呢,因为队列是一种生产者/消费者模型,即生产者往队列里面放数据,消费者从队列里面拿数据。那么当消费者消费消息时发现队列是空的,生产者生产消息发现队列已经满了,此时应该怎么做呢?阻塞队列就是指在上述情况下生产者和消费者会阻塞什么是生产者和消费者模式生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通信,而是通过阻塞
2021-02-09 20:58:28
439
2
原创 mysql innodb存储引擎下的不同锁类型
前言先介绍一个日常开发中的场景:比如我们需要对一个账户加1000块钱,现在并发有两个人同时给该账号转载,那么会不会出现明明转载了两笔,缺只加了1000块钱呢?当然我们知道这肯定是不能容忍的,那么mysql是如何解决这个问题的呢?首先需要说的时mysql在innodb下默认情况下一个DML语句会自动开启一个事务,执行结束后默认提交事务,那么转账两笔的场景如下:账号1:begin;// 开启事务update 账单表 set money+1000 where id=xiaowang;// 代码1
2021-02-03 22:06:39
342
原创 mysql删库后恢复数据流程
前言本文将介绍当我们使用mysql不小心删库之后,或者恶意被删库后,如何进行数据恢复流程我们进行数据恢复的前提是:1、必须开启binlog日志功能2、最好是会对数据进行定期备份(否则数据量太大的情况下很难通过binlog进行恢复)我们先来了解下binlogbinlogbinlog是mysql server层提供的功能,和存储引擎无关,binlog保存了所有服务端执行的DML语句。所以在binlog完整的情况下,可以理解为当被删库后可以把所有DML语句重新执行一遍来达到数据恢复binl
2021-02-02 20:10:00
2258
1
原创 基于docker部署mysql主从复制集群
目录前言部署mysql1、先直接启动一个mysql容器2、把配置文件拷贝出来,因为我们主从架构需要用到配置文件,使用考虑使用挂载的方式修改配置文件3、删除我们刚才的容器,我们仅仅是为了拿到配置文件4、修改配置文件内容5、启动master和slave节点6、进入master容器内7、获取binlog名字和position8、开启主从同步9、测试是否主从配置成功总结前言本文介绍如何基于docker部署一主一从的mysql集群部署mysql首先我们先启动两个mysql容器,安装docker的步骤在此不做介
2021-01-28 21:31:10
349
原创 揭秘springboot集成tomcat原理
前言曾几何时,我们使用springboot后使用内置的tomcat项目进行启动项目,但是这里是如何集成的可能我们并不清楚,本文发表一些笔者的理解和看法在这里先抛出一些原生Tomcat作为web服务器的知识,Tomcat称之为web容器,也可以称之为servlet容器,原因如下:web容器:用来与我们的浏览器做交互,即与http请求做交互servlet容器:与http请求做交互的时候,如何调用我们的业务代码呢?这个时候就需要我们的servlet规范了,各个web容器厂商只要实现servlet规范,即
2020-12-28 22:46:54
3423
原创 springboot Controller接口返回流程详解
目录前言源码分析总结前言我们在使用springboot开发rest接口时往往是直接写一个接口,然后返回对象,最后结果就转化为Json格式返回了,本文就探究下这个过程中springmvc是如何完成这个过程的。源码分析首先我们写了个最简单的接口,并且返回了一个Test对象@RestControllerpublic class TestController { @GetMapping("/test") public Test test() { Test test =
2020-12-23 14:00:41
3097
2
原创 JVM调优参数记录
前言本文记录下笔者学习jvm后了解的参数,以供大家参考JVM参数-XX:InitialHeapSize=100M 初始化堆大小 简写-Xms100M-XX:MaxHeapSize=100M 最大堆大小 简写-Xms100M-XX:ThreadStackSize=100M 设定每个线程的堆栈大小 简写-Xss100M-XX:+PrintFlagsFinal:打印所有参数,设置了会显示设置后的参数值-XX:+HeapDumpOnOutOfMemoryError 启动堆内存溢出打印当JVM堆内存发
2020-12-18 21:41:03
308
1
原创 JVM默认堆内存大小
前言我们都知道jvm有一个堆内存的概念,我们可以通过-Xmx:最大堆内存,-Xms初始化堆内存来进行设置。那么当我们不设置时默认是多少呢堆内存这里直接贴上官网jdk1.8的链接https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size翻译如下:默认堆大小除非在命令行上指定了初始堆大小和最大堆大小,否则它们将根据计算机上的内存量进行计算。最大物理内存大小不
2020-12-18 21:27:35
14102
2
原创 ConcurrentHashMap设计思想和源码分析
目录前言介绍jdk1.7jdk1.8源码分析putaddCount前言ConcurrentHashMap是我们JUC下面的一个线程安全的Map,相较于我们最常用的HashMap,ConcurrentHashMap可以在保证线程安全的同时,尽量减少性能的损耗,比如HashTable直接对put方法加锁,大大降低了性能介绍先介绍下ConcurrentHashMap的基本结构jdk1.7ConcurrentHashMap在jdk1.7之前,处理线程安全的机制是采用分段锁的思想来解决的。其数据结构为数组
2020-12-17 22:48:03
171
原创 MySQL事务并发问题及隔离级别介绍
目录前言事务特性原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)事务并发的三大问题脏读不可重复读幻读事务隔离级别Read Uncommitted (RU 未提交读)Read Committed (RC 已提交读)Repeatable Read (RR 可重复读)Serializable (串行化)MVCCDATA_TRX_IDDATA_ROLL_PTRDB_ROW_ID前言本文主要介绍MySQL innodb存储引擎的事务并发问题及事
2020-12-03 22:34:15
512
原创 springboot内置tomcat调优并发线程数
目录前言参数线程池核心线程数线程池最大线程数请求最大连接数accept-counttomcat线程池处理机制总结前言本文解析springboot内置tomcat调优并发线程数的一些参数,并结合源码进行分析参数线程池核心线程数server.tomcat.min-spare-threads:该参数为tomcat处理业务的核心线程数大小,默认值为10线程池最大线程数server.tomcat.max-threads:该参数为tomcat处理业务的最大线程数大小,默认值为200,当对并发量有一点值时可
2020-12-03 11:47:57
16283
2
原创 MySQL不建议使用UUID作为主键的原因
前言以前只知道UUID不适合作为主键,但是不知道具体原因,最近做了了解,在此做一个记录索引我们先了解一下mysql索引的数据结构,mysql在innodb的存储引擎下是使用B+树来做为索引的数据结构的,而一个表最终必定会创建一个主键索引,即是没有设置主键也会有生成规则(先查找有没有非空的唯一索引,没有则可以使用默认的rowid字段创建索引)mysql中存储数据的最小单元称之为page(页),大小为16KB,也就是在索引的结构中一个page存储了很多个数据,看下图我们首先知道索引采用B+树的结构后,
2020-12-01 22:04:25
4846
4
原创 分布式共识算法之raft算法介绍
前言raft算法是什么:raft是一个共识算法,所谓共识,就是多个节点对某个事情达成一致的看法。使用场景我们直接看来raft算法可以解决什么问题,比如在分布式场景下,我们的中间件为了达到高可用,那么必定不可能是单体架构,那么有一种常见的架构就是leader-follower架构,如nacos的高可用架构就是采用的raft算法,如下图使用一个leader和两个follower组成一个高可用的架构模型leader和follower的定义如下:leader:负责处理写请求,可以理解为是该架构的主要
2020-12-01 21:52:27
557
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人