自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

学习

越努力,越幸运

  • 博客(102)
  • 资源 (3)
  • 收藏
  • 关注

原创 线程池解析

线程池解析java线程对应内核线程,创建与销毁需要切换到内核态,是系统开销较大的操作,因此需要设法复用线程。线程池就是一个线程缓存,负责对线程统一分配,调优与监控,线程池的优势:提高性能:重用线程减少线程创建消亡的开销提高响应速度:任务到达时可以立即执行,不需要再去创建线程方便管理线程:便于统一分配、调控和监控执行Runnable任务流程简单说处理任务的优先级为:核心线程、任务队列、最大线程,如果三者都满了,使用handler处理被拒绝的任务。具体如何实现的呢?/*** 在将来某个时间执

2021-08-05 12:54:38 1050

原创 spring-boot-maven-plugin插件找不到含有main的主类

【背景】spring-boot项目执行mvn clean package打包时遇到一个问题,报错如下:[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.3.4.RELEASE:repackage (default) on project behavior-data: Execution default of goal org.springframework.boot:spring-boot

2020-10-21 18:03:05 5970

原创 重要的基础注解@import

@import的作用很简单,就是导入一个或多个bean,通常用于配置类。导入@Configuration修饰的配置bean导入ImportBeanDefinitionRegistrar的实现类导入ImportSelector的实现类可以导入一个普通的java对象,spring4.2版本之后才支持使用举例@Datapublic class A { private String name = "a";}@Datapublic class Boy { pr

2020-10-19 20:23:48 1212

原创 java探针之修改类字节码文件

java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能。像skywalking和arthas都使用到了这个技术。具体原理为:jdk1.5以后引入了javaAgent技术,javaAgent是运行方法之前的拦截器。我们利用javaAgent和ASM字节码技术,在JVM加载class二进制文件的时候,利用ASM动态的修改加载的class文件,在监控的方法前后添加计时器功能,用于计算监控方法耗时,同时将方法耗时及内部调用情况放入处理器,处理器利用栈先进后出的特点对方法调用先

2020-10-11 11:10:19 2240

原创 Java探针之JavaAgent揭秘

java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能。javaAgentJavaAgent 是JDK 1.5 以后引入的,也可以叫做Java代理。JavaAgent 是运行在 main方法之前的拦截器,它内定的方法名叫 premain ,在JVM启动的时候,会从agent包中找到MAINIFEST.MF中配置的Class,执行其实现的premain方法,而且这一步是在main方法之前执行的。这样就可以在JVM启动执行main方法之前做一些其他而外的操作了。agen

2020-10-11 11:03:57 1214 1

原创 Spring容器实例bean中的几个关键PostProcessor

本文从几个spring提供的关键的PostProcessor处理器,来帮助理解spring创建bean的过程:下面是按方法执行的前后顺序排列BeanFactoryPostProcessor.postProcessBeanFactory()用来在所有的bean definitions加载后,但是还没有实例化bean之前调用本方法,所以本方法非常超前执行可以修改bean的定义,如是否是单例,是否lazy init,DependsOn,FactoryBeanName等等等等,一般用来修改属性值,一个典型

2020-10-09 21:12:57 315

转载 Fork/Join框架

一、引言算法领域有一种基本思想叫做“分治”,所谓“分治”就是将一个难以直接解决的大问题,分割成一些规模较小的子问题,以便各个击破,分而治之。比如:对于一个规模为N的问题,若该问题可以容易地解决,则直接解决;否则将其分解为K个规模较小的子问题,这些子问题互相独立且与原问题性质相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解,这种算法设计策略叫做分治法。许多基础算法都运用了“分治”的思想,比如二分查找、快速排序等等。基于“分治”的思想,J.U.C在JDK1.7时引入了一套Fork/Join

2020-09-17 19:07:36 309

原创 建造者模式

建造者模式是将对象的构建封装起来,对象本身和创建解耦,方便调用者创建复杂的对象,无需知道构建的细节。常见的使用场景就是一些复杂的连接对象,有非常多的配置,用户不可能清楚每一个属性,所以一般会通过建造者模式来提供属性的设置和对象的创建,方便调用者使用下面根据nacos源码里的一个例子说明建造者模式@Datapublic class RestResult<T> implements Serializable { private static final long serialVers

2020-09-10 16:25:37 276

原创 nginx实现http服务配置

静态代理即实现nginx代理指向静态文件,实现动静分离主要配置如下:worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; server { listen 8081; server_name localhost;

2020-08-29 11:13:18 5380

原创 spring-security-oauth2实现OAuth2.0服务

关于OAuth的介绍查看我的另一篇文章OAuth的4种授权方式,spring-security-oauth2是实现OAuth2.0的框架,配置稍微有些繁琐,因此本文记录下大概的思路,加深印象。OAuth 2.0中主要有Authorization Service授权服务和Resource Service资源服务,他们可以在同一个应用程序中,也可以在两个应用程序中,甚至多个资源服务共享一个授权服务。spring-security提供了相应的endpoints来管理token的请求,/oauth/author

2020-08-09 21:03:22 703

原创 自动化测试注册接口,如何生成大量临时邮箱和获取邮箱验证码

自动化测试服务接口,其中注册接口需要使用邮箱来注册,并填入邮箱验证码,这应该如何实现from pytest import markimport loggingfrom retrying import retryimport requests, re, jsonfrom lxml import etreeemail_address_url = 'http://24mail.chacuo.net/'class TestRegister: def setup_method(self,

2020-08-06 12:57:51 5572

原创 OAuth2.0的四种授权方式

互联网应用中,OAuth 是一种授权机制。数据的所有者Owner告诉系统,同意授权第三方应用Client进入系统获取这些数据。系统产生一个短期的进入令牌token,用来代替密码,供第三方应用使用。令牌相较与密码,有这些优势,1.令牌是短期的,到期会自动失效 2.令牌可以被数据所有者撤销,会立即失效 3.令牌有权限范围(scope)。关于OAuth可以关注 阮一峰讲OAuth和江南一点雨讲解OAuthOAuth非常好的一点就是考虑了实际应用中的复杂场景,总结了四种授权方式(authorization gr

2020-07-26 20:05:00 2089

原创 主要垃圾回收器和垃圾回收算法

垃圾回收算法:标记清除算法 mark-sweep复制算法 copying 主要用于年轻代的垃圾回收,分为Eden区和两个survivor区标记整理算法 mark-compact compact紧凑使压实的意思,即标记后不是清除而是将仍存活的对象移向内存的一端,清理掉端界外的垃圾对象,主要用于老年代的垃圾回收分代收集算法:是现在大多JVM采用的方法,即根据对象生存周期的不同把堆分为年轻代和年老代,采用不同的垃圾回收算法分区收集算法:G1引入的回收算法,将整个堆空间划分为连续的小区间,每个小区间独

2020-07-18 10:41:57 260

原创 redis 小功能大用处

慢查询分析redis提供了慢查询日志功能,会计算每条命令的执行时间,超过阈值后记录下来,注意计算的是命令的执行时间,不包含网络传输和排队时间。config get slowlog-log-slower-than获取操作超时的阈值,我的版本默认是10 000微秒,即10毫秒config get slowlog-max-len 获取慢查询日志最多存储条数,默认128条,超过会循环覆盖通过slowlog get n来获取慢查询日志,返回日志id,时间戳,命令耗时,命令详情,可以定时存储到持久化数据库制作可

2020-07-04 18:55:58 230 1

原创 JWT-基于token的认证方式

什么是JWTJson web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。起源认证是用来判断用户身份。为了避免每次都要重新认证,可以在认证成功后创建会话,

2020-06-20 10:39:48 775 1

原创 spring-security认证授权

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。授权码模式(authorization code)简化模式(implicit)密码模式(resource owner password credentials)客户端模式(client credentials)阮一峰讲OAuth 2.0spring-security-oauth2实现了oauth的框架,后来迁移到了spring-security5.X

2020-06-19 19:46:07 254

原创 工作中必须要知道的git高级用法

rebase,直接翻译过来就是变基,而这个命令就是这么人如其名。通过rebase命令,我们可以改变一串commits的基点(父commit)。首先我们先来操作一遍这个命令,看看效果就知道这个命令是干啥的了。假设我们的git结构是这样子的。我们在commit3这个地方开出了一个分支branch1,然后在branch1分支上开发并提交了两个commit(6和7)。同时其他分支合并到master分支导致master分支多了两个提交(4和5)。这时我们执行以下命令: (注: 此时的活动分支是branch1)(

2020-06-15 20:44:49 1533

原创 docker基础知识

Docker 是一个能够把开发应用程序自动部署到容器的开源引擎。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术,它提供了一个简单、轻量的建模方式,使开发生命周期更高效快速,鼓励了面向服务的架构设计。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。:Docker 容器本质上是宿主机上的一个进程。Docker 通

2020-05-23 11:52:39 375

原创 emqx—mqtt消息服务器

EMQ X 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器,重点是专业支持MQTT协议,(MQTT 是轻量的 (Lightweight)、发布订阅模式 (PubSub) 的物联网消息协议),在物联网领域非常适合,类似的产品还有vernemq,HiveMQ等。EMQ X 支持承载海量物联网终端的MQTT连接,支持在海量物联网设备间低延时消息路由:稳定承载大规模的 MQTT 客户端连接,单服务器节点支持50万到100万连接。分布式节点集群,快速低延时的消息路由,单集群支持10

2020-05-16 11:58:46 3436

原创 五大数据存储模型

今天和同事聊起列式存储ClickHouse数据库,原来存储模型的家族这么大。关系型数据库(行式数据库)就是传统的数据库,如mySql,Oracle, postgresql。相比较与列式存储,最明显的特点就是把一行中的数据值串在一起存储起来,然后再存储下一行的数据。列式存储 Sybase IQ, ClickHouse,Hbase列式存储是相对于传统的行式存储来说的,最大区别就是数据时是按照...

2020-04-29 15:08:06 3937

原创 最新版elasticsearch的安装踩坑

elasticearch是目前最流行的实时的分布式搜索和分析引擎,水平扩展能力非常强,提供restful接口简化使用难度。文档学习一个技术最好的方式就是阅读官方文档,elasticsearch权威指南中文翻译,这是我找到的最好一个在线版本。工欲善其事必先利其器,下面介绍安装过程中遇到的坑:下载可以到elasticsearch中文社区下载,但是速度很慢。这里是国内镜像地址,速度还可以,...

2020-04-25 14:42:32 363

原创 linux下安装jdk

1. 手动解压安装包如在home目录,去oracle官网https://www.oracle.com/java/technologies/javase-jdk8-downloads.html下载jdk包手动上传,或者直接wget http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6...

2020-04-19 12:19:04 199

原创 AQS简单学习

抽象队列同步器 AbstractQueuedSynchronizer,是一个用于构建锁、同步器、协作的工具类或者框架。AQS的源码还是比较复杂的,所以应该先理解其作用,场景,再去理解他的结构,原理。为什么要有AQS?我们学过的ReentrantLock和semaphore都有共同点,类似个闸门,只允许一定数量的线程通过。还都是同步的,底层都是AQS.他们的原理里都有个继承AQS的内部类A...

2020-03-29 17:13:01 297

原创 CAS单点登录

背景随着系统业务量的不断增长,单个系统的代码量越来越庞大,内部耦合越来越强,后期维护及扩展相当困难;一般在这种情况下,我们都会采取对系统进行拆分,形成多个子系统,分开部署;由于系统的拆分,我们又需要解决单点登录的问题。CAS单点登录介绍单点登录,指的是在多个应用系统中,用户只需要进行一次登录,就可以认证访问所有组件系统。单点登录有很多种实现方案,本案例总结主要关注Apereo的CAS实现...

2020-03-25 22:24:39 672

原创 Linux下查看文件内容

Linux下查看文件内容的命令1.cat 与 tac、nlcat的功能是将文件从第一行开始连续的将内容输出在屏幕上。但是当文件过大行数比较多时,屏幕无法全部容下时,只能看到一部分内容。cat语法:cat [-n] 文件名 (-n : 显示时,连行号一起输出)nl其实就等同于cat -n ,输出文件内容时显示行号tac实际上是cat反过来写,功能是将文件从最后一...

2020-03-25 10:43:34 367

原创 来说一说你对锁都怎么分类?

锁是用来控制对共享资源的访问,java中除了synchronize,提供了lock这个大家族。他们有各自不同的适用场景,lock提供了更丰富的功能。lock的基本使用直接来看Lock接口的定义,看看比synchronized多了哪些功能?public interface Lock { // 加锁 void lock(); // 非阻塞获取锁 boolea...

2020-03-23 23:09:51 221

转载 Mysql默认隔离级别为什么是可重复读?

知识点总结1.数据库默认隔离级别: mysql —repeatable,oracle,sql server —read commited2.mysql binlog的格式三种:statement,row,mixed3.为什么mysql用的是repeatable而不是read committed:在 5.0之前只有statement一种格式,而主从复制存在了大量的不一致,故选用repeata...

2020-03-23 10:31:38 7574 4

原创 ThreadLocal

使用场景:用来解决线程安全问题,如每个线程都有自己的SimpleDateFormat;还可以用来存储每个线程特有的内容,如用户信息,日志记录的traceID,省去传参的麻烦。原理如图:每个线程都有一个属性ThreadLocal.ThreadLocalMap threadLocals = null;明显它是map结构,key是ThreadlLocal本身(this),value是我们用户存储...

2020-03-22 21:39:45 241

原创 并发工具概览

并发工具总的可以分为三类:为了并发安全的为了管理线程提高效率的为了线程协作之间配合的为了并发安全的互斥同步synchronized、ReentrantLock、ReadWriteLock等各种锁,当然也包括Collections.SynchronizedMap,使用synchronized的集合Vector、HashTable非互斥同步主要包括Atomic包下的很多原子类结...

2020-03-20 22:11:27 252

原创 面试必问,如何控制多个线程的执行顺序

面试中经常被遇到一个问题:现在有三个线程,分别执行会打印A,B,C,如何编码使得三个线程顺序执行,即输出‘ABCABC’,这道题看似简单,但是如果对多线程不熟悉还真的不好回答,好多朋友回答的并不好。下面列举几种方法,代码手工编写,都已测试lock和Synchronized都是通过线程间的通信,唤醒指定的线程实现顺序执行1.使用lockpublic class Task2Lock { ...

2020-03-08 22:00:37 861

原创 JVM调优技巧与经验

JVM调优其实尽量避免Full GC,因为minor GC时间很短,不会太影响程序的运行。而Full GC会造成stop the world,应该尽量避免。在jvm参数中配置,可以打印GC日志-XX:+PrintGCDetails-Xloggc:/{path}/gc.log如果程序启动时,频繁发生元空间的Full GC,就会启动很慢,需要调大元空间值。...

2020-03-08 20:38:25 308

原创 idea(一)使用详解

IDEA的使用总结idea作为目前java开发最舒服的工具,针对其使用做一些总结,提高开发效率:安装和激活初始常用配置快捷键常见用法总结快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl + Q插入链接 Ctrl + L插入代码 Ctrl + K插入图片 Ctrl + G提升标题 Ctrl ...

2020-03-08 11:31:23 107508 5

原创 (三)栈

栈,也是一种特定的数据结构,生活中有大量类似栈结构的场景,所以我们对栈一定不陌生。栈主要的特点就是只能在一端操作数据,后进先出。栈是一种操作受限的线性表,一开始接触的时候我就在想,相比链表和数组,栈带给我的只有限制,并没有什么优势,不如直接使用数组和链表。实际上,特定的数据结构对应特定的场景,数组和链表的确灵活,但也暴露了太多接口,容易出错。所以当某个数据集合只涉及在一端插入和删除数据,并且满足...

2020-02-29 17:43:02 239

原创 java代码从编译到加载执行的过程

在刚接触java时,我们都知道通过javac命令将java源码文件编译成.class字节码文件,这是由编译器来完成的,包括泛型擦除属于编译时期的语法糖。.class字节码文件是跨平台的,也就是不管什么平台的JVM,都可以加载执行。类的加载Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。...

2020-02-20 15:58:38 1083 2

原创 synchronized的底层原理

synchronized使用方式我们知道并发编程会产生各种问题的源头是可见性,原子性,有序性。而synchronized能同时保证可见性,原子性,有序性。所以我们在解决并发问题的时候经常用synchronized,当然还有很多其他工具,如volatile。但是volatile只能保证可见性,有序性,不能保证原子性。参见之前的文章volatile关键字——保证并发编程中的可见性、有序性sync...

2020-02-19 12:09:43 440

原创 MySql数据库索引底层数据结构

索引是帮助数据库高效获取数据的排好序的数据结构。一般的说法索引相当于目录其实并不太准确。索引是存在硬盘文件里的数据是如何存储与读取的?索引采用了什么数据结构呢?       常见的数据结构有:二叉树、红黑树、hash、B树、B+树。       首先来看如果采用Hash,它是把数据进行Hash直接对应磁盘存储...

2020-02-14 23:17:23 2107

原创 (二)链表

链表和数组一样,是非常常用和基础的数据结构,都属于线性表结构。       数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。       而链表恰恰相反,它并不需要一块...

2020-02-09 15:11:39 507 1

原创 数组

数组是最基础的数据结构,数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。这里有两个关键词:线性表顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。连续的内存空间和相同类型的数据       正是因为这两个限制...

2020-02-08 19:36:54 177

原创 数据结构和算法之时间复杂度

前言       学习数据结构和算法,并不是为了死记硬背几个知识点。我们的目的是建立时间复杂度、空间复杂度意识,写出高质量的代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现你的价值,完善你的人生。       掌握了数据结构与算法,你看待问题的深度,解决问题的角度就会完全不一...

2020-02-07 19:53:08 511

原创 happens-before规则

1.happens-before定义       happens-before用来指定两个操作之间的执行顺序。由于这两个操作可以在一个线程之内,也可以是在不同线程之间,因此,JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happens-before关系,尽管a操作和b操作在不...

2020-01-13 10:33:52 696

elasticsearch-权威指南中文翻译.zip

elasticsearch-权威指南中文翻译,是官网文档elasticsearch-权威指南的中文翻译,虽然文档版本较老,但是一些基础概念和原理非常值得一看

2020-04-27

idea配置模板,导入即可

idea工具的最佳配置,包括常用插件如Free Mybatis plugin、Maven Helper等,字体大小,风格,智能导包,隐藏*.idea文件,maven自动更新快照版本等完美配置。 新装idea后点击File--&gt;import settings 即可使用,省去配置的麻烦!

2019-06-06

idea配置模板

idea工具的最佳配置,包括常用插件如Free Mybatis plugin、Maven Helper等,字体大小,风格,智能导包,隐藏*.idea文件等完美配置。 新装idea后点击File--&gt;import settings 即可使用,省去配置的麻烦!

2019-05-03

空空如也

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

TA关注的人

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