自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 Nginx学习笔记--高可用Nginx架构:keepalived+nginx

Nginx作为对外暴露的访问入口,必须具有高可用性,才能保证能够正常提供服务。单机Nginx服务的情况下,一旦出现宕机,将会导致需要Nginx路由的服务不可用访问,因此,保证Nginx服务的HA(high availabitlity),也就是高可用性。 keepalived+lvs+nginx如何...

2019-01-09 23:06:32 795 0

原创 @Transactional注解不起作用解决办法及原理分析

Transactional失效场景介绍 第一种 Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用。例如以下代码。 定义一个错误的@Transactional标注实现,修饰一个默认访问符的方法 /** * @author zhoujy ...

2018-12-09 00:21:50 12078 2

原创 分析spring boot中几种常见的依赖注入问题

最近有空总结一下之前在使用spring boot时遇到过的几种依赖注入时的坑,如果了解spring内部的处理过程,使用起来总是感觉有种迷糊。 在分析场景前,需要大概了解一下spring对于bean的实例化过程是需要先注册BeanDefinition信息然后才进行实例化,在org.springfr...

2018-09-25 00:15:11 11288 0

原创 spring boot@EnableXXXX注解编程模型分析

@EnableXXXX编程模型 在spring boot中,@EnableXXX注解的功能通常是开启某一种功能。根据某些外部配置自动装配一些bean,来达到开启某些功能的目的。光说很抽象,要具体分析。 @Enable模型的实现方式基本有3种。一个基本的@Enable注解的模型如下。 @T...

2018-09-15 13:42:49 575 0

原创 深入分析RestController与Controller

@RestController和@Controller注解 我们都知道RestController默认都只提供Rest风格接口返回值,针对不需要返回页面的Controller都采用RestController进行注解,下面根据源码简单分析一下两者处理上的区别。 @RestController源...

2018-09-03 12:31:41 13683 2

原创 深入分析Spring MVC

Spring MVC基本概念 顾名思义,需要了解m、v、c三个部分的概念,是熟悉和分析springmvc处理过程的首要条件。 M部分 M指的是model,也就是模型。在springmvc中的职责就是在后端进行页面的最后渲染时提供页面所需要的数据,这里所说的数据不仅仅是后端返回的业务数据,...

2018-09-02 02:38:04 1393 0

原创 redis缓存一致性问题解决方案

使用缓存来存储热点数据是应对高并发的常用手段之一,通过使用缓存,大大减轻了数据库的压力,同时减少了响应请求的时间。 但是引入缓存之后,随之而来的问题就是当DB数据更新时,缓存中的数据就会与db数据不一致,这时候就需要对缓存的数据进行更新或者淘汰缓存,这篇文章就是分析各种处理缓存一致性问题的解决方案...

2019-03-18 22:39:19 4778 2

原创 mysql调优--从哪几个方面入手

简介 一般涉及mysql调优,可以从几个方面入手,分别是硬件、mysql系统配置、表结构优化、sql语句及索引。下面简单分析一下每个方面我们能够做什么,sql语句和索引是我们调优最常见的手段,在其他文章有记载,这里主要分析其他三个方面。 硬件 我们业务上常见场景 数据库数据量大 每次需要访问的数...

2019-02-17 17:06:04 480 0

原创 脏读、不可重复读、幻读和快照读、当前读

快照读和当前读 快照读(snapshot read),读取历史数据,不是最新数据 简单select操作,select ** 当前读(current read),读最新数据 select ** lock in share mode select ** for update inse...

2019-02-16 14:30:12 320 0

原创 深入了解mysql--gap locks,Next-Key Locks

Next-Key Locks Next-Key Locks是在存储引擎innodb、事务级别在可重复读的情况下使用的数据库锁,官网上有介绍,Next-Key Locks是行锁和gap锁的组合。行锁是什么我们都很清楚,这篇文章主要简单分析一下mysql中的gap锁是什么。innodb默认的锁就是Ne...

2019-02-14 23:49:19 1032 2

原创 mysql调优--根据explain结果分析索引有效性,正确使用索引

定位低效率sql 对于mysql性能优化,除了宏观层面的网络、设备等优化,sql语句的优化是极为重要的一环,需要想办法找到对应的执行效率低的sql语句进行优化。 慢查询日志 慢查询日志是定位低效率sql的手段之一,通过以下命令,设置开启慢查询日志。 #显示是否开启了慢查询日志 show varia...

2019-02-14 21:57:44 1258 0

原创 mysql调优--了解mysql索引结构

对于mysql调优来说,简历合适的索引是极其重要的一部,因此,有必要了解mysql中索引的相关知识。这里记录一下mysql 中关于索引的常见的基本知识。 innodb和myisam存储结构 我们工作中常见的mysql存储引擎包括innodb和myisam,两种存储引擎的数据存储结构不一样,最终两者...

2019-01-31 22:24:09 126 0

原创 JVM调优--JVM垃圾回收的基本知识

记录关于GC不得不知道的知识点~~ 什么是安全点、安全域? 当一个线程挂起或者一段代码,引用关系不会发生变化,那么就是进入安全域,该线程满足GC安全要求 当java程序需要进行一次GC的时候,通知线程进入安全区域,如果线程早已经在安全域,该线程通过安全检查;如果线程还在运行当中,那么接下来线程将...

2019-01-29 22:34:24 108 0

原创 JVM调优--常用JVM监控工具使用

在实际工作中,在进行jvm调优或者分析内存泄露、溢出等问题时,熟练掌握JVM常用的监控工具能够帮助更快地定位问题所在,目前记录一下使用过的常用的jvm监控工具以及其使用、和对应分析过程。 查看jvm使用的垃圾回收器 在开始了jvm调优或者内存问题分析时,我们首先要了解的就是JVM使用垃圾回收器是什...

2019-01-23 23:43:16 4479 0

原创 ReentrantLock实现原理分析

java.util.concurrent包中的工具实现核心都是AQS,了解ReentrantLock的实现原理,需要先分析AQS以及AQS与ReentrantLock的关系。 这篇文章中分析了ReentrantLock#lock与ReentrantLock#unlock的实现,对于Conditio...

2019-01-10 23:24:13 4057 0

原创 Nginx学习笔记--nginx基本操作

nginx是一个反向代理服务器,可以利用它所许多事情,最常见的就是利用nginx做服务器端的负载均衡,访问认证,限流,静态数据缓存等。下面看一下nginx的基本操作。 基本的虚拟主机 nginx既然是一个方向的代理服务器,那么其访问代理配置方式是必须要了解的。在nginx.conf配置文件中的ht...

2019-01-01 23:27:40 191 0

原创 Nginx学习笔记--安装与基本操作

安装步骤 从nginx官网下载对应版本的压缩包,解压缩 进入压缩包根目录,执行命令 ./configure 假如linux中没有安装pcre和zlib库的话,将会报错,需要安装这两个库,在ubuntu环境下,使用以下命令安装 apt-get install libpcre++-dev...

2019-01-01 23:27:06 78 0

原创 redis集群+JedisCluster+lua脚本实现分布式锁

在这片文章中,使用Jedis clien进行lua脚本的相关操作,同时也使用一部分jedis提供的具有原子性set操作来完成值和过期时间的同时设置。使用lua脚本根本原因也是为了保证我们两个redis操作之间的原子性,使分布式锁更加可靠。 JedisCluster相关代码配置 在博主的实现例子中使...

2018-12-24 16:42:51 3862 0

原创 spring boot整合kafka+注解方式

spring boot自动配置方式整合 spring boot具有许多自动化配置,对于kafka的自动化配置当然也包含在内,基于spring boot自动配置方式整合kafka,需要做以下步骤。 引入kafka的pom依赖包 <!-- https://mvnrepository....

2018-12-19 00:19:18 11775 0

原创 spring boot整合redis集群,连接虚拟机redis集群,Unable to connect to 127

spring boot整合redis集群 最近的一个个人项目中使用到redis集群,redis集群的搭建环境使用同一台虚拟机,创建集群的命令是 redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0...

2018-12-16 19:54:52 13676 0

原创 基于JWT验证原理解决分布式系统session一致性问题

session一致性问题 在集群或者分布式系统中,用户登录后的,由于服务端是集群环境或者分布式环境,如何保证用户每次与服务器交互都是使用原来的session或者实现单点登录,这里就涉及session一一致性的问题。 解决session一致性问题可以从两种思路实现,一种是session服务端存储,一...

2018-12-15 22:40:27 1399 0

原创 idea进行debug的时候调用栈只显示一个

在debug调试时发现,查看调用栈信息时,只显示了一层,不知道在哪里搞错了配置,如下所示。 调试时查看调用栈这个是少不了的,因此百度了很久,但也也找不到信息,最后无意间点了,下图中的图标,终于恢复正常,这个图标是折叠来自依赖包的调用信息,方便我们平时调试的,但是看源码的时候记得不能折叠,不然真...

2018-12-07 10:01:39 5037 0

原创 spring源码阅读--@Transactional实现原理

@Transactional注解简介 @Transactional是spring中声明式事务管理的注解配置方式,相信这个注解的作用大家都很清楚。@Transactional注解可以帮助我们把事务开启、提交或者回滚的操作,通过aop的方式进行管理。通过@Transactional注解就能让sprin...

2018-12-07 00:33:31 11492 2

原创 spring源码阅读--aop实现原理分析

aop实现原理简介 首先我们都知道aop的基本原理就是动态代理思想,在设计模式之代理模式中有介绍过这两种动态代理的使用与基本原理,再次不再叙述。 这里分析的是,在spring中是如何基于动态代理的思想实现aop的。为了方便了解接下来的源码分析,这里简单化了一个流程图分析aop的基本实现思想。 ...

2018-12-04 22:34:05 1841 0

原创 spring源码阅读--IOC容器初始化之Bean实例化、依赖注入原理

在spring容器初始化过程中,在进行了BeanDefinition注册,processor应用等一系列处理之后, 接下来需要对非懒加载的Bean进行初始化处理。容器中的Bean实际初始化的过程在 AbstractApplicationContext#refresh AbstractA...

2018-11-28 20:22:16 665 0

原创 spring源码阅读--IOC容器初始化之Beandefinition注册

经过这阵子对于spring源码的学习,对于spring框架的一些常见概念的实现原理有一定的了解,例如spring核心容器模块、spring aop的实现原理、spring mvc的实现原理、spring声明式事务实现原理等有一定的了解,在此记录下来自己的一些阅读源码经验。 spring是一个非常...

2018-11-26 23:37:21 154 0

原创 spring boot下mybatis配置双数据源

最近项目上遇到需要双数据源的来实现需求,并且需要基于spring boot,mybatis的方式来实现,在此做简单记录。 单一数据源配置 单一数据源配置的话并没有什么特别的,在spring boot框架下,只需要在配置文件内添加对应的配置项即可,spring boot会自动初始化需要用到的be...

2018-11-18 11:44:06 805 0

原创 spring源码阅读--下载与编译

这里简单介绍如何下载编译spring源码项目,并且导入到idea或者eclipse中。 首先是下载spring的源码压缩包,可取去github上面下载,地址:https://github.com/spring-projects/spring-framework,可以通过下载压缩包的方式或者gi...

2018-11-10 11:01:13 241 0

原创 设计模式之装饰器模式、观察者模式

装饰器模式 装饰器模式类似于一种特殊的适配器模式,两者非常相似,但是却有因为应用场景不同所以要区分清楚。 适配器模式 装饰器模式 一般来说适配器类跟原来的逻辑类没有关联,两个类可以没有层级关系,也可以有。适配后旧逻辑调用可以通过组合或者继承的方式调用。 模式上是特殊的适配器模式,装...

2018-11-05 22:47:42 176 0

原创 设计模式之适配器模式与委派模式

适配器模式 适配器模式很多时候是为了避免修改老代码造成系统不稳定而进行的一种编码思路,使用适配器进行适配逻辑之后,在调用原来的老代码,保证程序原有功能不受影响。 举个例子,假如有一台显示器,接口是vga接口,那么我们如果有个输出信号的hdmi信源想要在这显示器上显示就要转接头做适配,但是原来的显示...

2018-11-02 00:47:55 457 0

原创 设计模式之策略模式与模板模式

策略模式 策略模式比较类似于一个计算有多种计算过程来获得结果,我们把每种计算方式封装为一个策略,把策略作为可选择参数来决定使用什么计算方式。 代码示例 定义策略接口,表示dofight计算过程。 public interface FightStrategy { public void do...

2018-11-01 22:28:52 947 0

原创 设计模式之代理模式

代理模式是应用最广泛的设计模式之一,例如spring中的aop就是代理模式的实践。通常在java中使用比较广泛的是动态代理模式,其中实现方式比较常用的是jdk动态代理和cglib动态代理。 jdk实现动态代理 利用jdk实现动态代理代码比较简单,需要注意的是基于jdk的动态代理是必须基于接口才可以...

2018-11-01 00:48:09 353 0

原创 设计模式之单例模式

单例模式是Java中常用的设计模式之一,从系统启动到系统终止,保证一个类仅有一个实例,并提供一个访问它的全局访问点。例如spring中的bean默认都是单例模式。 单例模式的实现方式有多种,一般以下几种 饿汉式-变量初始化,饿汉式-静态块初始 懒汉式-同步锁,懒汉式-双重检查锁,懒汉式-内部类延...

2018-10-30 23:39:31 48 0

原创 设计模式之工厂模式

简介 工厂模式属于设计模式的一种,主要目的是解决用户与产品之间的问题,向用户隐藏构建产品的复杂过程,使得产生对象能够批量、标准化。在spring中大量应用。 代码结构可能分为三种模式: 简单工厂模式 工厂方法模式 抽象工厂模式 简单工厂模式 类似于一个工厂,只有一条生产线,这条生产线可以生产A...

2018-10-29 23:37:52 47 0

原创 Mybatis源码分析导读图

主要过程以及结构 mybatis源码主要分析过程有两个 Mapper代理对象获取过程 Mapper代理对象工作过程 上面图中黑线表示Mapper.xml在程序启动时的解析过程;红线表示执行过程获取一个Mapper代理对象的过程;粉线表示Mapper代理对象是如何执行sql的处理过程。 模块职...

2018-10-28 23:12:18 301 0

原创 快速搭建redis5.0集群

redis主从集群搭建 redis简单主从结构如上图所示,主从结构的redis由主节点负责读写操作,从节点负责读操作,这里做搭建介绍,具体工作原理不分析。 下载安装redis压缩包 解压压缩包,进入redis-5.0文件夹,运行命令./make install安装redis 安装完成...

2018-10-25 20:20:56 23955 2

原创 Mybatis源码分析

基于Spring boot来分析Mybatis Mapper类生成过程以及自动配置过程,需要对spring boot的自动配置有一定的了解。 #Mapper自动装配原理 开门见山,先分析一下Mybatis源码代码入口,可以从Mybatis自动装配入手。 使用mybatis的自动装配终会引入这...

2018-10-14 20:52:35 562 0

原创 ThreadLocal分析理解

ThreadLocal简介 ThreadLocal一般用于存储线程级别变量,存储的变量是绝对的线程安全。用的比较多的场景就是存储线程级别变量来传递某些参数,并且注意的是不能滥用。某些情况下不适合用方法参数时,才考虑使用ThreadLocal,并且需要清楚ThreadLocal何时设置值,何时回收。...

2018-10-13 15:25:30 65 0

原创 深入分析HashMap原理(基于JDK1.7)

数据结构简介 jdk1.7的HashMap的基本数据结构是数组与链表的组合方式。如下图所示(图片来源于网络)。 重要属性介绍 final float loadFactor;//用于计算阈值,默认0.75 int threshold; //主要用于判断是否需要扩容的阈值 ...

2018-10-09 23:38:28 93 0

原创 spring cloud Ribbon的使用和实现原理

简介 这篇文章主要介绍一下ribbon在程序中的基本使用,在这里是单独拿出来写用例测试的,实际生产一般是配置feign一起使用,更加方便开发。同时这里也通过源码来简单分析一下ribbon的基本实现原理。 基本使用 这里使用基于zookeeper注册中心+ribbon的方式实现一个简单的客户端...

2018-09-26 22:32:41 18492 0

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