自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 资源 (2)
  • 收藏
  • 关注

原创 记一次压测环境OOM问题排查与解决

测试同学在管理后台上传一张3M的图片时,发现界面停留在卡死的状态,就喊我排查下。听到这个后首先要做的就是看这个管理后台服务的日志。从日志里清楚的看到,居然是可恶的堆内存溢出。排查堆内存溢出过程还好我们jvm的启动参数里有配置在发生OOM时dump内存快照-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/app/sc-manage/logs我登录到OOM的这台机器把内存快照文件下载到本地,准备用MAT来分析下。MAT是什么MAT是一款强大的

2021-01-02 15:04:17 490

原创 SpringCloud项目日志接入ELK实战

本地搭建ELK实战,采集服务日志输出到elasticsearch,然后从kibana查看日志

2023-01-19 20:55:36 2114

原创 SpringCloud复习之Sleuth+Zipkin链路追踪实战

SpringCloud Sleuth + Zipkin实现微服务链路监控实战

2023-01-16 20:42:56 750

原创 SpringCloud Netflix复习之Zuul

从源码的角度看下Zuul的路由转发和多个阶段的过滤器执行原理。

2023-01-15 18:59:40 804

原创 SpringCloud Netfllix复习之Hystrix

Hystrix在SpringCloud环境中的使用,如何和OpenFeign整合,底层源码细节

2023-01-12 16:23:41 653

原创 SpringCloud Netflix复习之OpenFeign

OpenFeign的核心组件和实战,以及从源码层面对OpenFeign动态代理和处理请求进行验证

2023-01-07 20:25:01 530

原创 SpringCloud Netflix复习之Ribbon

Ribbon的核心功能,上手实战和源码验证

2023-01-05 17:03:54 675 1

原创 SpringCloud Netflix复习之Eureka

Eureka核心功能和源码验证

2023-01-04 08:15:00 331

原创 关闭Spring security的登录验证

项目里跟security相关的写在一个common-security包里,然后我的一个服引用了common-security包间接导致我这个服务引用了<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> </de

2021-11-13 16:52:51 4263

原创 记一次excel导入mysql的踩坑实录

工作中遇到的问题,需要通过navicat工具把excel里数据直接导入到mysql。遇到以下问题首先是打开excel文件失败我当时是这么做的,先尝试用wps打开要导入的excel文件,发现能打开呀,于是再尝试导入一次,结果成功了。所以解决办法是,本地先用wps打开,然后记住窗口不要关闭,也就是你要导入的excel文件处于wps的打开状态,再尝试导入。...

2021-08-04 10:10:20 235

原创 Spring Security配置用户密码的几种方式

Spring Security作为Spring Cloud生态的安全组件,又火热了起来,很有必要再回过头来好好学习下Spring Security安全框架了。SpringBoot傻瓜式集成Security引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security&l

2021-05-15 13:27:08 1258 2

原创 Innodb存储引擎的架构设计原理与总结

MySQL最常用的就是InnoDB存储引擎,我们借助一条更新语句的执行,来理解下InnoDB存储引擎的架构设计原理。假设我们有一条SQL语句是这样的:update users set name = '李四' where id = 1;SQL语句的执行流程这条SQL语句是如何执行的?首先我们的系统通过一个数据库连接发送到了MySQL上然后会经过SQL接口、解析器、优化器、执行器几个环节,解析SQL语句,生成执行计划接着去由执行器调用InnoDB存储引擎的接口去执行。InnoDB的重要内存

2021-01-05 10:40:46 273

原创 Sql语句里用关键词查询,结果匹配出为0的记录出来

最近排查一个问题,大致是一个支持用关键词来匹配结果,看下面截图需求大概是输入框里输入的keyword,可能是会员ID,也可能是会员名称,于是才有了这个sql,然后fromPartyId在mysql数据库是int型的,sql语句里fromPartyId = ‘张愉’,mysql看到int型匹配一个字符串varcahr型的,会当做0来处理,所以在关键字查询时特别注意下这个问题。解决办法就很简单了,要么对结果里过滤掉为0的记录,要么修改sql。...

2021-01-02 17:23:49 978

原创 动手模拟对象进入老年代,查看JVM Full GC日志

我想通过代码模拟出Full GC的场景,然后记录查看Full GC日志的一些心得。首先有一些概念要提前说清楚,full gc前后一般会触发一次young gc,young gc是特指年轻代的gc,而full gc从字面理解是对整个堆内存的gc,包括年轻代、老年代、永久代。很多时候full gc很多人想表达的意思是old gc也就是老年代的gc。我这次的full gc就是old gc的意思,我想模拟对象进入老年代,然后触发old gc,看整个gc的日志。哪些对象会进入老年代长期存活躲过15次young

2020-12-26 16:48:28 760

原创 JVM Young GC模拟触发和日志查看

先写一段代码配合设置的JVM 参数来模拟Young GCJVM参数设置是这样的我本地JDK是1.8,参数是按照1.8来设置的-XX:NewSize=5120k-XX:MaxNewSize=5120k-XX:InitialHeapSize=10240k-XX:MaxHeapSize=10240k-XX:SurvivorRatio=8-XX:PretenureSizeThreshold=10240k-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:+Pr

2020-12-23 17:05:08 283

原创 synchronized底层加锁原理自己的理解与总结

synchronized加锁实现方式1、在进入加锁代码块时增加一个monitorenter指令,然后针对锁对象关联的monitor累加加锁计数器count,同时标志这个线程加了锁。synchronized是可重入锁,就是可以多次加锁,每加一次,monitor里加锁计数器都加1。2、在离开加锁代码块是增加一个monitorexit指令,然后递减monitor里的加锁计数器,如果加锁计数器递减为0,就标志当前线程不持有锁,也就是释放了锁。3、然后wait和notify关键字的实现也是依托于monitor实

2020-11-29 11:47:00 379

原创 volatile底层实现可见性、有序性的理解与总结

并发编程中常常绕不开原子性、可见性与有序性的讨论。本文的标题中提到了volatile对可见性和有序性的保证,唯独没有提原子性,是因为volatile只有在特定场景下才会保证原子性,像volatile++ 这种复合的操作是不保证原子性的,当然对任意单个volatile变量的读/写是具有原子性的。什么是原子性原子(atomic)本意是不能被进一步分割的最小粒子,而原子操作意为不可被中断的一个或者一系列操作。文章开头说volatile只有特定场景下才会保证原子性,这个特定场景就是在32位处理器里,对do

2020-11-28 20:23:33 206

原创 happens-before自己的理解与总结

我们知道Java代码在编译后会变成Java字节码,类加载器把Java字节码加载到JVM里,JVM执行字节码,最终会转化成汇编指令在cpu上执行。在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序,看下图。1、编译器优化重排序,什么意思呢,就是编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。2、指令级并行重排序,它的意思是如果不存在数据依赖性,处理器可以改变语句对应机器码指令顺序,多条指令重叠执行。3、内存系统重排序,它的意思是现代处理器都有高速缓存和写缓冲区,这样看

2020-11-28 10:38:54 164

原创 CPU是如何通过缓存一致性MESI协议解决可见性的

上一篇文章,介绍了CPU的一些关键组件、高速缓存、写缓冲区和无效队列等,文章结尾留下了一个问题,就是CPU为了性能引入的写缓冲区和无效队列后可能会导致线程之间不可见问题。想了解硬件层面导致的可见性问题的朋友可以看下关于CPU几个不得不知的概念,文末有说明。底层解决方案CPU通过缓存一致性MESI(修改、独占、共享、无效)协议,这个MESI协议实际上有很多种不同的实现,具体的实现机制要靠具体底层的系统如何实现。比如有一种实现,就是一个处理器将另外一个处理器的高速缓存中的更新后的数据拿到自己高速缓存来更新一

2020-11-27 09:23:57 370

原创 关于CPU的几个概念自己的理解

现代处理器为了提高性能都引入了高速缓存、写缓冲区、无效队列(有些处理器比如X86没有)等东西,本文将和大家一起来看看这些东西究竟是个啥玩意,能解决什么问题。高速缓存由于对现代处理器的运行速度要求越来越高,为了提高性能,硬件设计者就引入了高速缓存的概念。处理器有了高速缓存后,就不直接跟内存发生读写操作,而是读写高速缓存里数据。写缓冲区现代处理器都有自己的写缓冲区,来临时保存写入内存中的数据,要注意的是写缓冲区只对自己的处理器可见。在介绍写缓冲区之前,必需先要了解MESI(缓存一致性)协议。现代处理器都

2020-11-24 22:43:09 313

原创 Java内存模型自己的理解

面试题:i++是线程安全的吗有一个经典的面试题:i++是线程安全的吗。对于这个问题,稍微懂些答题技巧的朋友就知道回答只要是多线程执行是不安全的。那肯定是线程不安全的呀,线程安全你还问什么,手动狗头!关键是要要分析出面试官问这个问题是为了考察你什么知识点,面试官是想知道你对Java内存模型熟不熟悉。Java内存模型ava的并发采用的是共享内存模型,在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐形通信。这句话是摘自《Java并发编程的艺术》。下面我来一张图来讲下我自己

2020-11-23 22:11:10 78

原创 线程池的核心参数及工作原理

JDK中线程池的类是ThreadPoolExecutor,如果不借助Executors.newFixedThreadPool(3)等方式创建,可以用构建函数来创建线程池,它的代码是这样的,public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable

2020-11-22 21:39:56 1332

原创 Jpeg图片上传压缩的过程中报Unsupported Image Type解决办法

项目中发现上传jpeg图片上传不成功,从日志里看到是压缩的时候报Unsupported Image Type,百度了一番后结合实际操作得到的是Ps软件保存jpeg图片时,默认的保存格式是cmyk(印刷品模式)格式的,而不是rgb格式。解决方案:使用TwelveMonkeys就可以解决了。TwelveMonkeys的使用比较简单,只要把相关的jar包加入到类路径,他的类我们基本不会用到,只要使用jdk ImageIO或其上层的接口就行了。jdk的ImageIO有自动发现功能,会自动查找相关的编解码类并使

2020-10-15 18:10:19 813

原创 包启动报Failed to start bean 'documentationPluginsBootstrapper'

记录一次项目中出现的问题,包启动时报这个Failed to start bean 'documentationPluginsBootstrapper'; nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.StackOverflowError看着吓了一跳咋还StackOverflowE...

2019-10-28 14:21:12 40797 4

原创 redis哨兵(sentinel)搭建以及springboot实战

哨兵是建立在redis主从集群的基础上的,所以本文是承接上一篇redis主从复制的。一主二从三哨兵,哨兵也是部在主从节点上的,端口为26379主从节点masternode01 192.168.71.101 6379slave1node02 192.168.71.102 6379slave2node03 192.168.71.103 6379哨兵节点sentinel1192.1...

2019-06-25 09:07:56 942

原创 redis主从复制搭建

环境背景centos 6.5redis 4.0.14注意:redis不同版本,配置文件里面命令不一样节点信息masternode01 192.168.71.101 6379slave1node02 192.168.71.102 6379slave2node03 192.168.71.103 6379安装redis我是把redis安装在opt目录,安装过程很简单,分下载解...

2019-06-18 18:28:26 216

原创 设置grep匹配字符高亮显示

先看下我的例子,我想看下带有redis字符进程的,命令和结果如下[root@node03 src]# ps -ef|grep redisroot 2365 1 0 08:01 ? 00:00:01 src/redis-server 127.0.0.1:6379root 2388 1625 0 08:23 pts/0 00:00:0...

2019-06-15 14:27:17 1084 1

原创 克隆linux虚拟机并修改网络配置

本文的前提条件是已经在VMware里创建过虚拟机,并且有了虚拟机快照了,想要克隆快照迅速创建新的节点。克隆首先进去克隆界面一直点击下一步直到这个窗口第一个是你虚拟机节点的名称,第二个是你要安装的路径,点击完成后,开启新创建的虚拟机,用之前快照的账号密码登录后,接下来就是需要修改网络配置了修改网络配置进去network-scripts目录,打开ifcfg-eth0,修改ip,具体命令...

2019-06-06 17:54:38 1404

原创 通讯录获取首字母,并以首字母归类返回

需求背景最近在做的一个项目里,有需要展示我的通讯录功能,与前端沟通结果是我将通讯录里所有联系人全部在接口里返给他们,当然返回的数据格式是按照首字母已经归类好了的,整体返回对象是一个Map<String,List>,key值就是首字母firstChar,value是所有首字母的集合list具体实战pinyinUtil在录入通讯录的时候, 根据录入的中文服务端在入库的时候取到中文对...

2019-06-06 14:05:43 1281

原创 包启动报BeanCurrentlyInCreationException解决方案

今天项目出现了一个问题,maven打包的时候没有问题,启动的时候就报了org.springframework.beans.factory.BeanCurrentlyInCreationException这是Spring容器创建bean的时候,出现循环引用的时候报的异常。什么是循环引用循环引用,简单的说就是,A依赖B,B依赖C,C又依赖A,这样形成了一个闭环。解决办法按照报错提示在引用...

2019-03-12 10:12:21 22017 1

转载 Nginx极简教程

概述什么是nginx?Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。什么是反向代理?反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表...

2019-03-05 09:47:49 252

原创 使用RateLimiter结合Spring Aop实现接口动态限流

为什么要限流在电商中经常有秒杀的场景,就是在某一瞬间会有高并发的产生。每一个API接口都有自己的访问上限,当接口的访问频率超过其承受范围时,为防止雪崩效应可以采用限流的方式给接口安上保险丝,保证接口的可用性。具体样例我这里先自定义作用于方法上的限流注解,然后用aop切面去拦截包含有自定义限流注解的接口,再结合谷歌开源工具包com.google.concurrent.RateLimiter类(...

2019-02-21 15:46:30 2368

原创 JavaSE基础篇

网上关于Java面试的资料非常丰富,这里收录一些常用面试题目和知识点,以便金三银四或者金九银十的时候复习用,限于水平有限做的不对的地方欢迎指出。Java面向对象1、说说面向对象的几大特性和你的理解继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变...

2019-02-13 14:55:11 150

转载 java仿照微信聊天记录时间格式显示

前言业务需求:需要根据时间戳或者日期,将时间显示的像QQ/微信聊天那样的格式。 具体效果请自行查看QQ/微信。 此处给出实现的时间工具类代码如下import java.text.SimpleDateFormat;import java.util.Date;public class TimeUtil { /** * 日期格式化 * ...

2018-08-14 09:49:57 4872

原创 委派模式

委派模式特点1、两个参与角色:委托人和被委托人 这个很好理解2、委托人和被委托人在权力上完全平等 就是实现同一个接口3、委托人持有被委托人的引用 这个也很好理解,因为需要用到被委托人的方法4、不关心过程,只关心结果 这个就是说在用到被委托人的具体方法前后不增加逻辑,完全由被委托人去干一句话概括干活是你的(普通员),功劳...

2018-08-06 12:06:51 244

原创 代理模式

jdk动态代理写在前面本文主要分析jdk的动态代理,以及一个实现案例。jdk动态代理的被代理类必须要实现某个或某些接口,因为Proxy.newProxyInstance这个方法的入参强制要求的。 代理模式有几个要求就是要求代理类、被代理类以及被代理实现的接口。其中代理类持有一个被代理类实现的接口的一个引用。下面看具体案例被代理类实现的接口接口很简单,具有一个获取姓名和一个找工作的...

2018-07-22 18:11:26 195

原创 lombok超好用的几个注解

写在前面在实际开发中,我们的javaBean需要写getter和setter方法,这个过程是无趣的。用lombok插件后只需要用一个注解就省去这些操作,使得代码看起来更加优雅。具体步骤IDEA安装插件点 preferences plugins,搜索lombok安装,我的是因为已经安装了。 pom引入jar包&lt;dependency&gt; &lt;gr...

2018-05-03 20:47:58 1337

原创 用拦截器和自定义注解实现token校验

前言在应用开发中,客户端访问服务端的接口时,服务端需要进行身份token校验拦截掉无效或失效的token请求。解决这一需求的思路,一般是在类似登录或者激活的接口里给客户端返回一个用于识别身份的唯一标识(这里就叫做authToken吧),后面客户端访问服务端请求,需要带上这个唯一标识。比如会员登录,如果在没有redis的情况下,一般就建一张表根据会员ID给每个会员生成一个唯一token,然后每...

2018-04-27 18:54:50 7703

原创 java根据mysql数据库表简单生成增删改查

写作背景换了家公司后,公司里没有公共的代码生成工具。每次来个新需求,从建表到实体Bean、dao、service等等这样一直做重复的工作会比较烦躁又很费时间。于是自己想写一个玩玩,这里说明一下,公司技术选型为springboot + jdbc templates没有使用到像mybatis等orm框架,所以不需要生成mapper.xml文件。代码实例package com.che...

2018-03-20 14:18:47 1532 6

原创 用Spring Aop方式拦截自定义注解的实现

本文介绍一下,用aop的方式实现对自定义注解的使用,所用框架是SpringBoot引入maven依赖 &lt;!-- 引入aop支持 --&gt;&lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-a...

2018-02-28 14:09:13 8536

apache-tomcat-8.5.64-src.zip

Tomcat8编译后的源码,可以直接Import到开发工具里。

2021-03-29

Spring5全部源码

想对Spring源码一探究竟的同学可以直接下来阅读,不用去github下,本人也是在阅读Spring源码的时候下载下来的。

2020-11-26

空空如也

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

TA关注的人

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