自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 RocketMq 高可用性解析(二)消费高可用

1、引言RocketMq 主要的三大流程就是消息的发送,消息的存储和消息的消费了。消息的发送和消息的消费都是在 RocketMq 的client模块中,而消息的存储则是在 broker 模块中。在消费端消费消息时,可能会发生消息消费失败的情况。造成这种情况的原因主要有三点broker 异常了消费端异常了broker 和 消费端的网络异常了而 RocketMq 解决消费端消息消费失败的方式主要有两种:重试-死信机制Rebalance 机制其中重试-死信机制就是为了防止因为网络抖动造成消

2022-04-07 10:38:37 830 1

原创 从 ThreadLocal 到 TransmittableThreadLocal 的深度剖析

引言ThreadLocal 相信大家都用过,我们在需要变量只生效于线程单位时,使用 TheadLocal 能很好的帮我们把变量在不同线程中隔离开来。本篇文章主要分析一下 ThreadLocal, InheritableThreadLocal, TransmittableThreadLocal。这三者是依次推进的关系,InheritableThreadLocal对ThreadLocal做了拓展,TransmittableThreadLocal对InheritableThreadLocal做了拓展。那接下

2022-03-28 10:56:29 1179

原创 RocketMq 高可用性解析(一)存储高可用

引言RocketMq 作为一个成熟的消息中间件,自身保证了高可用性。学习RocketMq中的高可用性可以帮助我们自己在平时编写代码时能够编写处高可用的代码。对于RocketMq,高可用主要在这四块进行保证消息发送的高可用:在消息发送时可能会遇到网络问题、Broker 宕机等情况导致消息没有发送成功消息存储的高可用:在 RocketMQ 中消息存储时Broker发生故障导致消息没有保存下来消息消费的高可用:可能由于网络原因导致,也可能由于业务逻辑错误导致消息一直消费失败集群管理的高可用:整一个

2022-03-24 12:52:15 3384

原创 OpenFeign调用服务的核心原理解析

引言OpenFeign在分布式服务中运用非常广泛,他和RPC所要达到的效果一致,就是为了简化远程服务调用的操作,通过使用OpenFeign可以使得调用远程服务就像调用本地服务一样方便。但是其和RPC在实现上还是不太一样,不一样的地方主要还是调用的方式,OpenFeign是内部实现了rest服务调用,从而一个本地服务调用远程服务的接口时,主要还是通过rest服务调用的方式,那么对于服务端的要求就是其服务需要将这个接口通过rest暴露出来,不然OpenFeign将无法工作;而RPC则不需要服务端将该接口以r

2022-03-19 17:06:45 6630 3

原创 @Sync 注解导致系统OOM 原理探索

引论今天发现了一篇讲多线程避坑的文章,是一位技术大佬写的,我也是非(zou)常(ma)认(guan)真(hua)的看完了这篇文章(文章链接如下),其中的第8点吸引了我,平时都是直接用的,并没有去真正了解他是如何实现的,这居然都有坑。我截取了文章的部分内容如下:我当时觉得不应该呀,因为公司中也确实有挺过地方是直接使用@Async注解的,也从来没有因为线程太多而造成OOM情况,但是大佬也不太可能会欺骗我们,带着这个问题我去研究了一下@Async的实现。探索@Async注解大家应该用的挺多了吧,该注解使

2022-03-10 20:59:13 1867 1

原创 Spring 如何控制 bean 注入,全靠了这个注解

前言在 spring 工程中经常能看到在服务配置中添加了某些服务配置后,这个服务就能用了,例如在yaml文件中配置了下面的配置后,oauth2在校验token时就不会去调动本地的服务,而是会调用token-info-uri中设置的uri来获取token的校验结果security: oauth2: resource: token-info-uri: client: client-id: client-secret:这是如何做到的呢?答案就是@C

2022-03-02 10:35:10 1563 1

原创 从动态代理到 Mybatis 插件原理

前言Mybatis 可以算是大家日常工作中最常碰到的框架工具了,有了 Mybatis 我们在对数据库操作时不用再像jdbc那样还需要关注如何连接数据,数据获取后连接如何处理等一系列和数据无关的操作。所以笔者这里也算是更加理解了" 一个优秀的框架能够使开发者更加关注于自身的业务逻辑上"这句话的含义。使得 Mybatis 优秀的不仅仅是他的功能上,还体现在他的扩展性上。 Mybatis 提供了一种插件的功能,可以使得 Mybatis添加在ParameterHandler,使得在参数解析后,组成sql前可

2021-11-15 16:31:04 473 1

原创 Java8 Stream 的深度理解

前言在java8中,stream流式处理极大的简化了我们的功能代码,其中用来筛选数据的filter也是我们用的非常多的,本篇文章用来记录stream运用时的思考,会不断更新,但是这篇文章不是讲解stream是如何使用的,如果想要学习stream的同学,可以戳这里简化stream执行语句平时大家在写流式数据处理来筛选数据时一般都会这样写list.stream().filter(a-> {具体筛选条件}).collect(Collectors.toList());这样的写法非常好理解,但是会存

2021-11-12 19:02:06 458 1

原创 Spring Oauth2 Token处理原理

前言相信大家在开始时经常会分不清spring security和spring oauth2的区别,对于spring security都知道是鉴权,授权服务。而oauth2的提出是为了解决第三方软件登入时的授权问题,所以oauth2可以理解为资源授权服务。例如我们在打开王者荣耀游戏时,这时候系统会提醒我们使用qq还是微信登入,这时就是王者荣耀这个第三方软件申请qq或者微信的授权来登入对应的账号。上面就是Oauth2中授权中最严谨的授权码模式流程,这篇文章主要是想分享一下客户端(也就是王者荣耀)在得到to

2021-11-10 17:07:11 1949 2

原创 揭开Spring Security 责任链秘密

前言Spring Security是一个优秀的安全管理框架,同时他很多地方支持可定制化。基于Spring Security,我们就可以做出供自己业务场景下的安全管理需求,例如在SaaS服务下的多租户权限控制。而Spring Security中最重要的实现方式,最重要的设计模式,那便非责任链模式莫属了。配置初始化在配置初始化前,都需要有一个机制来触发配置的初始化,道理很简单,因为我们不是所有场景下都需要用到Spring Security,只是在我们需要用到这个框架的时候,才需要去触发他。Spring S

2021-11-09 19:02:49 1133 1

原创 mysql性能调优 explain详解

0. 前言大家在日常工作中一定都会用到数据库,而数据库的执行效率也一定是大家所格外关心的事。经常会有业务程序在执行数据的增删改查的时候速度非常慢(可以通过mysql的慢sql日志去查看有哪些sql执行时间特别长,具体慢sql的超时时间可以通过设置long_query_time参数)。在查到哪些sql语句后,这时我们就需要去分析对应的这条sql语句为什么会执行速度慢。mysql为此提供了一个十分强大的命令–explain。1.explain参数简介其实我们在分析sql语句的具体执行效率时只需要关心一下这

2021-07-16 13:11:52 311

原创 如何获取特定注解的Bean对象(@Qualifier注解的妙用)

1、问题引出面向切面编程使得我们对于一个接口可以有多种实现。在spring源码中更是将接口编码做到极致。但是我们在获取对应接口的实现Bean时,该如何获取限定的Bean呢?我以Spring的某一源码为例。spring中的负载均衡是通过在RestTemplate对象上添加@LoadBalanced注解来实现的。例如只要我们在RestTemplate添加上了@LoadBalanced注解,那么这个RestTemplate对象就拥有了负载均衡的能力。对于类对象添加能力的方式,相比大家都应该了解,是通过动

2021-06-19 20:19:03 1024

原创 一文看懂spring事务原理

1、摘记事务的作用事务操作包含两个目的,数据一致以及操作隔离。 数据一致是指事务提交时保证事务内的所有操作都成功完成,并且更改永久生效;事务回滚时,保证能够恢复到事务执行之前的状态。 操作隔离则是指多个同时执行的事务之间应该相互独立,互不影响。隔离级别MySQL的InnoDB引擎提供四种隔离级别(即ACID中的I): 读未提交(READ UNCOMMITTED) 读已提交(READ COMMITTED) 可重复读(REPEATABLE READ) 串行化(SERIALIZABLE)

2021-06-02 16:36:31 781 2

原创 深入理解Guava EventBus实现思想和实际用法

一、写在前面随着企业业务趋向复杂,往往会碰到以下情况在一个类中需要和多个其他类进行关联,造成类与类之间的耦合严重。多处地方有相同的逻辑,造成代码重复性。而有效的解耦方式就是使用事件机制,它主要的实现思想就是观察者模式。观察者模式主要涉及到三个概念:事件、订阅者和发布者。简单可以理解为发布者发布事件,订阅者消费对应的事件。实现本地事件机制的有Guava的eventBus,Spring的Event。本文我主要想介绍一下Guava的eventBus。二、传统的观察者模式为啥这里需要先说一下传统的

2021-04-11 15:51:57 1458

原创 简易RPC源码解析

文章目录1、RPC框架介绍2、简易RPC框架源码解析2.1、服务端2.2、客户端3、总结1、RPC框架介绍RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。RPC框架图从上图中可以看出,实现一个RPC框架需要有服务端,客户端和注册中心者三个部分。首先服务端需要将服务暴露给注册中心客

2020-10-12 19:58:45 762

原创 如何快速创建用户名密码校验机制

系列文章目录第一章 sprintboot如何快速创建用户名密码校验机制文章目录系列文章目录前言一、创建验证控制器二、工具类介绍三、业务数据类总结前言在后台工程中一定会有登入功能,也就是用户需要输入用户名和密码,在前端首先会对输入的用户名和密码进行格式上的校验,然后前端将输入传给后端首先也需要进行格式校验,然后再判断用户名和密码是否有效,这个时候往往需要到数据库区的用户表中判断是否有这个用户如果有这个用户,则校验通过,同时会返回一个token给前端,这个token就是之后前端和后端交互的凭证

2020-09-27 11:36:24 432

原创 dubbo源码分析(1) dubbo扩展点加载机制

1、扩展点加载注解介绍@Adaptive注解就是自适应注解,这个注解可以标记在类上,@Adapter(KEY1,KEY2,…)这样就可以依次匹配key值对应value名称的实现方法。实现方式就是在接口上添加上这个注解后会在对应的接口类中生成一个调用对应实现方法的方法。这个自动生成的方法中会添加上一些抽象的通用逻辑,找到真正的实现类。而如果这个注解加在实现类上,则主要是为了直接固定对应的实现而不...

2020-04-29 16:05:48 267

原创 jdk源码分析(4) ThreadLocal源码分析及应用场景

1、ThreadLocal介绍性质ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。具体实现就是在ThreadLocal中有一个关于线程的map表,这样不同的线程之间获取的数据是不相同的。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。具体实现是依靠数据的弱引用实现的。应用...

2020-04-24 16:20:53 128

原创 Current包(并发控制工具包)源码分析(2) ReentrantLock分析

1、ReentrantLock介绍首先我们需要清楚ReentrantLock并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能。ReentrantLock相比较Synchronized主要多了三个功能ReenTrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。ReenTrantLoc...

2020-04-20 21:13:32 207

原创 Current包(并发控制工具包)源码分析(1) currentHashMap和hashMap

1.1、hashMap类介绍Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据。HashMap 是Map的一种实现,其底层是基于 数组 + 链表 组成的,在数据没有发生冲突之前放在一个数组中,如果某一个数据在hash后发生冲突,则将数据数组发生冲突的地方建立一个链表,将发生冲突的数据依次放入这个链表中。1.2、hashMap源码分析我们在初始化一个has...

2020-04-15 18:25:55 369

原创 mybatis源码分析(3)Executor执行器分析

1、执行器介绍mybatis中按照功能区分有三种执行器,分别是SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供...

2020-04-11 14:32:43 421

原创 mybatis源码分析(4)一级缓存和二级缓存详解

文章目录1、mybatis二级缓存1.1、介绍1.2、缓存源码分析1.2.1、CacheKey类分析1.2.2、CachingExecutor中调用TransactionalCache类分析1.3、二级缓存的隔离性分析1.4、TransactionalCacheManager的事务性2、mybatis一级缓存2.1、缓存源码分析2.2、一级缓存的隔离性分析1、mybatis二级缓存1.1、介绍...

2020-04-10 18:50:41 355

原创 mybatis源码分析(2) mybatis如何将dao和xml中sql进行绑定

文章目录1、流程分析2、解析xml文件2.1、使用方法2.2、解析xml流程1、流程分析相信大家了解mybatis的话,一定会知道mybatis是一门orm语言,其中最先要了解的当然是mybatis是如何将dao层的接口函数和sql语句进行绑定,从而能够通过调用接口函数来执行相应的sql语句。首先,mybatis是通过动态代理的方式将接口语句和sql进行绑定的,mybatis会自己创建一个动...

2020-04-08 18:53:32 1335

原创 jdk源码分析(3) 动态代理实现

文章目录1、动态代理介绍及示例2、Proxy类源码分析3、总结1、动态代理介绍及示例首先我们先来看个例子public interface UserInterface { public void printUserInfo();}有一个实现了这个接口的实现类public class UserImpl implements UserInterface{ @Overr...

2020-04-03 16:35:26 101

原创 jdk源码分析(2) java类加载及类生成机制

文章目录1、classLoader基础知识1.1、class文件介绍1.2、java的类加载器1.3、类加载器的工作方式1.4、两个类相同的判断方法1.5、jdk中Class类存在的意义2、Class类函数分析2.1、Class类的newInstance方法的优势2.3、Class相关函数源码分析2.4、如何对一个Class对象选择合适的构造器1、classLoader基础知识1.1、clas...

2020-04-02 21:53:51 203

原创 jdk源码分析(1) string,stringBuffer和stringbuilder的异同

文章目录1、String分析2、StringBuffer和Stringbuilder的区别3、StringBuffer和StringBuilder比较String的优势1、String分析首先是创建一个String,可以看到一般有两种方法,就是Sting a = “abc”。另一种是String b = new String(“b”)直接赋值jvm为了提升性能和减少内存开销,避免字符的重复...

2020-04-01 21:49:29 114

原创 redis源码分析八--从客户端发送set命令后看服务端的执行流程上

1、Redis服务端的执行流程Redis程序分为客户端和服务端,之间通信是通过socket来传递指令信息,这里有一个问题就是我客户端发送一个set命令后服务器会做哪一些操作呢?具体操作语句见下图这里我设置了一个字符串number值为12306传递给Redis服务器端来进行保存,服务器端是如何实时监听我们的发送指令,并且如何解析的呢?首先我给出服务器端的调用流程图如下首先服务器端在启动时...

2020-03-31 21:56:14 330

原创 redis源码分析七--从redisservice启动分析redis的事件机制

1、redis事件介绍Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件文件事件:Redis服务器通过套接字与客户端(或者其他Redis服务器进行连接),而文件事件就是服务器对套接字操作的抽象。服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。时间事件:Redis服务器中的一些操作(比如serverCron函数)需要在给定的时...

2020-03-27 21:59:51 392

原创 redis源码分析六--压缩列表

文章目录1、压缩列表的特点2、压缩列表的内存布局1、压缩列表的特点压缩列表是一种为节约内存而开发的顺序型数据结构。压缩列表被用作列表键和哈希键的底层实现之一。压缩列表可以包含多个节点,每个节点可以保存一个字节数组或者整数值。添加新节点到压缩列表, 或者从压缩列表中删除节点, 可能会引发连锁更新操作, 但这种操作出现的几率并不高2、压缩列表的内存布局上图就是压缩列表的布局情况...

2020-03-25 13:44:38 226

原创 mybatis源码分析(1) 如何实现动态代理

文章目录1、mybatis动态代理部分框架2、mybatis动态代理代码实现3、代理方法的注入1、mybatis动态代理部分框架2、mybatis动态代理代码实现我们一般调用时会使用UserDao mapper = session.getMapper(UserDao.class); 因为SqlSesseion为接口,默认的SqlSession结构的实现是DefaultSqlSession...

2020-03-20 14:50:28 491

原创 redis源码分析五--整数集合

文章目录1、整数集合介绍2、整数集合的实现1、整数集合介绍整数集合适用范围整数集合(inset)是集合键的底层实现之一。当一个集合只包含整数数值元素并且这个结合的个数不是很多的时候,Redis就会使用整数集合来作为集合键的底层实现。整数集合的特点1、整数集合是有序的2、整数集合是不重复的3、整数集合只能保存整数且必须为正数或者02、整数集合的实现整数集合添加元素的的过程介绍是否...

2020-03-19 22:05:16 263

原创 Redis源码分析一--跳跃表实现

1、跳跃表结构体typedef struct zskiplistNode { sds ele; // double score; //分值 struct zskiplistNode *backward; //后退指针 //层数 struct zskiplistLevel { struct zskiplistNode *forward;...

2020-03-11 13:47:25 228

原创 redis源码分析三--双向链表adlist实现

1、adlist的结构typedef struct listNode { struct listNode *prev; //指向前一个节点 struct listNode *next; //指向后一个节点 void *value; //数据} listNode;typedef struct list { listNode *head; //头指针...

2020-03-08 18:38:58 119

原创 redis源码分析二--sds实现

1、sds头部的结构struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; //当前buf区的数据长度 uint8_t alloc; //当前buf区已经申请的空间长度,就是总长度减去头部和最后的\0 unsigned char flags; //现在只用了3位,表示当前的参数类型是8,16,32还是64位...

2020-03-08 13:50:58 166

原创 RPC协议总结

本文基于刘超老师的网络文章的总结自定义标题1.RPC介绍和需要解决的问题2、ONC RPC2.1、协议约定问题2.2、网络传输问题2.3、服务发现问题3.基于XML的SOAP协议3.1、协议约定问题改进3.2、服务发现问题改进4.基于JSON的RESTful接口协议4.1、协议约定问题改进支持横向扩充4.2、服务发现问题解决5.二进制类RPC协议5.1、协议约定问题改进5.2、网络传输问题改进6...

2020-03-06 11:16:00 441

原创 http协议总结

该文是对刘超老师的网络文章的总结自定义标题1.http协议介绍1.1、请求行介绍1.2、首部介绍2.http的发送和接收过程3.http2.0的优化3.1、请求首部中k-v数据优化3.2、并发性优化4、修改http底层tcp为QUIC4.1、自定义连接机制4.2、自定义重传机制4.3、无阻塞的多路复用4.4、自定义流量控制1.http协议介绍    &...

2020-03-04 23:05:21 128

原创 redis源码分析四--dict字典实现

1、dict结构typedef struct dictEntry { void *key; union { void *val; uint64_t u64; int64_t s64; double d; } v; //利用union共享同一块内存,可以保证空间的合理利用 struct dict...

2020-02-28 17:40:34 244

原创 jdk1.7开始try-catch可以自动调用资源close

如果一个类实现了AutoCloseable接口,并行重写close方法。那么这个类就可以写在try-catch的try后面的括号中,并且能在try-catch块执行后自动执行这个方法。...

2020-02-24 22:03:07 389

空空如也

空空如也

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

TA关注的人

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