自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(302)
  • 资源 (7)
  • 收藏
  • 关注

原创 Logback使用自定义的MDCAdapter

Logback默认的MDCAdapter不支持父子线程传递,而使用TTL线程给MDC put则会产生清理的难题。所以要覆盖Logback的MDC Adapter。

2023-06-13 16:53:34 836 2

原创 JVM Crash的定位和解决办法

JVM的Crash定位及解决办法

2022-06-08 08:41:39 1736 1

原创 如何做性能优化

之前也做了几次的性能优化,每次的过程好像大体上都差不多,所以就此总结一下。如果有哪里不到位的地方,欢迎及时指正。性能优化的过程,我认为可以分为三个阶段:收集监控信息和资料确定改进措施,验证及调整总结最佳实践这里我们主要对前两个部分进行展开。收集监控信息和资料监控信息无论在什么领域,监控都是流程中优化的关键。我们需要从上层下层的顺序去监控,采集到我们需要的信息,然后才能进行优化。应用层本层需要观察到优化的方法每一步的时间,从而逐个击破地进行优化。需要固定的监控点位置有三种:API

2021-10-07 16:40:18 2198

原创 TCP的三次握手和四次挥手

TCP的三次握手和四次挥手为什么需要三次握手呢?我们从图中分析 一下:发送端发送SYN,接收端确认自己接收正常,对方发送正常接收端发送SYN/ACK,发送端确认自己接收正常,对方发送正常。发送端发送ACK来建立链接,发送端和接收端都进入Established的状态。如果不是三次握手会怎么样?没有第三步的情况,会出现接收端不知道自己的ACK有没有发送正常,无法进入数据传输阶段。四次挥手从三次握手也会比较容易懂:发送端发送完了数据,想要关闭链接,于是发一下FIN。接收端收到FIN之

2021-10-06 14:51:25 166

原创 Guava Cache缓存机制说明

在日常使用本地缓存的时候,我们经常会选择GuavaCache,使用起来很方便。不过也会有一些疑惑,主要的疑问点有:如何实现的LRU缓存, LFU又是如何实现的单个key失效大量请求会造成雪崩吗失效key的处理是怎么样的Cache命中率查看那么接下来就让我们一起来看看吧。LRU缓存是如何实现的一切我们从CacheBuilder看起,因为这个类是我们经常用来构建GuavaCache的入口。public <K1 extends K, V1 extends V> Cache<.

2021-10-06 12:29:36 1204

原创 Testable-Mock增强之路

最近我们又在热火朝天的搞起来了单元测试。但谈到单元测试,总是不可避免的涉及到Mock,如何方便地Mock,是一个很大的难题。之所以会是这样的原因,主要是因为Mock的时候希望尽量不侵入原有代码,而且可以任意对部分,包括私有方法进行Mock。在比较工具之后,我选择了最近火热的testable-mock框架,但是在使用的过程发现如果我想进行流程测试,并不是一个测试类对应一个被测类,这样的方式去Mock,有没有办法去增强一下呢? 我们定义一个全局的类,将我们依赖RPC Mock进去,并且支持数据模板的配置

2021-09-30 11:30:24 443

原创 字节码增强总结

经常遇见字节码就懵逼,ASM, CGLIB, Instrument, Aspect, Spring AOP这些都是啥关系,有什么作用。今天就让我们来试着总结一下。一切还要从Instrument讲起Instrument是JVM提供的一个可以修改已加载类的类库,专门为Java语言编写的插桩服务提供支持。在JDK 1.6以前,instrument只能在JVM刚启动类时生效,而在JDK 1.6之后,instrument支持在运行时对类定义的修改。我们看一下instrument的类库都包括什么:Instrum

2021-09-29 18:47:13 416

原创 如何把算法讲明白

在高中的时候发现自己的数学还可以,但是大学之后就不太行了,包括后来学习算法或者给人讲一个普通的算法时候也会很难让人理解和明白。所以自己在想的是,如何将算法或者数学讲明白。理清本质算法的定义:In mathematics and computer science, an algorithm (/ˈælɡərɪðəm/ (About this soundlisten)) is a finite sequence of well-defined, computer-implementable instru

2021-09-16 08:52:05 359

原创 RingBuffer vs Netty零拷贝

为什么会将这两个放在一起原因是这两个缓存比较都是高性能,也比较容易联想到一起,容易搞混。RingBuffer的原理RingBuffer是Disruptor的核心组件,是一个高性能的队列。那么谈到队列,那么首先想到的就会是创建线程池使用的ArrayBlockingQueue和LinkedBlockingQueue。那么这两个有什么缺点呢? 通过阅读代码我们可以得知,ArrayBlockingQueue内部结构是数组,线程安全使用的锁,LinkedBlockingQueue的内部结构是双向链表,线程

2021-09-16 00:04:54 406

原创 JVM Remembered Set图解

为什么要有Remembered Set?因为在JVM的分代收集器里,会存在老年代引用年轻代的情况,这样YGC的时候就必须扫描老年代,这样岂不是编程了FULL GC?所以前人就想了一个办法,精细化管理。将老年代进行分页,就像操作系统的分页一样。当老年代指向年轻代的时候,就把对应的区域更新成脏页,需要进行扫描。有了存储的地方了,怎么写呢?具体的机制是写屏障,但这里的名字也和其他的有重合。这里可以理解为当更新对象的reference时,就像AOP一样,会更新Remembered Set。结构分析Rem

2021-09-14 23:57:30 742

原创 ThreadLocal存储、泄露、TTL线程传递详解

为什么要有ThreadLocal我们知道Java线程的出现是为了共享资源,但在线程运行的过程中,他们也希望能够独享某些资源。ThreadLocal结构和内存泄露分析这里其实有点难以理解。这里来说一下要点。每个Thread有自己的属性threadLocals,是ThreadLocalMap类型ThreadLocalMap是一个EntryTable,Entry拥有对threadlocal的弱引用和valueThreadLocal的实例对象拥有两个引用,一个是它本身的强引用ThreadLocalR

2021-09-11 18:59:10 722

原创 CPU高速缓存原理梳理

为什么要用CPU高速缓存?原因本质是局部性原理,体现在两个方面。时间局部性: 如果一个信息最近被访问,那么很可能会被再次访问空间局部性: 如果一个地址被读取,那么它临近的地址也很可能会被访问。所以相当于我们从时间上缓存了将要执行的指令,从空间上我们缓存将要读取的数据来加速性能。当然速度上肯定是,寄存器>高速缓存>主内存为什么多级呢?我们知道CPU通常都是三级缓存,L1,L2,L3。我们如果想的话,如果性能和成本都足够的话,那么一级就行了。所以还是资本的原因,精细化管理

2021-09-10 00:06:03 911

原创 Collection集合介绍

Collection从接口上一共包括了三种数据结构,Set,List,Map关键点介绍:HashSet是依赖于HashMap实现的,值是固定的LinkedHashSet是继承了HashSet,使用HashSet的构造函数,通过无意义的参数区分,使用的是LinkedHashMapTreeSet是有序唯一的集合,红黑树结构ArrayList内部是Object[]集合LinkedList是双向链表LinkedHashMap保存了一个双向链表。Linked会保证遍历时候的顺序,不过大多数场景都是没

2021-09-09 08:46:48 123

原创 ConcurrentHashMap 1.7和1.8结构图解

在1.7中使用锁的方法是ReetrantLock.在1.8如果数数组元素是不加锁,使用的是UnSafe的compareAndSet方法,如果非数组元素,那么就会使用Synchronized关键字进行加锁。

2021-09-09 00:16:49 315

原创 线程池原理简单解析

记得在4年前面试的时候,在追问为什么要用线程池呢?很简单的回答了因为线程池不用重复创建线程,重复创建线程是一个比较对性能有影响的动作。那么线程池的原理是什么呢? 这个问题一直没问题,今天就简单总结一下。总的结构无论是使用Executors还是Guava的ThreadFactory去构建线程池,都构建的是ThreadPoolExecutor,所以这个就是我们这次分析的目标。ctl变量首先不得不提一个神奇的变量ctl,这里我们简单理解它包含了两个部分: 线程池状态前3位和线程池worker数量。可以参见

2021-09-08 22:41:42 177

原创 HashMap图解

HashMap图解HashMap底层实现JDK7JDK8的HashMap

2021-09-08 00:33:13 91

原创 JVM架构及内存模型详解

JVM架构及内存模型详解JVM内存架构JVM架构主要分成了三个部分:JVM内存模型,主要包括了方法区、堆、虚拟机栈、程序计数器、本地方法栈。在下面进行展开。执行引擎,包括最核心的解释器和GC垃圾回收器,还包括了JIT编译器。本地方法接口和库JVM内存模型这里我们将结合着第二张图一起来看。方法区在JVM的规范里是存储一些常量的区域,主要是类常量。因为运行时也可以产生常量,比如我们最常用的String,所还包括了Runtime Constant Pool。最后它还包括了Code Cac

2021-09-07 09:09:37 424

原创 Spring boot `@Configuration` 和`@AutoConfiguration`的顺序研究

背景最近在实现一个功能,AutoConfiguration如果发现应用project定义了就不再生成。工程目录结构如下: monitor是要deploy的工具包,demo是测试的module.Root -- demo -- monitor在demo Module中代码如下:package com.xxx.yyy.config;public class ProjectConfig { @Bean public XXX config() { return new XXX();

2021-09-06 22:50:58 2004

原创 商品系统设计(四) - 架构设计

商品系统架构上面主要讲了一些商品系统的设计,接下来我们从大的方面来讲一下商品系统应该如何架构。首先商品从业务上可以区分成,类目管理模块和商品模块。商品模块又细分为写管理模块和读管理模块。写管理模块负责商品的写入、搜索,主要运营端的管理,读模块主要负责提供高性能强一致性的读服务。下面分别展开来讲这两个模块。写管理模块架构我们在设计架构的时候,通常会涉及到应用架构,数据架构,技术架构等三个部分。这里我们再根据时间顺序,分为代码架构,数据架构,部署架构,运维架构。代码架构以DDD的思想触发,单位职

2021-08-11 14:59:29 1148

原创 商品系统设计(三) - Saas化的商品系统

多商家的商品系统某天早上小A很兴奋地说到,有几个我的朋友商家都觉得我们的app用起来很棒,那么我们有没有办法让他们也使用呢?小D想了想,好像有点难。因为这次的功能不是一个点而是一个面,所以需要考虑一下。小A说,好的。D哥尽快给我答复啊小D过了一天和小A确认说,是不是只要用我们的app就可以,其他的都按照我们的操作流程来做?小A说,前期肯定是这样的,毕竟也没有个性化的要求。小D说,好的,那好办。多商家的商品系统,最基础也是最本质的就是数据隔离。多个商家互不影响。用例图也是很简单,把所有的功能都

2021-08-10 15:02:01 792

原创 商品系统设计(二) - 完整的商品系统

拥有组织结构的商品系统随着线上的销量越来越多,四兄弟拍板决定要开分店。但是这个又给小D带来一些问题,现在商品里没有店的概念,该如何去支持呢?首先小风想到的是,直接在商品上增加一个门店id,即如下的设计。这样子就可以将商品进行分别管理,分别管理商品的状态、渠道等信息。但是会带来一个问题,就是一个商品的某些信息是一样的,比如商品的名称、图片等,但是因为这个设计的原因,导致变成了两个商品。从维护和管理上都变得更加复杂,而要改进这个设计,需要回答好两个问题:组织结构会承担哪些与商品有关的职责组织结构

2021-08-09 21:24:11 1003

原创 商品系统设计(一) - 简单的商品系统

大学毕业两年后,小A,小B,小C,小D这四个大学要好的朋友终于都有了时间,来到当下很多的仿古代的悦心小酒馆。两年没见,大家都变化了很多,小A继承了父亲"珍贵"的遗产,一个便利店,小B则成为了一个销售经理,每天周旋去各种人之间,小C没有一个固定的工作,小D则成了一个呆头呆脑的程序员。在酒足饭饱之后,大家除了小明都感叹生活不易,打工的辛酸。小A就说道,要不你们也来加入我庞大的家族企业,咱们一起做老板?我这个便利店目前销量不怎么好,现在互联网这么火,要不我们一起创业搞个网上商城?小B和小C眼睛亮了,觉得可行。

2021-08-08 17:31:39 574

原创 商品系统设计-前言

前言接触商品信息将近两年,但每次谈及时仍然无法得心应手,充满信心地地去架构设计,尤其当面对一些上下文模糊的属性,更是不得其解,碍于时间只得抛到脑后,待来日再理。在某个夜晚回到家里时,不仅在想,商品系统究竟是什么,我又该如何能够褪去它的外壳,窥得内中真迹?看着窗外不仅就陷入了沉思,思绪飘到之前分层的必要性的一个讨论,那时候是分而治之。但这个问题不太实用,分而治之解决的问题时无法窥探细节,而对于商品本质的问题,更多的无法纵览其貌。很自然的想到,应该是由浅入深能够解决这个问题,甚至隐约觉得可以总结一下对于问

2021-08-08 17:10:44 244

原创 我眼中的DDD系列二

之前曾经写过一篇DDD,总结了一下自己对于DDD的一些认识,包括认为DDD是一种战略,从道法术器上来讲,还属于道的层面,无法很好的落地。时隔一年后,因为工作参与业务中台建设的关系,也啃了两本书,所以再来阶段性总结一下。在开始总结之前,先立一个小flag,看完要让大家对DDD有一个全局性的认识,如果没有达成,请找我发红包_。DDD就是面向对象DDD的全称是领域驱动设计,与之前的设计模式相比有较大的不同。假如我们回忆一下编程语言发展的历史,其实就会感受到,编程语言的发展是从指令、到过程式,再到面向对象。假

2021-06-24 12:28:30 213 1

原创 Spring JDBCTemplate事务探索

Spring JDBCTemplate事务探索背景我们应用里有一个获取序列的服务,主要的流程是每次去数据库取号段,然后存储到本地。在数据库取号段的时候使用乐观锁来保证号段的唯一性,如果失败会有重试。交代完服务流程,下面来说一下出现的问题,偶尔会出现重试20次获取的值都一样的问题。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qkVRzpFu-1621487081077)(https://raw.githubusercontent.com/Sutonline/md-i

2021-05-20 13:05:46 205 1

原创 Druid的CreateConnectionThread无故消失分析

现象在升级弹性数据库后,我们发现我们的应用在运行一段时候后,某些容器会收到服务端线程池满,并且一直不能恢复的情况。线程为什么hang住了在遇到线程问题时,我们首先想到的工具就是jstack。拿到拿到日志后,我们来一起看一下RPC有关的线程。"RPC-BZ-22000-91-T-1" #419 daemon prio=5 os_prio=0 tid=0x00007f3dd8030800 nid=0x98b0a waiting on condition [0x00007f4169504000] j

2021-04-30 19:42:48 1812 1

原创 MySQL事务会加锁吗

目标确认MySQL transaction与锁的关系Select…for Update的锁与释放机制MySQL transcation与锁的关系In the InnoDB transaction model, the goal is to combine the best properties of a multi-versioning database with traditional two-phase locking. InnoDB performs locking at the row

2021-04-13 14:50:03 4932 2

翻译 MVC vs MVP vs MVVM

MVC vs MVP vs MVVMMVCMVC是最早也是最为人所知道的分层架构模式,主要的层级特点是:The model is responsible for managing the data of the application. It receives user input from the controller.The view renders presentation of the model in a particular format.The controller respond

2021-04-12 12:55:44 95

原创 云原生-有赞技术分享记录

1. 云原生是什么在分享之前,我们还是来看看官方的定义是什么。云原生技术有利于各组织在公有云、私有云和混合云等新型动态 环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括:容器、服务网格、微服务、不可变基础设施和声明式 API 。 这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对 系统作出频繁和可预测的重大变更。从这个定义上可以看出云原生具有以下特点:支持多种云基础设施与微服务容错、易于管理、松耦合所以王健也是分享了一

2021-04-04 18:03:30 153

原创 RUP简介

RUP是IBM下的Rational Software公司创建的一个软件迭代开发过程框架,全称是Rational Unified Process(RUP),统一开发过程。可以理解为软件开发过程的一个规范和建议。RUP组成元素RUP主要包括三个部分:Roles (who) – A role defines a set of related skills, competencies and responsibilities.Work products (what) – A work product r

2021-03-11 22:28:24 1324

原创 Word无格式粘贴快捷键

Word无格式粘贴快捷键最近在使用word文档写东西,发现粘贴出来的总是带格式,要么手动选择,要么就是把复制的东西先转到文本编辑器中"中转"一下。在网上找了一个宏的方法,但是录制下来几次都并不好使。所以在网上找到了一个宏的无格式粘贴代码。Sub 无格式粘贴()''无格式粘贴Selection.PasteSpecial Link:=False, DataType:=wdPasteText, Placement:=wdInLine, DisplayAsIcon:=FalseEnd Sub操作步

2021-02-20 10:40:51 1671

原创 企业级业务架构设计读书感想

企业级业务架构设计读书感想对于非工具类的书,个人觉得最好是可以尝试将文中的观点再次阐述总结,来将书中的思想尽可能选择有益的进行吸收。业务架构是什么?就像字面意思一样,是业务的架构,但是这么直白的解释,往往一下子就把人给搞晕了。我们先不说为什么会这样,让我们来举一些其他架构的例子。建筑自己的小房子假如我们拥有了一块儿日朗风清,山水相依的土地,希望在这儿停留,搭建一个房子。那么我们会怎么做呢?我们会先设计房子的结构。我们需要先画一个四方形,然后加上屋顶、窗户和门,简单来看就是一个小房子了。如

2021-01-17 11:34:36 740

原创 延迟请求组件设计

最近有一个需求,调用某个服务不需要返回结果,收敛窗口时间的请求, 最后进行一次调用,来避免并发出现的问题。网上搜了一下这样的需求还是挺多的,但每个解决方案解决的问题又不太相同。所以就来整理一下。思路从需求出发,我们可以从功能上进行分析,如何进行实现。假设我们的组件叫A。那么A要做到单位T时间内合并请求,超过T后将请求发给服务端进行真正调用。实现的大概思路就是: 我们存储一个任务(T)时间内有效,当T时间内的请求后过来时,将请求过滤掉,在时间达到T后,将任务T发送出去进行执行。这个简单来看是一个自动失

2021-01-13 23:15:37 149

原创 Spring Boot 2.x自定义注入器`java.lang.Object`启动失败排查记录

Spring Boot 2.x自定义注入器java.lang.Object启动失败排查记录背景在最近的一个项目中,同事为了使用@EnableCaching导致工程启动不了,其中报错的是我们公司内部自定义的注入解析器(类似于AutoWired注解)。分析原因首先根据堆栈可以得知是空指针了.Caused by: java.lang.NullPointerException: null at com.xxx.rpc.spi.BeanUtils.getAllField(BeanUtils.java:40

2021-01-03 20:09:10 258

原创 系统设计时先画用例图还是流程图

系统设计时先画用例图还是流程图最近在做系统设计时,在开始之初总是会纠结是先画流程图还是先描述用例图?先画用例图,好像无法一下子把握到系统比较明确的职责?先画流程图,看起来容易把握了系统职责,但感觉好像是跳过了一些东西直接进入到了细节之中?举个例子对于上述问题,可能不能一下得到答案。那么我们拿战争来思考一下,如何系统去做。直觉式的思考过程:终极目标: 扩张获取更多的资源。战略: 分阶段打造强大的基础能力(经济和军事实力)。分工: 设立合适的组织,统一认识,实现分解的小目标。当然战争是一个

2020-12-24 00:28:10 4095

原创 java type设计分析

java的Type设计分析在1.5版本后,java设计了Type,但是对于Type是什么一直也是和清晰,所以一起看一下吧。分析的方式采用UML类图的方式,进行功能设计的解释说明。设计分析Type接口这个接口是所有类型的超类,只有一个没有很大作用的getTypeName()的默认方法,默认返回toString。GenericArrayType接口是一个数组类型接口,它的元素是ParameterizedType或者TypeVariable。只有一个方法,返回数组元素的类型。Wilca

2020-12-13 21:34:18 153

翻译 Java集成Groovy

Java集成Groovy1. 介绍在这次教程里,我们将会探索一下如何将Groovy集成到一个Java应用中.2. Groovy的简短介绍Groovy是一个很有用的弱类型动态语言。开发支持主要来源于Apache基金会和超过200个开发者的Groovy社区。它可以用来构建一个完整的工程,或者作为一个Module,第三方集成到Java代码中。甚至可以作为脚本在执行时动态编译。更多的介绍,请阅读 Introduction to Groovy Language 或者 official documentat

2020-11-15 18:16:49 1726

原创 对存储读写分离方式的思考

在项目中,我们一般连接的都是主库,当读比较多时,就会对主库的CPU、内存造成压力,而最常见的解决方案无非就是扩容及读写分离。那么我们就从"形而上"来看看读写分离。读写分离的本质读写分离,更确切地应该称之为流量分离,使数据库请求的流量均衡地打到主从服务器上,实现资源的充分利用。本质上基于多资源的连接能力,分离流量。因为从库只能读,所以也经常会被成为读写分离。但在真实的场景中,不一定就是完全的读写分离。读写分离的实现形式目前还没有进行相关的分类,或者我没有找到相关的分类。所以下面是我的一个总结。.

2020-10-20 23:47:42 178

原创 我对Redis线程模型的理解

在网上翻了一下关于"Redis线程模型"搜索结果,都是在说IO多路复用。但是我个人觉得线程模型的定义更多的集中在线程,而请求处理模式,所以决定记录一下个人的想法。先谈一下Redis中的线程,Redis的线程可以分为三种:socker连接线程-套接字Redis主线程后台线程(处理BGSAVE命令等操作)因为Redis是类似单线程,所以线程模型很简单。在简单的线程下,Redis线程是如何工作的呢?根据上面线程的划分,主要分成下面两个部分:Redis处理请求方式socket线程连接用来连接.

2020-10-18 16:04:27 208

原创 Druid开启日志

Druid开启日志最近总是会有线上机器的com.alibaba.druid.pool.DruidDataSource.CreateConnectionThread会无故的退出,导致池中连接处小于minIdle甚至变成0, 所以就想打印这个线程或者DruidDataSource的日志来帮忙定位一下问题。那么就让我们来看一下druid的日志体系吧。Logger name如何生效的首先先引入Loggername配置的是如何生效的吧。logger的name具有父子关系,比如org就是org.sprin.

2020-10-15 22:45:33 3529

分布式设计-降级设计

分布式的设计以及hystrix的一些Q&A, 其中如果有其他的第三方工具再进行补充

2018-10-13

分布式事务思维导图总结

分布式事务总结,包括了目前所知道的理论,二段三段saga协议。但没有包括一致性算法

2018-09-17

netty in action 中文版 高清带目录 来个最便宜的

Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

2018-04-10

Restful WebService

Restful 简单例子

2016-05-20

SOAP WebService简单例子

基于eclipse和axis2的soap webservice

2016-05-20

Spring整合mybatis例子

Spring整合mybatis源代码,具体的图文可见我的博客。

2016-02-29

ssh框架搭建例子

SSH框架搭建的例子,简单入门级别。大神请绕路,菜鸟可以参考。

2016-02-24

空空如也

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

TA关注的人

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