架构之路
文章平均质量分 66
JdbcUtils
生活不止眼前的苟且,还有诗和远方。
展开
-
arthas实用工具梳理篇
arthas实用梳理篇。原创 2022-09-29 17:01:05 · 1139 阅读 · 0 评论 -
深入理解ThreadLocal的原理和内存泄漏问题
ThreadLocal作用和原理分析:ThreadLocal主要为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。要理解ThreadLocal需要理解下面三个问题:①、每个线程的变量副本是存储在哪里的?(参考ThreadLocal的get()源码) 每个线程都有一个threadLocals成员,引用类型是ThreadLocalMap,以ThreadLocal和T...原创 2018-09-03 22:51:43 · 20443 阅读 · 14 评论 -
并发包中的 Semaphore 的使用
Semaphore定义: 一个计数信号量。它通过控制一定数量的允许(permit)的方式,来达到限制通用资源访问的目的。你可以想象一下这个场景,在车站、机场等出租车时,当很多空出租车就位时,为防止过度拥挤,调度员指挥排队等待坐车的队伍一次进来 5 个人上车,等这 5 个人坐车出发,再放进去下一批,这和 Semaphore 的工作原理有些类似。使用示例:public class Semap...原创 2018-07-31 15:39:57 · 12700 阅读 · 0 评论 -
整理一下:遇到的Java服务故障问题及排查方案
常见问题 1:CPU 利用率高问题CPU 使用率是衡量系统繁忙程度的重要指标,一般情况下单纯的 CPU 高并没有问题,它代表系统正在不断的处理我们的任务,但是如果 CPU 过高,导致任务处理不过来,这个是非常危险需要关注的。CPU 使用率的安全值没有一个标准值,取决于你的系统是计算密集型还是 IO 密集型,一般计算密集型应用 CPU 使用率偏高 load 偏低,IO 密集型相反。问题原因:1、频繁 FullGC/YongGC如何排查:查看 gc 日志;jstat -gcutil pid 查看原创 2021-03-28 13:45:20 · 1137 阅读 · 0 评论 -
重温Mysql及部分原理挖掘
01 | 基础架构:一条SQL查询语句是如何执行的?大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。存储引擎层负责数据的存储和提取。其架构模式是插件...原创 2020-08-21 18:26:31 · 18437 阅读 · 0 评论 -
使用 MAT 排查分析 OOM 问题案例
MAT相信有一定经验的开发者多少都会在生产环境上碰到过内存溢出(OOM)的问题吧。对于排查 OOM 问题、分析程序堆内存使用情况,最好的方式就是分析堆转储。Java 的 OutOfMemoryError 是比较严重的问题,需要分析出根因,所以对生产应用一般都会这样设置 JVM 参数,方便发生 OOM 时进行堆转储:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxx/xxx关于分析堆存储文件的话,推荐使用Eclipse 的 Memory Ana原创 2020-08-13 15:56:54 · 2519 阅读 · 0 评论 -
MQ的常用场景 && 最佳实践
RocketMQ消息队列 RocketMQ 版是阿里云基于 Apache RocketMQ 构建的低延迟、高并发、高可用、高可靠的分布式消息中间件。消息队列 RocketMQ 版既可为分布式应用系统提供异步解耦和削峰填谷的能 力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。建议统一消息格式统一消息格式,message由两部分组成id:由生产者生成,每次不重复,...原创 2020-04-01 16:10:22 · 33428 阅读 · 0 评论 -
HashMap引发死链问题(HashMap、ConcurrentHashMap原理解析)
事故背景一个CPU使用率飙升至100%的线上故障,原因是在并发情况下使用HashMap导致死循环。当cpu使用率100%时,查看堆栈,发现程序都卡在了HashMap.get()这个方法上了,重启程序后问题消失。但是过段时间又会来。HashMap结构HashMap 是我们经常会用到的集合类,JDK 1.7 之前底层使用了数组加链表的组合结构,如下图所示:HashMap通常会用一个指针数组...原创 2020-03-31 23:06:12 · 4388 阅读 · 7 评论 -
消息队列 RocketMQ原理和使用整理
背景由于公司之前使用的队列中间件是kafka,近期变更为使用阿里的RocketMQ,所以对RocketMQ进行一下简单的知识整理。后续研究其内部原理后,再来一篇深入理解。说明消息队列 RocketMQ 版是阿里云基于 Apache RocketMQ 构建的低延迟、高并发、高可用、高可靠的分布式消息中间件。消息队列 RocketMQ 版既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具...原创 2020-03-23 15:11:17 · 3713 阅读 · 0 评论 -
记一次通过优化日志解决高并发服务性能瓶颈问题
事故发现服务在生产环境中,由于同一时间段请求量过大,导致服务响应速度急剧下降。甚至会出现拒绝服务的问题,第一时间想到是机器性能问题,无法满足并发如此大的场景,需要进行扩容或者服务限流。经过扩容之后平稳了一个多月之后,又一次大量请求打进来的时候出现了此问题。这时才意识到开始从各个角度去排查问题。事故排查过程一个系统的吞吐量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。...原创 2020-03-18 17:50:24 · 36584 阅读 · 0 评论 -
Java动态代理相关简述
一、概念:Java动态代理的优势是实现无侵入式的代码扩展,也就是方法的增强;让你可以在不用修改源码的情况下,增强一些方法;在方法的前后你可以做你任何想做的事情(如Spring AOP、cglib等)。代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。(个人理解就是对调用目标的一种...原创 2020-01-20 11:53:39 · 389 阅读 · 0 评论 -
Sentry基本原理
官方文档:sentry官网Sentry基本介绍Sentry 是一个实时事件日志记录和汇集的平台。其专注于错误监控以及提取一切事后处理所需信息而不依赖于麻烦的用户反馈。它分为客户端和服务端,客户端(目前客户端有Python, PHP,C#, Ruby等多种语言)就嵌入在你的应用程序中间,程序出现异常就向服务端发送消息,服务端将消息记录到数据库中并提供一个web页方便查看。Sentry由pyth...原创 2019-11-08 19:30:37 · 6144 阅读 · 0 评论 -
深入理解Java中的volatile关键字
常用于保持内存可见性和防止指令重排序。保持内存可见性内存可见性(Memory Visibility):所有线程都能看到共享内存的最新状态。以下是一个简单的可变整数类:public class MutableInteger { private int value; public int get(){ return value; } ...原创 2018-08-29 22:13:54 · 12534 阅读 · 0 评论 -
基于Redis实现分布式锁剖析
之前的文章《分布式锁详解 - 分别利用Zookeeper和数据库实现分布式锁》,由于篇幅太长,又碰上加班时间不够充裕,所以没有把Redis的实现也顺带进去,特此做一些利用Redis实现分布式锁的分析。PS:让我做选择的话,分布式锁的选择还是更愿意选择利用Zookeeper去实现的。原因的话可以参考下面这张图:一、关于Redis分布式锁的基础知识1、缓存有效期:redis中的数据,不一定都...原创 2019-04-25 21:30:34 · 50139 阅读 · 4 评论 -
基于Dubbo的分布式服务日志追踪实现
日志系统中的MDC可以在服务内部提供很好的日志追踪支持。 MDC.put(C.LOG.TRACE_ID, "唯一标识串");但是分布式(RPC)的情况下,如何实现呢?以Dubbo为例,我们可以借助Dubbo的上下文信息RpcContext配合Dubbo的SPI扩展实现扩展拦截器来完成服务间的日志追踪。一、上下文信息上下文中存放的是当前调用过程中所需的环境信息。RpcContex...原创 2019-04-26 11:03:33 · 51611 阅读 · 7 评论 -
分布式锁详解 - 分别利用Zookeeper和数据库实现分布式锁
一、锁的相关描述1、锁的使用流程:首先参考一下JDK所实现的锁的通用接口Lock.java接口:/* * @since 1.5 * @author Doug Lea */public interface Lock { /** * 加锁 */ void lock(); /** * 锁中断 */ void l...原创 2019-04-23 15:10:16 · 7528 阅读 · 0 评论 -
雪花算法
雪花算法雪花算法的原始版本是scala版,用于生成分布式ID(纯数字,时间顺序),订单编号等。结构:算法描述:最高位是符号位,始终为0,不可用。41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。10位的机器标识,10位的长度最多支持部署1024个节点。12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生...原创 2019-04-23 17:07:21 · 53556 阅读 · 0 评论 -
JVM内存模型和GC算法分析
JVM运行时数据区JVM在运行过程中会把它所管理的内存划分成若干不同的数据区域。线程私有:程序计数器、虚拟机栈、本地方法栈 (主要存放指令)线程共享:堆、方法区 (主要存放数据)一、程序计数器程序计数器是用于存放下一条指令所在单元的地址的地方。我们可以随意拿一个class文件进行反编译,看看其结构。如下,JvmDemo.class文件:cafe babe 0000 0033...原创 2019-05-09 12:32:19 · 48924 阅读 · 0 评论 -
JVM调优和垃圾回收相关参数整理
一、内存调优-Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize)-Xms和-Xmx可以说是最流行的JVM参数,它们可以允许我们指定JVM的初始和最大堆内存大小。一般来说,这两个参数的数值单位是Byte,但同时它们也支持使用速记符号,比如“k”或者“K”代表“kilo”,“m”或者“M”代表“mega”,“g”或者“G”代表“gi...原创 2019-05-10 11:42:12 · 48033 阅读 · 0 评论 -
kafka架构分析和配置使用整理
一、软件简介Apache Kafka是开源的分布式流处理平台,也是高吞吐量的分布式跨平台订阅消息系统,主要包含Broker服务器、Topic消息类别、Partition物理分区、Producer生产者、Consumer消费者、Consumer Group消费组部分。二、架构图总结:•Broker : Kafka消息服务器,消息中心。一个Broker可以容纳多个Topic。•Prod...原创 2019-06-21 17:41:43 · 697 阅读 · 0 评论 -
KMP、BM、Sunday、Horspool、strstr 字符串匹配算法介绍和性能比较
文章转自:https://blog.csdn.net/qq_33515733/article/details/81163135转载 2019-08-26 16:25:46 · 1038 阅读 · 0 评论 -
Java位运算符
一、Java中所支持的位运算符一共有7个符号说明&按位与。当两位同时为1时才返回1。|按位或。只要有一位为1即可返回1。~按位非(取反)。单目运算符,将操作数的每个位(包括符号位)全部取反。^“异或”运算。当两位相同时返回0,不同时返回1。<<左移运算符。>>右移运算符。>>>...原创 2019-09-17 22:04:52 · 348 阅读 · 0 评论 -
Fork/Join - 并发框架源码解析
什么是Fork/Join框架Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。我们再通过Fork和Join这两个单词来理解下Fork/Join框架,Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算1+2+ … +100...转载 2019-03-28 22:01:47 · 54941 阅读 · 0 评论 -
ConcurrentLinkedQueue线程安全的队列源码解析
ConcurrentLinkedQueue简介在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现。ConcurrentLinkedQueue是一个基于链接节点的...原创 2019-03-28 19:43:17 · 51030 阅读 · 0 评论 -
总结一些索引使用和优化规范
1、索引列的数据长度能少则少。答:这个原因很简单,B-Tree各个节点能存储信息更多,减少树的告诉,效率自然也能得到提示。2、索引一定不是越多越好,越全越好,一定是建合适的。答:索引多了,检索速度虽然可能得到提升。但是“写”相关操作的效率可就不容小觑了。3、匹配列前缀可用到索引like abc%。但是 like %9999%、like %9999用不到索引。答:最左匹配原则。4、Whe...原创 2019-04-01 20:40:15 · 51823 阅读 · 0 评论 -
WebService通信机制的理解
一、SOA和WebService SOA(service-Oriented Architecture)是面向服务的架构,是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以使用一种统一和通用的方式进行交互。web s...原创 2018-04-23 19:38:58 · 16431 阅读 · 0 评论 -
并发编程设计之Master-Worker模式
简介Master-Worker模式是常用的并行设计模式。它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程。Master进程负责接收和分配任务,Worker进程负责处理子任务。当各个Worker进程将子任务处理完后,将结果返回给Master进程,由Master进行归纳和汇总,从而得到系统结果。处理过程如下图:Master-Worker模式的好处是,它能将大任务分解成若...原创 2018-10-23 17:00:40 · 12820 阅读 · 0 评论 -
借助工厂模式统一管理Dao层实例
通常情况下,我们会把项目中的进行持久化操作的各个Dao实例交由spring IOC容器进行管理。利用依赖注入使用该Dao实例。那么不妨可以尝试这样做,定义一个存放所有Dao实例的工厂,将项目中所有的Dao实例都转化为该工厂的静态成员,那当我们需要使用的时候,就可以很灵活的去调用各个持久化的方法。实例(以mybaits为例)1、假定目前工程的Dao模块存在3个mapper接口:AxxMap...原创 2018-10-25 16:55:45 · 13154 阅读 · 0 评论 -
深入理解TransactionTemplate编程式事务
Spring可以支持编程式事务和声明式事务。Spring提供的最原始的事务管理方式是基于TransactionDefinition、PlatformTransactionManager、TransactionStatus 编程式事务。而TransactionTemplate的编程式事务管理是使用模板方法设计模式对原始事务管理方式的封装。源码探索查看 TransactionTempla...原创 2018-10-25 11:49:56 · 63275 阅读 · 8 评论 -
分布式日志分析平台 ELK 的原理
为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。一般大型系统是一个分布式部署的架构,不同的服务模...转载 2018-09-02 23:53:40 · 15100 阅读 · 0 评论 -
springmvc运行流程分析,手写spring框架尝试
该文章主要是分析Springmvc启动的流程(配置阶段、初始化阶段和运行阶段),可以让自己对spring框架有更深一层的理解。对框架比较感兴趣的朋友都可以了解阅读下,对于我所描述的内容有错误的还望能不吝指出。对于springmvc中的整个流程我个人把他分为这几个阶段,包括个人手写的spring也是参照此按阶段实现:1.配置阶段根据web.xml ,先定义Dispa...原创 2018-06-10 23:28:18 · 119241 阅读 · 11 评论 -
微服务概述、微服务框架对比(SpringCloud与Dubbo)
什么是微服务? 目前的微服务并没有一个统一的标准,一般是以业务来划分 将传统的一站式应用,拆分成一个个的服务,彻底去耦合,一个微服务就是单功能业务,只做一件事。 微服务与微服务架构 微服务是一种架构模式或者一种架构风格,提倡将单一应用程序划分成一组小的服务==独立部署==,服务之间相互配合、相互 协调,每个服务运行于自己的==进程==中。 服务与服务间采用轻量级通讯,如HTTP的REST...原创 2018-06-11 16:31:16 · 63133 阅读 · 0 评论 -
架构学习知识体系图
内容过多,请点击看大图!原创 2018-06-11 15:15:37 · 60234 阅读 · 0 评论 -
HashMap源码解析
源码博客相关博客写了那么多,突然想起来都没有写一篇我们日常开发中最常见的HashMap,今天补一下!HashMap简介:HashMap 是应用更加广泛的哈希表实现,行为上大致上与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键和值等。通常情况下,HashMap 进行 put 或者 get 操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的...原创 2018-11-02 18:11:06 · 12552 阅读 · 0 评论 -
InputStream 源码分析
InputStream是所有输入字节流类的超类。下面是对InputStream源码对一些基本解读:public abstract class InputStream implements Closeable { private static final int SKIP_BUFFER_SIZE = 2048; private static byte[] skipBuffer...原创 2018-11-21 11:02:15 · 12900 阅读 · 1 评论 -
同步锁的优化思路及JDK对锁的一些优化
一、锁优化的思路和方法主要有以下5点:减少锁持有时间主要就是精准的确定需要加锁的模块,不需要加锁的代码模块分离在同步块之外。减小锁粒度将大对象(这个对象可能会被很多线程访问),拆成小对象,大大增加并行度,降低锁竞争。降低了锁的竞争,偏向锁,轻量级锁成功率才会提高。最最典型的减小锁粒度的案例就是ConcurrentHashMap。锁分离最常见的锁分离就是读写锁ReadWri...原创 2019-04-10 16:47:08 · 52515 阅读 · 0 评论 -
自旋锁、阻塞锁、可重入锁使用解析
自旋锁自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区。如下:public class SpinLock { private AtomicReference<Thread> sign =new AtomicReference<>(); public void lock(){ Thread curre...原创 2019-03-29 16:39:46 · 55858 阅读 · 0 评论 -
【xxl-job分布式任务调度系统】特性整理
一、概述XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。二、使用细节1、调度中心集群调度中心支持集群部署,提升调度系统容灾和可用性。调度中心集群部署时,几点要求和建议:DB配置保持一致;登陆账号配置保持一致;集群机器时钟保持一致(单机集群忽视);建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回...原创 2019-02-27 14:51:36 · 53946 阅读 · 0 评论 -
借助Spring和自定义注解完成多数据源配置(主从库示例)
前一段时间研究了一下spring多数据源的配置和使用,为了后期从多个数据源拉取数据定时进行数据分析和报表统计做准备。由于之前做过的项目都是单数据源的,没有遇到这种场景,所以也一直没有去了解过如何配置多数据源。 后来发现其实基于spring来配置和使用多数据源还是比较简单的,因为spring框架已经预留了这样的接口可以方便数据源的切换。 先看一下spring获取数据源的源码: 可以看到Ab...转载 2018-09-17 11:18:03 · 13148 阅读 · 0 评论 -
JVM监控工具jstat使用详解
一、常用的JVM监控工具有如下几项:1、VisualVM:是一种集成了多个JDK命令行工具的可视化工具,它能为您提供强大的分析能力。所有这些都是免费的!它囊括的命令行工具包括jps,jstat,jmap,jinfo,jstack,JConsole,这些工具与JDK的标准版本是一致的。2、jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的...原创 2019-01-02 15:36:12 · 12887 阅读 · 0 评论