【Spring源码分析】循环依赖的处理
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/Spring/Spring-Circular-Dependencies.html 看源码的同学可以查看我的GitHub 上面在官方的基础上加入了大量中文注释,帮助理解 要了解的知识 什么是循环依赖 graph LR A-->B B-->C C-->A 存在哪些循环依赖 Setter循环依赖(可以被解决) 构造循环依赖(报错) 基于Prototype类型的循环依赖(报错) Bean的创建步骤 看源码的同学可以找到源码: 环节1~4的代码在AbstractAutowireCapableBeanFactory#doCreateBean方法中 环节5的代码在DefaultSingletonBeanRegistry#getSingleton(String,ObjectFactory)方法的addSingleton(beanName, singletonObject);中 Spring是怎么处理循环依赖的(对于单例Bean) 实现原理 Spring在创建...
前后端合并可行性
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/design/front-end-merge.html 这里描述的是前后分离,非动静分离 简单放图,日后完善描述 前后端分离优劣 为什么要使用前后分离 微服务:1个或多个后端为多个前端服务 安全:保护后端接口,防止暴露后端IP 提高吞吐量:后端压力大,需要支持水平扩展,多个后端提供服务分担压力 劣势 部署麻烦:需要前后分离部署,节点数*2 增加开发工作量:约20%的工作量 查错麻烦:查询日志需要前、后端日志一并查询 分析结果 前后分离更多的是为了保护后端,并且更多的是为了水平扩展,提高后端吞吐量。但实际业务上只对内部用户开放,无太多安全需求,对并发需求也不高,前后分离没有带来更多收益,反而增加了不少工作量与资源浪费,因此将前后端合并。
java虚拟机栈的内存结构
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/JVM/JVM-Memory-Structure-Stack.html 学习JVM的可以去我的GitHub 上查看我的Xmind详细笔记 对整本《深入理解JVM》都有详尽的笔记,帮助理解 一、 前言 Java栈分为两种: Java虚拟机栈: 描述java【方法】执行的【内存模型】 每个线程进入每个方法对应一个栈帧 本地方法栈(本文不做描述) 同虚拟机栈,区别在于:虚拟机栈服务于Java方法(字节码),本地方法栈服务于Native方法 本文主要讲Java虚拟机栈的内存结构 一图胜千言 二、Java虚拟机栈的组成: 1. 栈帧 每个方法对应一个栈帧,在线程运行到该方法时才创建,随着方法结束而销毁 2. 线程栈 栈帧内存在线程内存上进行分配,每条线程能为栈帧分配的总大小最大值为-Xss 为了方便,我们这里 [把这条线程对应的内存] 称为 [线程栈] 3. Java虚拟机栈 Java虚拟机栈是描述java【方法】执行的【内存模...
JVM内存结构-总纲
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/JVM/JVM-Memory-Structure-Menu.html 学习JVM的可以去我的GitHub 上查看我的Xmind详细笔记 对整本《深入理解JVM》都有详尽的笔记,帮助理解 前言 网上有不少描述JVM内存结构的文章,但是要么比较老久了,要么描述有误,今天根据自己的理解整理下,有误请指正。 整体图解 程序计数器 记录Java程序运行到哪里 线程私有,可以看做当前线程执行到哪行【字节码】 字节码解析器工作就是通过改变这个【计数器】来选择下一行要执行什么,分支、循环、线程恢复都依赖于它 若为Java方法,则记录当前执行的字节码指令地址; 若执行的是native方法,则为空 Java 虚拟机栈 描述java【方法】执行的【内存模型】 每个方法对应一个栈帧,在线程运行到该方法时才创建 一条线程拥有的栈帧之和最大为-Xss(我们这里把它叫做线程栈) 当前所有线程栈之和=当前Java虚拟机栈已用大小 Java虚拟机栈总空间最大值:JVM...
Redis分片方案概要(Cluster or Codis)
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/redis/Redis-Partitioning.html Redis分片方案概要(Cluster or Codis) 客户端分片 常见的主要是Memcached 通过客户端Hash等方式决定数据要存到哪个节点 服务器端分片 Codis分片方案 Codis是一整套缓存解决方案,包含高可用、数据分片、监控、管理、动态扩态 etc. 走的是 Client->代理->redis,一定规模后基本都采用这种方式 限制 批量操作可能受影响: 不支持pipeline/watch/scan等批操作 不支持事务 支持mset/mget ** 另一种分片方案 ** 官方Redis Cluster分片方案 走的是Client->redis server jump redis server 限制 批量操作可能受影响: mset/mget/pipeline/watch/scan等批操作需要所有key都存在以同个节点上 并且手动分片期间,...
Redis集群--sentinel 与 cluster的区别
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/redis/Different-Between-Sentinel-And-Cluster.html 一、sentinel 与 cluster的区别 Sentinel的作用 监控+自动故障迁移(自动升主) 定期监控redis是否按照预期良好地运行; 当一个master节点不可用时,能够选举出master的多个slave 并令其自动升主 PS. sentinel本身支持集群 Cluster的作用 分布式集群 对Redis进行16384个槽按照节点分片(默认为均分16384个槽到每个节点) 主从复制 监控+自动故障迁移(同Sentinel) 总结 Cluster 包含Sentinel的功能 Sentinel主要用于: 不需要分片的情况 监控+自动升主进程不想与Redis服务器部署在一起的情况 Redis3.x以下
分布式事务解法
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/Distributed/How-To-Use-Distributed-Transaction.html 可搭配参考我的GitHub: 分布式事务.xmind 参见分布式事务有哪些 1. 基于XA协议的全局事务 (强一致性) 使用情况:一个工程对多个数据源(数据库需要支持XA协议) 基本功能:数据库时间功能+开源组件(知名的分布式事务管理器主要有atomikos、bitronix、narayana。其中,仅atomikos支持XA和TCC两种机制,bitronix、narayana仅支持XA机制。) 原理:2PC/3PC 单服务多数据库使用全局事务 缺点:XA协议比较简单,成本较低,但是其单点问题,以及不能支持高并发(由于同步阻塞)依然是其最大的弱点(主要),2PC本身的缺陷也是一方面原因(次要)。 2PC & 3PC 2PC是两阶段提交协议(Two-Phase Commit) 它保证了所有参与节点在一个事务中要么全部提交,要么全部回滚...
MQ常见问题及其处理方案
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/MQ/mq-common-problem.html 基于Rabbitmq:
jstack定位线上问题
jstack定位问题 出现死循环后,我们可以使用jstack命令来定位问题。 1. 查找JVM进程ID(pid=23199) 1`ps -ef | grep java` 2. 查找发生死循环的线程ID(threadId=23214),CPU利用率暴表的第一条记录就是了。将十进制23214转为十六进制5aae。 1`top -H -p 23199` 3. 使用jstack导出线程dump信息。 1`jstack -l 23199 > ~/threaddump.txt` 4. 分析dump数据,查找CPU最高的线程的运行堆栈。可以看出,死循环发生在HashMap的put()方法。 1`cat threaddump.txt | grep -A10 5aae` 附:查看线程ID方法,windows工具下载地址 最后在Windows下揪出Java程序占用CPU很高的线程并找到问题代码,死循环线程代码
Spring-Cloud服务在Consul中的异常注册
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/Bug-Log-Optimization/bug_in_spring-cloud_instance_registered_with_consul.html 优雅停机脚本见: shell-系统优雅停机 背景 公司实现微服务化并原来使用的Dubbo+Zookeeper实现应用间的服务调用,考虑到Dubbo不在维护最近想要切换为Spring Cloud+Consul 环境 Spring Cloud: Edgware.SR3 Spring-boot: 1.5.13.RELEASE 12345678910111213141516<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE&l...
常见查找算法应用总结2
接: 常见排序算法应用总结 前言 其实多算法涉及不是很深,也不打算在使用前深究,究了没多久就忘了纯属浪费时间。这里做下记录,日后用到直接来这里找就完事啦~~ 常见搜索算法及其特点 1. 线性搜索(Linear Search) 时间复杂度:最好情况 O(1),最坏情况 O(n) 使用场景:适用于数据规模较小,或者数据分布随机的情况 优势:实现简单易懂 缺点:效率较低,不适用于大规模数据的搜索 具体案例:在一个由数值大小不一的小数组中查找特定的数值,例如在一个长度为 10 的数组中查找数值 5 2. 二分搜索(Binary Search) 时间复杂度:O(log n) 使用场景:适用于数据已排序的情况 优势:效率较高,适用于大规模数据的搜索 缺点:需要数据已排序,实现较为复杂 具体案例:在一个由数值大小递增的大数组中查找特定的数值,例如在一个长度为 10000 的数组中查找数值 5000 3. 插值搜索(Interpolation Search) 时间复杂度:最好情况 O(1),最坏情况 O(n) 使用场景:适用于数据有序且分布均匀的情况 优势:效率较高,比...
常见排序算法应用总结
前言 其实多算法涉及不是很深,也不打算在使用前深究,究了没多久就忘了纯属浪费时间。这里做下记录,日后用到直接来这里找就完事啦~~ 常见排序算法时间: 1. 冒泡排序(Bubble Sort) 时间复杂度:最好情况 O(n),最坏情况 O(n^2) 空间复杂度:O(1) 使用场景:适用于数据规模较小的情况,且数据分布情况不明显 优势:实现简单易懂 缺点:效率较低,不适用于大规模数据的排序 具体案例:对于一个由数值大小不一的小数组进行排序,例如对一个长度为 10 的数组进行排序 2. 选择排序(Selection Sort) 时间复杂度:最好情况 O(n^2),最坏情况 O(n^2) 空间复杂度:O(1) 使用场景:适用于数据规模较小的情况 优势:实现简单易懂 缺点:效率较低,不适用于大规模数据的排序 具体案例:对于一个由数值大小不一的小数组进行排序,例如对一个长度为 10 的数组进行排序 3. 插入排序(Insertion Sort) 时间复杂度:最好情况 O(n),最坏情况 O(n^2) 空间复杂度:O(1) 使用场景:适用于数据基本有序的情况,或者数据...
HashMap-JDK1.8
参考链接:HashMap在JDK1.8之前和之后的区别 JDK1.8之前 new HashMap(n)中的n为其容量 元素插入使用头插法 并发插入(resize时)会产生循环链表,在get一个不存在的元素时会导致死循环。参考:Java HashMap的死循环 JDK1.8之后 元素使用尾插法 new HashMap(n)中的n最接近的2^m为其容量 并发插入还是有问题,但不会产生死循环 插入时数组长度>64,桶元素>8时,会树型化 发生resize时,resize后,桶元素个数<=6的,都会被解树型化 取模用与操作(hash & (arrayLength-1))会比较快,所以数组的大小永远是2的N次方。你随便给一个初始值比如17会转为32 resize实现逻辑参考:Java HashMap工作原理及实现 HashMap关于static final int UNTREEIFY_THRESHOLD = 6的分析 遍历整个原始桶,把桶内数据分配到原桶与新桶中 具体图解分析可以参考以下链接的第六点:Java HashMap工作原理及实现 判断新桶元...
1分钟教你redis集群搭建(2服務器)
遇到有疑惑的可参考这个链接 注意: 关闭redis集群不能直接kill掉进程,或者关机,我们要通过命令redis-cli -p 7001 shutdown进行关闭,这样在关闭之前,数据才能够进行保存 1. 安装 redis 详:略 2. 创建 n 个 redis.conf 文件(redis 集群需要至少6个节点[3主3从]) 详: 1234567daemonize yes //redis后台运行pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7002,7003port 7000 //端口7000,7002,7003cluster-enabled yes //开启集群 把注释#去掉cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002clu...
架构已阅文档
架构已阅文档 数据库相关 - 数据库索引,到底是什么做的 这篇文章还介绍了二叉搜索树,B树与B+树之间的区别 - 1分钟了解MyISAM与InnoDB的索引差异 - MySQL不为人知的主键与唯一索引约束 主要讲了MyISAM与InnoDB违反唯一索引时的场景,MyISAM会出现一个update语句,部分执行成功,部分执行失败(因为不支持事务) 分库分表 - 一分钟掌握数据库垂直拆分 - 炸!业界难题,跨库分页的几种常见方案







