- 博客(50)
- 资源 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 一文搞懂AOP调用原理
一. 前言AOP是spring框架的两大核心之一,在日常工作中也会经常会到它,典型的应用用来记录日志,包括spring的注解事务也是通过AOP实现的。大家是否都对AOP原理都很清楚呢?AOP底层到底是如何实现的?AOP在什么场景下会失效?二. AOP失效例子带着这些疑问,我们从一个AOP失效的例子开始揭开AOP的面纱。定义一个切点@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic
2021-10-14 16:18:58
419
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 mysql的binlog定位分析问题
一. 问题我们开发中有时候会遇到这样的问题,mysql某个表字段代码上应该被修改,但数据库里却还是原来的值,如果代码里没有很详细的日志记录,这时候我们很难确定是真的没有被修改,还是被修改了,又被其他操作修改成原来的值。二. BinlogBinlog是mysql用来记录数据变化的日志。通过binlog我们可以恢复数据,也可以跟踪数据的修改记录。Binlog有三种模式:Statement Level模式: 每一条修改数据的sql记录到binlog中日志量少,但遇到sql中使用now()等sql函数,
2021-10-12 15:17:51
503
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 jenkins 安装配置实战
提前准备:安装jdk, maven, git一. 安装# wget命令从jenkins官网下载yum源sudo wget -O /etc/yum.repos.d/jenkins.repo \ https://pkg.jenkins.io/redhat-stable/jenkins.repo# 导入jenkins安装过程中需要的keysudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key# 导入jenkins安装过
2021-09-24 14:13:42
125
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 滑动时间窗口实现简单接口限流
本文目的在学习阿里开源框架sentinel后,为加深对滑动时间窗口的理解,故自己实现简单接口限流。SentinelSentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。Sentinel的一切功能都是以流量统计为基础。基于滑动时间窗口实现秒级的流量统计。滑动时间窗口Sentinel以1秒为时间宽度,将1秒平均分隔成指定数量的时间窗口,任意的时间对应唯一的一个时间窗口,每个时间
2021-03-03 20:28:09
855
8
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 ThreadLocal原理学习
什么是ThreadLocalThreadLocal是一种数据类型,类似HashMap的key : value存储。主要用来存储线程独有的变量,各线程间互不干扰。通过get、set方法存入读取数据,操作简单。ThreadLocal、ThreadLocalMap、ThreadThreadLocal担任get、set、remove等操作方法。ThreadLocalMap是底层数据结构,存储数据,使用动态数组Entry[]实现,它是ThreadLocal的一个内部类。Thread维护了一个类变量Thre
2020-11-30 14:19:47
474
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 JMM多线程内存模型笔记
内存模型概念解释JMM:多线程操作下的一系列规范约束,同时屏蔽了不同硬件和操作系统内存的访问差异主内存:即JVM堆内存工作内存:cpu的寄存器和高速缓存的抽象描述。缓存一致性协议:主内存与工作内存数据交互的一系列协议,read、load、assign、use、store、write、lock、unlock。lock和unlock,直接对应着synchronized关键字的monitorenter和monitorexit字节码指令。原子性:表示某个操作或某些操作是原子的,不可分隔的。可见性:变
2020-11-27 17:23:28
158
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 MAVEN 私有仓库搭建与配置
一. nexus 下载安装1. 下载官网地址:https://www.sonatype.com/nexus/repository-oss由于XXX原因,官网地址可能无法下载百度网盘:https://pan.baidu.com/s/16pYBz6qOg3sgG3cJd7HYsg 提取码:ogjf2. 安装(linux)安装包上传到 /usr/local 目录(也可以安装到其他目录)解压缩包 :tar -zxvf nexus-3.19.1-01-unix.tar.gz进入 ./b
2020-09-28 16:45:27
15565
3
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 深入探究JDK的SPI机制
概念:SPI的全称service provider interface。是JDK内置的一种服务提供机制。一种典型的面向接口编程。JDK定义了一些接口规范,由服务提供者自定义扩展实现接口。下面以JDBC为案例一探SPI机制的具体实现原理,直接上代码:import java.sql.*;public class JdkSpiMain { public static void main(String[] args) { Connection conn = null;
2020-07-30 21:03:29
373
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 javacv使用笔记
javacv使用笔记一.前言最近在做一个视频审核的功能,但是运营觉得每个视频都要看一篇太浪费时间了,于是提出了这样一个需求,给每个视频随机截取5张图片展示出来,根据这5张图片决定是否需要继续观看视频内容,以提高审核效率。既然运营提出了这样的需求,就得尽力去完成。二.准备首先从感性的角度分析该需求肯定可以实现的,毕竟软件开发技术已经是相当成熟了。只是暂时不知道什么技术可以实现该功...
2017-01-22 11:12:59
25568
12
原创 Spring Boot集成RocketMQ之消息对象序列化
当我们在Spring Boot项目中集成RocketMQ后,只需要在配置文件(application.yml)中添加rocketmq的相关配置,即可使用rocketMQTemplate发送对象消息。登录RocketMq Dashborad查看消息会发现我们的对象消息被序列化成json串。那它是使用哪种json序列化工具的呢?Spring Boot在装配RocketMQTemplate时为我们提供了四种消息对象转换类,当发送消息时依次有序的使用四种消息转换类对消息进行序列化,直到找到一个合适的消息转换类。
2023-12-21 13:55:47
2262
原创 nginx 因POST请求体过大导致500错误问题排查记录
一. 问题今天同事遇到一个问题同一个保存接口操作,第一个可以保存成功(请求体很小),第二个提示“500 Internal Server Error”(请求体比较大)。二. 初步排查刚开始以为是接口本身的问题,如是去接口所在服务器查看日志,但惊奇的是接口请求时服务日志没有任何日志输出。如是猜测可能是统一网关(gateway)的问题,遂打开统一网关的日志(记录了所有接口请求日志,接口路径,入参,出参),出乎意料的是统一网关也没有任何日志输出。继续往上层定位,查看nginx的error.log和ac
2022-03-02 16:28:08
5591
原创 使用ItextPdf给PDF文件加文字水印和图片水印
一. pom添加itextpdf依赖<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.12</version></dependency><!-- 中文水印的字体支持 --><dependency> <group
2022-02-17 14:09:45
2976
5
原创 Prometheus结合granfana监控服务器和Mysql
一. Prometheus介绍 Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目,并且有公司来运作。Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。 Prometheus基本原理是
2022-02-14 17:01:59
1020
原创 spring 实现异步非阻塞长轮询
一. 前言今天接到一个扫码登录的需求。想一想很简单,服务端提供一个获取二维码接口,在提供一个查询扫码状态的接口,客户端不停轮询"查询扫码状态接口"判断用户是否已扫码登录,并很快实现。本想开发完成后又可以愉快的摸鱼了,但仔细想想又觉得差点意思。客户端如何频繁的去轮询服务端接口势必会大量浪费tomcat的线程,造成服务端的压力。其实大部分的轮询请求都是无意义的,那是否可以考虑服务端将轮询请求挂起,释放tomcat线程,当有结果时在将响应返回给客户端?于是通过查阅文档发现Spring已经提供了实现方法Call
2021-11-23 10:21:08
1392
2
原创 Security Oauth2 增加新的认证方式
一. 前言公司统一认证使用Security Oauth2框架搭建,最近接到一个需求,需要增加一种短信验证码的认证方式。Security Oauth2默认只支持四种认证方式,并不支持短信验证码的验证方式,故需要扩展一种新的认证方式。扩展的前提是需要对框架本身有一定的认识,所以花时间学习了一下Security Oauth2的认证原理。二. 四种默认认证方式授权码模式授权码模式(authorization code)是功能最完整、流程最严密的授权模式,code保证了token的安全性,即使code被
2021-11-20 16:14:19
968
原创 巧用mysql位运算解决多选值存储问题
一.问题场景工作中经常遇到多选值存储问题,例如:用户有多种认证方式,密码认证、短信认证、扫码认证等,一个用户可能只开启了其中某几种认证方式。二. 场景分析比较容易理解的两种实现方式,多字段存储、单个字段拼接存储。1.多字段存储每种认证方式用一个字段存储,0表示未开启,1表示已开启。缺点:每增加一种认证方式都需要添加一个表字段,扩展性差。2.单字段拼接单字段存储,已开启的认证方式用逗号(或其他分割符)拼接。例如:开始了密码认证和短信认证,则存储为:密码认证,短信认证。缺点:不利
2021-11-17 14:43:33
2394
原创 终于把Spring三级缓存彻底看明白了
一. 前言从简单到复杂应用开发中,难免会遇到spring bean循环依赖问题,即Bean A依赖Bean B, 同时Bean B依赖Bean A。Spring大神提出了三级缓存帮助我们解决循环依赖的问题。二. 概念说明singletonFactories :一级缓存,存放类工厂(ObjectFactory),实例Bean通过ObjectFactory创建。earlySingletonObjects :二级缓存,存放创建不完全的Bean实例。singletonObjects :三级缓存,存放
2021-10-29 18:15:18
2896
2
原创 实例分析堆内存与直接内存
一. 前言堆内存:jvm内存中最重要的使用最多的一块内存。直接内存:jvm以外的,机器内存。jdk1.8开始,舍弃原有的方法区,引入新的元空间。元空间存储的内容并无大的改变。元空间从jvm的内存模型中移出,使用直接内存。那为什么元空间使用直接内存?如果直接内存具有较好的优势,那为什么还要保留jvm内存?二. 实例import java.nio.ByteBuffer;public class HeapAndDirectMemoryTest { public static void
2021-10-25 12:34:19
614
原创 redis 缓存雪崩、穿透、击穿
一.概述Redis 是开发中经常用到的非关系型数据库,redis被使用最多的就是用来缓存数据,也可以直接当数据库使用。被用来做缓存时,有三个比较典型的问题:雪崩、穿透、击穿。二.说明雪崩:大量的key在同一时间过期,导致大量请求到达数据库。穿透:大量的不存在key在短时间内访问,导致大量请求到达数据库。击穿:热键key过期时,大量请求并发,导致大量请求到达数据库。三.解决方案1.雪崩避免key的过期时间相同,不同的key设置不同的过期时间。2.穿透方案一:访问的key如果
2021-10-22 14:41:00
197
原创 Java线程池学习总结
自定义线程池ThreadPoolExecutor是jdk给我们提供的可以快速开启管理一个线程池的方法。它的构造方法中提供了多个可配置参数,开发者可根据需求自定义参数。public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeU
2020-11-30 15:55:30
153
原创 maven archetype学习笔记
一. archetype是什么archetype是一个maven项目模板工具包。一个Archetype定义了要做的相同类型事情的初始样式或模型。这个名称给我们提供来了一个一致的生成Maven工程的方式。Archetype会帮助作者给用户创建Maven工程模板,并给用户提供生成相关工程模板版本的参数化方法。二. archetype用途管理公司项目骨架。当公司系统发展到一定规模后势必会有一些基础依赖、项目配置、项目架构规范,新建一个项目时就需要初始化很多东西,手动完成这些初始化工作费时费力还很.
2020-10-09 14:01:27
301
原创 Springboot源码解析之Environment
前言:springboot近些年已经逐渐成为新项目的必备框架。Springboot可以只使用几行代码就可以帮我们搭建一个可运行的项目框架。Springboot的自定义配置也是非常简单,只需要遵循规范在application.yml或application.properties中添加配置,就可以在代码中使用@Value获取到配置。那么springboot就的合适加载的自定义配置?自定义配置又是存储在哪里的呢?Springboot的启动类很简单,一行代码就搞定。@SpringBootApplicati
2020-08-09 16:13:55
466
原创 基于Socket实现简单RPC框架
废话不多说,直接上代码:1. RpcServer:rpc服务端,用于启动Socket监听端口import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.Map;import java.util.co...
2018-10-16 15:14:47
1305
原创 JVM垃圾收集算法笔记
商用HotSpot虚拟机将堆内存分为年轻代和老年代。年轻代又可细分为Eden区和From survivor区和To survivor区。Eden和survivor默认使用8:1比例。 常用收集算法: 1. 标记--清除算法:分为“标记”、“清除”两个阶段。先标记所有需要回收的对象,标记完成后统一清除被标记的对象。标记、清除两个阶段的效率都不高,且会产生...
2018-09-24 15:20:34
186
原创 初探spring boot Enable能力
spring boot 由于其超强的整合能力和强大的社区生态,已经渐渐成为java项目开发必备框架。 使用过springboot的同学们应该都很清楚,很多第三方组件与springboot集成时只需要添加一个@EnableXXX注解,就可以在项目中使用。下面使用springboot的Enable来实现一个记录方法调用次数的例子。 第一步. 定义Enabl...
2018-09-23 15:00:02
440
原创 面试笔记
今天去某D轮互联网公司面试,被面试官问到一个和算法有关的问题:从一亿长度的整形数组中取出最大的六个数。当时第一印象是使用排序算法,然后取最大六个。明显面试官不满意,我也知道肯定不是这么简单的问题,但当时脑袋空白想不到什么高效的方法。在回去的路上开始思考这个问题,真正静下来后感觉问题变简单了,很快想到了一个思路。 问题的关键点在于只需要取最大的六个,于是这样一个思路就出来了。...
2018-08-20 22:22:59
261
原创 自定义线程池工具类
import java.util.concurrent.*;/** * 线程池工具类: * 处理项目中需要异步处理的任务,例如日志服务,监控服务等 * @author zsc * @datetime 2017年11月22日 上午11:04:09 */public class ThreadPoolUtil { /** 工具类,构造方法私有化 */ private Thre...
2018-04-18 16:36:09
1604
原创 一个简单的内存缓存管理器,可设置过期时间
目前主流的大项目都使用ehcache,redis等第三方缓存做分布式缓存管理。然而中小项目一般并没有很多的数据需要使用缓存,如果引用第三方缓存不仅增加开发难度,也使项目更加复杂,维护起来更麻烦。例如,一个项目只需要做验证码错误次数的验证,这时使用内存缓存不仅简单而且高效,后期维护容易。import java.util.Calendar;import java.util.Map;import j...
2018-02-09 10:56:28
5003
原创 poi导出excel工具类
poi版本 org.apache.poi poi 3.17 org.apache.poi poi-ooxml 3.17 /** * Excel导出工具类 * @author zsc * @datetime 2017年12月14日 下午8:01:32 */public class Exce
2017-12-18 19:08:44
935
原创 logback使用日志工具类静态方法打印日志
最近开发时突然感觉每次需要打印日志信息时都要在当前类中定义一个Logger对象特别的麻烦,所以就在想能不能使用一个日志工具类里面定义一些打印日志的静态方法,这样在需要打印日志时直接使用工具类的静态方法。 有了这个想法后就开始尝试,其实这个需求很简单,看下面例子:public class LoggerUtil { private final static
2017-12-12 11:40:46
9894
原创 使用ControllerAdvice获取controller接口@ResponseBody返回值
前言:接口类项目开发时,为了便于后期查找问题,一般会拦截器或过滤器中记录每个接口请求的参数与响应值记录,请求参数很容易从request中获取,但controller的返回值无法从response中获取,有一个简单的方法,在controller接口的最后将返回值保存到request域中,这种方法虽然简单,但是开发起来太麻烦,需要在每个controller的最后添加一行代码,且该功能不属于业务
2017-12-11 17:28:38
9161
原创 CyclicBarrier和CountDownLatch的区别
1. 字面意思CyclicBarrier : 循环的屏障CountDownLatch : 向下计数锁2. 用途CyclicBarrier : 让指定的线程等待,直到所有线程达到同一执行点全部继续执行CountDownLatch : 让线程等待,直到CountDownLatch计数到0,继续执行该线程。3. 主要方法:CyclicBarrier :
2017-12-08 13:34:23
268
原创 Lock与synchronized的区别
Lock的公平锁与非公平锁:公平锁(FairSync):直接将获取锁的操作放到等待队列中,谁先抢到锁谁先执行。非公平锁(NoFairSync): 先获取锁,获取到则执行,未获取到则放入等待队列。因为从线程进入了RUNNABLE状态,可以执行开始,到实际线程执行是要比较久的时间的。而且,在一个锁释放之后,其他的线程会需要重新来获取锁。其中经历了持有锁的线程释放锁,
2017-11-13 15:30:40
202
原创 java中Thread类的join方法
单核cpu运行多线程时底层实现原理是多个线程间切换,由于cpu的处理速度很快,看上去像多个线程同时运行。那么我们如何实现让线程T1,T2,T3,在T1执行完成后才执行T2,T2执行完成后才执行T3,也就是线程的串行化,通过Thread类的join方法就可以实现。join方法:将该线程加入当前线程,当前线程等待加入线程执行完成才继续执行。例子:public class Threa
2017-11-13 13:21:03
5383
原创 VMware安装centos7后无法上网解决方案
我使用VMware虚拟机安装Ubuntu和CentOS,都使用NAT模式连接网络,但是Ubutun可以正常上网,而CentOS不能连接到网络。原来Centos7默认是不启用有线网卡的,需要手动开启。操作步骤如下:首先,打开终端。cd /etc/sysconfig/network-scripts/ls 查看一下ifcfg-eno后面对应的数字是什么,以eno3
2017-10-23 17:01:14
1086
2
原创 学习深入理解java虚拟机笔记--对象已死吗
在堆里面存放着java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经"死去"(即不可能再被任何途径使用的对象)。 1. 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。
2017-10-15 09:19:27
205
原创 SPRING MVC工作原理
Spring MVC简介Spring MVC是一个开源的web开发框架, Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。它以零配置,性能优,开发效率高和与spring无逢集成等优点被广大java开发者所喜爱。Spring MVC和struts2是目前最流行的MVC开发框架。 Spring MVC工作原理Spring
2017-10-10 14:01:11
552
原创 tomcat8配置apr模式
因为apr模式本质是使用JNI技术调用操作系统IO接口,它的并发效率比nio高配置前说明:tomcat版本是apache-tomcat-8.0.36,系统centos7 1. 安装依赖库yum install apr-develYum install openssl-develyum install gccyum install make注意:o
2017-10-10 10:42:12
3248
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人