自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 资源 (5)
  • 收藏
  • 关注

原创 Spring AOP 分析

Spring AOP分析1. JDK 动态代理JDK 动态代理的实现主要是通过 Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h),这段代码创建动态代理对象。ClassLoader loader: 被代理类的类加载器Class<?>[] interfaces:被代理实现的接口(这个是必须)InvocationHandler h:事件处理。执

2022-03-07 22:34:44 385 1

原创 ReentrantReadWriteLock 源码解析

ReentrantReadWriteLock源码解析1. 结构ReentrantReadWriteLock可重入的读写锁,顾名思义就是该重入锁中存在多种锁,1、重入锁;2、读锁;3、写锁;读锁、写锁中都存在着一个Sync同步器,该同步器又是重入锁的sync下面是读写锁的基本结构很清楚了,ReadLock 和 WriteLock 中的方法都是通过 Sync 这个类来实现的。Sync 是 AQS 的子类,然后再派生了公平模式和不公平模式。2. 基础信息static final int SHARE

2021-12-21 12:57:19 553

原创 RocketMQ(5)- RockerMQ 消息消费

1 消费模式1.1 Pull 模式自主选择 Message Queue和 offset 进行消息拉取,用户拉取消息时,需要用户自己来决定拉去哪个队列从哪个offset开始,拉取多少消息。用户自己维护 offsetStore ,具体的消费进度 roccketMQ 不会进行存储,用户可以存入 redis 或者调用 MQ 接口保存。用户大都采用 Push 模式。1.2 Push 模式DefaultMQPushConsumer 是 Push 方式的默认实现,其中 Push 方式是基于 Pull 模式

2021-12-05 16:27:12 831

原创 RocketMQ(4)- 发送事务消息

1. 事务消息原理RocketMQ 事务消息的实现原理基于两阶段提交和定时事务状态回查来决定消息最终是提交还是回滚。2. 事务消息启动TransactionListener transactionListener = new TransactionListenerImpl();TransactionMQProducer producer = new TransactionMQProducer("trans_producer");ExecutorService executorService = n

2021-12-02 13:10:09 2977

原创 RocketMQ(3)- RockerMQ 消息发送

DefaultMQProducer 消息发送1 消息发送方式RocketMQ 消息发送主要分为三种方式:同步:producer 向 MQ 执行发送消息 API 时,同步等待,直到消息服务器返回发送结果。异步:producer 向 MQ 执行发送消息 API 时,指定消息发送成功后的回调函数,然后调用消息发送 API后,立即返回,消息发送者线程不阻塞,直到运行结束,消息发送成功或者失败的回调任务在新的线程中执行。单向:producer 向 MQ 执行发送消息 API 时,直接返回,不等待消息服务器

2021-11-28 23:01:14 728

原创 RocketMQ(2) - Broker 启动源码分析

1. broker 启动broker 启动需要指定启动参数,-c D:\IDEA_Project\Rule\rocketmq\conf\broker.conf, 其中的配置文件,主要是包括存储消息的路径、nameServer 地址,刷盘方式等,如下, 然后执行 org.apache.rocketmq.broker.BrokerStartup#start 完成启动。brokerClusterName = DefaultClusterbrokerName = broker-abrokerId = 0

2021-11-28 16:36:31 1663

原创 RocketMQ(1) - NameServer 源码分析

1 启动流程首先看下 namesrv 模块下的结构,结构比较简单,只存在 config、processor、routeinfo 三个包再加上namesrv控制器。NameServer 要作用是为消息生产者 消息消费者提供关于主题 Topic 的路由信息,那么 NameServer 要存储路由 信息,还要能够管理 Broker 节点,包括路由注册,路由删除等功能。NamesrvStartup 启动类,启动的方法很简单,只有十几行代码。public static void main(String[]

2021-11-21 12:35:37 1107

原创 RocketMQ(0) - 搭建 RocketMQ 源码并且本地运行

1 拉取代码首先从 git 仓库中获取 rocketmq 源码,然后切换分支到 4.32 编译项目在根目录下,将 pom 文件中的插件进行删除,分别是 maven-checkstyle-plugin,maven-failsafe-plugin,maven-gpg-plugin 这三个插件,接着执行 mvn clean install -Dmaven.test.skip=true, 不删除插件,则执行这一步时,会报错。3 添加配置文件接着在 rocketmq 根目录创建conf 文件夹,用于后面

2021-11-21 12:33:47 1709

原创 Redis 数据分布算法

redis cluster 介绍自动将数据进行分片,每个master 上放一部分数据提供内置的高可用支持,部分master不可用时,还是可以继续工作的在redis cluster 架构下,每个redis要放开两个端口号,比如一个事6379,另外一个就是在这基础上+10000,也就是1637916379端口号用来进行节点间的通信,也就是cluster bus的东西,集群总线。进行故障检测、配置更新、故障转移授权。使用一种二进制的协议,主要事用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间。

2021-11-09 12:02:46 1051

原创 Redis 数据类型 - zset (有序集合)

Redis 数据类型 - zset (有序集合)有序集合每个元素都是一个字符串对象,每个元素都有一个分值为 double 类型的浮点数,底层数据结构是 ziplist 和 skiplist(跳跃表)+ dict 字典。*dict:保存一个从成员到分数的映射,通过该字典可以用O(1)的复杂度查找给定成员的分值。*zsl: 按照分值从小到大保存了所有集合元素,每个跳跃表节点都保存了一个元素。可以通过它对 zset 进行范围型操作,例如 ZRANK、ZRANGE。同时使用字典和跳跃表并不会产生重复成员和

2021-10-31 22:33:25 1687

原创 Redis 数据类型 - set

Redis 数据类型 - setset: 是一个无序的集合,集合中元素都是唯一的。set 对象的编码可以是 intset 或者 hashtable;inset 编码的集合对象使用的是整数集合作为底层实现。而底层是字典时,只不过所有的 value 都是 null。1 intset (整数集合)intset的内存是连续的,所有的数据增删改查操作都是在内存地址偏移的基础上进行的,并且整数的保存也是有序的,intset的内存示意图如下:#define INTSET_ENC_INT16 (sizeof(in

2021-10-31 22:32:54 567

原创 Redis 数据类型 - hash (哈希)

Redis 数据类型 - hash (哈希)dict (字典),类似于Java 中的 map,k-v 型的数据结构,每个键都是唯一的。底层分别采用了 ziplist 和 hashtable 作为底层数据结构。当元素过少时,使用 ziplist,否则使用 hashtable1 ziplist 在 hash 对象每当有 hash 对象需要放入键值对时,就会依次先插入到 ziplist 的尾部,首先插入 key 值,然后插入 value 值,使得 key 和 value 紧挨着,示例如下:Tian:0&g

2021-10-31 22:32:23 461

原创 Redis 数据类型 - list

Redis 数据类型 - Stringlist 中文翻译为:列表,目前 6.2 的版本中,数据结构为 quicklist, 但是逻辑结构其实是 linkedlist + ziplist 的混合体,它将linkedlist 按段切分,每一段使用 ziplist 来紧凑存储,多个 ziplist 之间使用双向指针串接起来。其中每个节点的数据结构如下,根据单个节点结构 quicklistNode 可以看出,通过 prev, next 指针组成双向链表,其中 head,tail 节点值为 null。2.1 z

2021-10-31 22:29:21 273

原创 Nacos 服务端服务注册源码解析

Nacos 服务端服务注册源码解析根据上文的客户端发送到服务段的请求,找到对应的方法 InstanceController#register,ServiceManager: 管理所有的服务,其中 serviceMap (Map(namespace, Map(group::serviceName, Service))),双map 结构存储服务列表,namespace:表示环境prod,uat,dev,group:表示那个产品sales、seckill,serviceName:服务名,一般是项

2021-10-31 15:17:03 506

原创 Nacos 客户端服务注册源码解析

Nacos 客户端发送服务注册源码分析Nacos 具有服务注册和配置中心,想要实现服务发现,一般需要加上 @EnableDiscoveryClient注解,那么还是从注解入手。/** * 开启服务注册发现功能 * @author Spencer Gibb */@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited// 引入类,和@EnableFeignClients类似,原理就

2021-10-31 15:15:49 738

原创 Redis 数据类型 - String

#Redis 数据类型 - String1. stringstring 的底层数据结构为 SDS 也叫简单字符串(Simple Dynamic String)。struct sds<T>{ //记录buf数组中已使用字节的数量 //等于 SDS 保存字符串的长度 T len; //记录 buf 数组中未使用字节的数量 T allocate; //字节数组,用于保存字符串 char buf[];}为什么使用泛型呢,因为当字符串比较

2021-10-26 22:37:42 168

原创 Feign 原理解析

Feign 原理解析基本原理现在已经了解了 Ribbon 的负载均衡原理,我们可以来猜想下,Feign 的原理,仅仅通过一个注解 @FeignClient + 一个接口,就可以服务之间的调用。通过 @FeignClient 在注解中的name,确定服务名,然后 RibbonClient 使用服务名去获取负载均衡器 loadBalancer,再通过负载均衡算法获取到 ip:port, 然后构建的请求为 http://nacos-component-provider/test/{id},当 id = 1

2021-10-26 22:35:01 826

原创 Nacos下 Ribbon 原理分析

Ribbon 原理解析1 初始化 Ribbon 配置信息在 nacos 作为注册中心的项目中,需要引入服务发现的依赖<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>其中会引入 spring-c

2021-10-24 21:58:29 811

原创 深入 Redis 基础数据结构

Redis 数据结构总览Redis 也是 K-V 型数据库,那么为了实现从键到值的快速访问,Redis 使用 hash 表来保存所有的键值对,哈希桶中的元素保存的并不是值本⾝,⽽是指向具体值的指针。这也就是说,不管值是String,还是集合类型,哈希桶中的元素都是指向它们的指针hash 冲突解决Redis会对哈希表做rehash操作。rehash 也就是增加现有的哈希桶数量,让逐渐增多的entry元素能在更多的桶之间分散保存,减少单个桶中的元素数量,从⽽减少单个桶中的冲突。常规rehashR

2021-10-20 21:49:35 107

原创 ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wai

ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-fc6889ca171e -j RETURN: iptables: No chain/target/match by that name.(exit status 1))解决办法:service docker restart

2021-08-19 20:27:21 380

原创 Spring AOP 源码分析

Spring AOP 源码分析基本概念AOP全名 Aspect-Oriented Programming 面向切面编程大法。切面(Aspect):横切关注点的模块化,一个切面能够包含同一个类型的不同增强方法,比如说事务处理和日志处理可以理解为两个切面。切面由切入点和通知组成,它既包含了横切逻辑的定义,也包括了切入点的定义。 Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。可以简单地认为, 使用 @Aspect 注解的类就是切面@Component

2021-07-26 09:28:33 100

原创 Spring 循环依赖处理机制

Spring 循环依赖处理机制概念单例 bean 构造器参数循环依赖 (无法解决)prototype 原型 bean 循环依赖 (无法解决),没有被 spring 管理了。当 A B 中存在循环依赖,并且二者都进行了切面,也就是动态代理,那么返回的这两个 bean 就都是 proxy 类。Map<String, Object> singletonObjects: 一级缓存,初始化完全的 bean。Map<String, Object> earlySingletonO

2021-07-24 13:29:52 153

原创 AQS (队列同步器)源码解析

AbstractQueuedSynchronizer (队列同步器)源码解析结构AbstractQueuedSynchronizer 是一个抽象的同步器,内部结构使用了双向链表(同步队列) + 单链表 (条件队列),在一般的情况下都只会使用同步队列,设计到阻塞队列 BlockQueue 时,会使用到条件队列,所以说 AbstractQueuedSynchronizer 是一个强大的抽象类,涵盖了并发时涉及到的各个方面。下面只会涉及到同步队列的使用

2021-07-03 18:19:04 228

原创 使用Groovy 动态编译生成class文件,再结合 easyexcel 导出excel

使用Groovy 动态编译生成class文件,再结合 easyexcel 导出excel前提​ easyexcel 的使用必须要有实体类,然后根据实体类上的注解@ExcelProperty 实现,根据字段导出数据到excel中缺点​ 必须要具有一个entity.java 文件,如果只是为了解决日常的解决问题,那么当遇到需要导出excel的问题时,就要再生成一个对应的java文件,这样就很麻烦了,如果在工作中,那么就需要大量繁琐的实体java文件解决办法​ 只需要输入表名、列名,查询数据库结果,动

2021-06-12 22:24:24 1091

原创 Synchronized 分析

Synchronized 关键字锁分类锁分为乐观锁、悲观锁。乐观锁的意义是认为读多写少,遇到并发的可能性低,每次去获取数据都认为没有其他线程去修改,所以不会上锁,只是再更新的时候判断在此期间是否有其他线程去修改了数据,一般采用的是先读出当前版本号,然后利用CAS去更新数据。悲观锁则是认为写多读少,遇到并发的可能性高,每次去读写数据时,都会上锁。使得锁持有的时候,其他线程想要操作会被阻塞。而Synchronized则是悲观锁的具体实现。Synchronized 持有锁其实是获取对象的.

2021-04-15 13:02:41 66

原创 线程池原理源码分析

线程池原理分析线程池好处 创建/销毁线程需要消耗系统资源,线程池可以复用已创建的线程 控制并发的数量,并发数量过多,可能会导致资源消耗过多,从而造成服务器崩溃。(主要原因) 可以对线程做统一管理 线程池原理线程池结构从图中可以看出,ThreadPoolExecutor 继承了 AbstractExecutorService 类, AbstractExecutorService 实现了 ExecutorService 接口,ExecutorService 接口继承

2021-04-11 13:25:30 88

原创 多线程并发通信工具类

多线程并发通信工具类Semaphore定义限制线程的数量,往往用于资源有限的场景中,限制线程的数量。// 默认情况是使用非公平public Semaphore(int permits) { sync = new NonfairSync(permits);}​public Semaphore(int permits, boolean fair) { sync = fair ? new FairSync(permits) : new NonfairSync(permi...

2021-04-10 23:47:56 127

原创 BlockingQueue - 阻塞队列

# BlockingQueue - 阻塞队列## 定义BlockingQueue 一般用于生产者-消费者模式,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。BlockingQueue 就是存放元素的容器。### 1. 常用方法![image-20210410144110488](https://gitee.com/rule-liu/pic/raw/master/img/20210410144116.png)- 抛出异常:如果操作无法立即执行,则会抛出异常。当阻塞队列满的时

2021-04-10 23:42:48 1279 10

原创 分布式事务解决框架 Seata + SpringCloud + Nacos

分布式事务解决框架 Seata + SpringCloud + Nacos一、搭建 Seata + Nacos 从官网下载 Seata 的源码包和执行文件,由于文件都是在Github托管,可以从下面地址下载:https://download.csdn.net/download/LarrYFinal/16515872 修改配置文件 registry.conf、file.conf、conf.txt 修改registry.conf,使用的是Nacos作配置中心和注册中心 .

2021-04-08 23:16:02 201

原创 分布式事务原理及解决方案,这一篇足矣

分布式事务原理及解决方案MySQL 分布式原理在 MySQL 中,使用分布式事务的应用程序设计一个或者多个资源管理器和一个事务管理器。 资源管理器(RM)用于提供通向事务资源的途径。数据库服务器是一种资源管理器。该管理器必须可以提交或回滚由 RM 管理的事务。例如,多台 MySQL数据库作为多台资源管理器或者几台 Mysql 服务器和几台 ORACLE 服务器作为资源管理器。 事务管理器(TM)用于协调作为一个分布式事务一部分的事务。TM 与管理每个事务的 RMs 进行通讯。一.

2021-04-05 22:39:28 302

原创 Spring Cloud Gateway + Oauth2 + SSO搭建微服务的统一认证授权中心

Spring Cloud Gateway + Oauth2 + SSO搭建微服务的统一认证授权中心目录Spring Cloud Gateway + Oauth2 + SSO搭建微服务的统一认证授权中心一、简介二、项目搭建三、测试一、简介1.1 Spring Cloud Gateway 网关服务相比大家都应该知道。主要是统一我们的接口请求转发,将我们对其他服务的请求都通过网关进行转发。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如.

2021-04-05 11:37:30 7877 5

原创 搭建私人图床(Gitee + PicGo + Typora)

### 搭建私人图床(Gitee + PicGo + Typora)#### 1. 原由今天突然想要好好写下博客,使用MarkDown进行编写,发现每次截图的图片只能保存在本地上,想要放到网上访问就不行了,每次都要复制图片到免费的图床网站上,十分的麻烦,所以今天准备去弄一个私人的图床工具。#### 2. 选型一搜发现很多采用Github,但是考虑到Github访问不稳定,就采用的是Gitee,国内的开源仓库### 3. 开始搭建#### 1. 搭建Gitee 图床仓库#####

2021-04-05 11:29:22 703

原创 分析 + 手写 LinkedList 源码(增删查询)

首先 LinkedList 的底层实现其实是一个双向链表,这个是最主要的,在后面的add、get、remove 都会用到这个原理。下面是我的手写源码,代码中有注释,我运行了下,应该没有问题,如果有问题,请指出,我会改进,谢谢!/** * @description: 实现 LinkedList 基本的增删查询 * @author: Rule * @date: 2018-09-09 ...

2018-09-09 15:51:24 221

原创 分析 + 手写 ArrayList 源码 (增删查询)

首先 ArrayList 的底层实现,其实就是数组,通过数组的移动位置,来实现增加、删除的操作,但这也是最麻烦的一点,因为每次添加、删除数据都要移动位置。但是它的查找方式却是效率很高的。而 LinkedList 与之相反。下面是我的 LinkedList 源码基本的增删查询博客:https://blog.csdn.net/LarrYFinal/article/details/82559052...

2018-09-09 15:50:26 178

原创 基于Spring的一个简单的HelloWorld 程序

首先Spring是什么?轻量级:Spring是非侵入性-基于Spring开发的应用中的对象可以不依赖于Spring的API依赖注入 DI:dependency injection、IOC面向切面编程:AOP aspect oriented programming容器:Spring是一个容器,因为包含并且管理应用对象的生命周期框架:Spring 实现了使用简单的组件配置组合成一个...

2018-09-09 13:11:34 400

原创 IOC&DI的概述

IOC(Inversion of Control):其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源。作为回应,容器适时的返回资源,而应用了 IOC 之后,则是容器主动地选择将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源。这种行为也被称为查找的被动形式。DI(Dependency Injection):IOC 的另一种表述方式:即组件以一些...

2018-09-09 13:10:27 255

原创 基于IDEA+Maven+SSM员工部门(增删改查)

第一步:部署项目的基本配置项目的基本文件框架  1、首先项目的基本部署:首先导入需要使用的jar包,由于本项目时Maven工程,所以只需要在pom.xml文件下面,添加jar包的依赖关系就可以了。 &lt;dependencies&gt;&lt;!-- Spring MVC --&gt;&lt;dependency&gt;&lt;groupId&gt;org...

2018-09-09 13:09:34 1771

原创 使用连接池进行maven项目(jetty)

首先,利用连接池来进行数据库的连接,要明白连接池和数据源到底是什么?连接池:是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。1、好处:对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问JDBC连接的 1 个线程。当不处理事务时,这个连接就会闲置。相反,连接池允许闲置的连接被其它需要的线程使用。1.1 减少连接创建时间虽然与其...

2018-09-09 13:05:51 468

原创 一个简单的SpringMVC应用

今天来实现一个简单的SpringMVC应用本项目使用 IDEA作为运行开发环境,使用Maven布置SpringMVC项目。 项目的结构图 一、修改pom.xml文件:添加依赖的jar包和读取资源下的 xml 和 properties 文件。在依赖jar包,不要读取相同的jar包了,否则会导致运行项目时,出现jar包冲突的情况。    二、配置...

2018-09-09 13:01:46 213

原创 基于Idea+Maven+SSM的人事管理系统

一、首先还是

2018-08-24 21:12:22 2961

seata1.4 源码包+直接启动包

github 上最新seata1.5 源码包+直接启动包

2021-04-07

PicGo 图床工具PicGo-Setup

PicGo 图床工具

2021-04-05

爬取豆瓣、80s等电影网站

使用python爬取豆瓣、80s等电影网站的电影信息存入数据库中。运行代码,即可直接使用。亲测可以直接运行,如需爬取其他网站,直接可以根据该模板去做适当修改即可使用。

2019-12-08

计算机考研真题合集.txt

计算机考研真题合集、包括电子科大、北邮等知名大学考研真题!

2019-12-07

虚拟机黑apple的多版本资源

虚拟机黑apple的多版本资源,自己亲测过可以使用。需要使用的虚拟机最好的VMWare WorkStation.。Virtual Box使用过,比较麻烦。

2019-01-12

空空如也

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

TA关注的人

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