自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

业精于勤,荒于嬉

行成于思,毁于随

  • 博客(156)
  • 收藏
  • 关注

原创 Mybatis整合Spring源码分析

一、整合配置POM<!-- mybatis框架 --><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version></dependency><!--mybatis-spring适配器 --><dependency&gt

2021-12-17 17:16:15 484

原创 Mybatis执行过程源码解析

//使用Mybatis执行查询sql代码示例 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build( Resources.getResourceAsReader("mybatis-config.xml")); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = (User)sql..

2021-12-16 13:38:01 358

原创 BlockingQueue底层原理以及AQS源代码解析

BlockingQueue特征队列是一种存储数据的数据结构,符合先进先出(FIFO)的原则。阻塞队列BlockingQueue是Java.concurrent.util包下的并发容器,除了符合队列的特点之外,还是线程安全的,保证在一个JVM中同一时刻只会有一个线程进行入队和出队操作。适用于解决并发生产者 - 消费者问题,在源代码的注释中有生产-消费示例: class Producer implements Runnable { private final BlockingQueue queue

2021-12-09 15:26:44 838

原创 ReentrantLock底层原理以及AQS源代码解析

使用ReentrantLock进行同步ReentrantLock lock = new ReentrantLock(false);//创建lock实例,false为非公平锁,true为公平锁 lock.lock() //加锁 lock.unlock() //解锁ReentrantLock是一种类似synchronized的互斥锁;需要手动加锁与解锁(显式锁);支持公平锁与非公平锁;可重入。 基于AQS框架的应用实现,通过定义内部类Sync来实现AbstractQueuedSynchronizer(

2021-12-08 16:08:27 738 1

原创 synchronized底层原理

线程安全问题对于多线程访问临界资源(共享资源)这种情况,我们要保证同一时刻只能有一个线程访问临界资源,实现线程安全。Java 中提供了两种方式来保证多线程访问临界资源的同步:synchronized和Lock。其中synchronized是隐式锁,内置锁;lock是显式锁。synchronized原理synchronized是基于JVM内置锁实现,通过内部对象Monitor(监视器锁)实现。在jdk1.6之前还是一个重量级锁,性能较低,依赖底层操作系统的Mutex lock实现互斥。操作系统分为用户空

2021-12-07 17:55:54 496

原创 CPU多级缓存结构以及缓存一致性协议MESI

CPU多级缓存结构现代CPU分为物理核和逻辑核,比如我们日常办公电脑常见的4核8线程,就是指的4个物理核、8个逻辑核。超线程的技术使得一个物理核可以同时做两件事,也就是执行两个线程,但是能真正执行两个线程的场景很少。Java中API获取的核数,就是指的逻辑核。CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。现代CPU为了提升执行效率,减少CPU与内存的交互(交互影响CPU效率),一般在CPU上集成了多级缓存架构,常见的为三级缓存结构L1 Cache,分

2021-12-03 17:44:13 1862

原创 Java内存模型解析

Java内存模型JMM示意图Java内存模型,Java Memory Model(简称JMM),控制了Java线程之间的通信。线程之间的共享变量存储在主内存中,每个线程都有一个自己私有的本地内存,本地内存中存储了该变量以读/写共享变量的副本。如图:Java线程通信Java并发采用的是共享内存模型,线程之间共享程序的公共状态,并通过写-读主内存中的公共状态来隐式进行通信。如果线程 A 和线程 B 通信,要两个步骤:1、线程 A 需要将本地内存 A 中的共享变量副本刷新到主内存去2、线程 B

2021-12-03 11:39:02 327

原创 MySql-事务隔离级别与MVCC

事务简介1.事务ACID特性原子性(Atomicity)一致性(Consistent)隔离性(Isolation)持久性(Durable)2.事务状态活动的(active)部分提交的(partially committed)失败的(failed)中止的(aborted)提交的(committed)事务隔离级别1.事务并发执行遇到的问题脏写(Dirty Write):一个事务修改了另一个未提交事务修改过的数据脏读(Dirty Read):一个事务读到了另一个未提交事务修

2021-11-29 21:37:09 730

原创 Spring MVC 执行流程源码解析

执行流程流程1.客户端发送请求request到DispatcherServlet2.DispatcherServlet根据请求url去HandlerMapping查找处理器handler,HandlerMapping会返回处理器执行链HandlerExecutionChain(其中包括拦截器和处理器)3.DispatcherServlet通过handler去获取支持的处理器适配器HandlerAdapter4.DispatcherServlet通过HandlerAdapter去执行处理器handl

2021-11-28 22:21:24 350

原创 SpringBoot启动原理源码解析

jar运行SpringBoot应用spring-boot-maven-pluginjava -jar启动,首先需要配置一个插件,该插件会:在打包时帮我们编写MANIFEST.MF文件;把项目所依赖的jar包也都打包到jar中,成为fat jar。<!-- pom.xml文件中默认使用该插件进行打包 --><build> <plugins> <plugin> <groupId>org.s

2021-11-25 17:36:01 569

原创 SpringBoot自动配置原理源码解析

自动配置原理DeferredImportSelectorSpring集成外部框架Spring集成其他框架,一般都是通过注解@EnableXXX的方式,在@EnableXXX注解中会有@Import注解,@Import导入的Bean(有3种方式:@Import({ 类名.class , 类名.class… });ImportSelector;ImportBeanDefinitionRegistrar)其实就是集成框架的关键Bean。自定义配置类如果项目中已经有默认的组件A配置(通过@Import),

2021-11-24 17:38:43 485

原创 Spring Bean循环依赖源码解析

循环依赖所谓的循环依赖是指,A 依赖 B,B 又依赖 A,它们之间形成了循环依赖。Spring解决循环依赖Spring通过三级缓存的方式来解决循环依赖的问题。DefaultSingletonBeanRegistry类中的三个缓存变量/** 一级缓存:单例缓存池,用于保存所有的单实例bean */private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);/** 三级缓

2021-11-23 16:26:49 497

原创 Spring IOC容器加载过程源码

一、IOC容器加载过程实例化容器入口// 加载spring上下文,同时传入自己的配置类ConfigAnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);从AnnotationConfigApplicationContext构造方法作为切入点:public AnnotationConfigApplicationContext(Class<?>..

2021-11-18 17:42:10 698

原创 Spring事务原理源码级解析

一、开启事务1.@EnableTransactionManagement通过@EnableTransactionManagement注解开启事务,@Import注解可以为容器中导入组件TransactionManagementConfigurationSelector@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(TransactionManagementConfigurationSel

2021-11-17 17:41:54 425

原创 Spring AOP原理源码级解析

1.AOP核心接口AnnotationAwareAspectJAutoProxyCreator1.1查找核心接口1.Spring通过注解**@EnableAspectJAutoProxy**开启aop切面功能:其中有**@Import(AspectJAutoProxyRegistrar.class)**,把AspectJAutoProxyRegistrar实例加入IOC容器中;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)

2021-11-16 13:57:17 421

原创 MySql-B+树索引与使用

一、索引1.查询效率问题在很多页中查找记录的情况下,不论是根据主键列或者非主键列进行查找,如果不能快速定位到记录所在的页,就只能从第一个页沿着双向链表一直往下找,然后在每一个页中针对主键或非主键分别采用二分法或遍历单向链表中每一条记录,这种方式可能需要遍历所有页以及页中所有记录,极为耗时。所以要快速定位到需要查找的记录所在的索引页,同样需要为索引页建立一个目录,也就是索引。2.建立索引建立目录,就需要让记录按照主键值从小到大排序。如果数据较多,在不同的页之间,那么下一个索引页中用户记录的主键值必须大

2021-08-22 02:41:17 171

原创 MySql-InnoDB记录结构与页结构

一、InnoDB记录存储结构1.InnoDB行格式InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB。我们以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为行格式或者记录格式。InnoDB存储引擎到现在为止设计了4种不同类型的行格式,分别是Compact、Redundant、Dynamic和Compressed行格式。2.COMPACT行格式一条完整的记录其实可以被分为记录的额外信息和记录的真实数据两大部分2.1 记录

2021-08-20 23:05:49 301

原创 Zookeeper客户端使用

一、Java客户端1.maven依赖<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.8</version></dependency>2.客户端操作@Slf4jpublic class ZookeeperClientTest

2021-08-20 22:46:23 247

原创 Zookeeper核心概念和使用场景

一、简介分布式系统的本质是分布在不同网络或计算机上的程序组件,彼此通过信息传递来协同工作的系统,而Zookeeper是一个分布式应用协调框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。二、核心概念1.文件系统数据结构每个子目录项都被称作为 znode(目录节点),和文件系统类似。有以下几种节点:1、PERSISTENT-持久化目录节点:客户端与zookeeper断开连接后

2021-08-20 22:25:30 211

原创 Rocket核心流程源码分析

一、源码环境搭建1.源码拉取RocketMQ的官网源码地址:http://rocketmq.apache.org/dowloading/releases/RocketMQ的官方Git仓库地址:https://github.com/apache/rocketmq/本文以4.7.1版本为例进行分析,下载完成后,需要对其进行编译:mvn clean install -Dmaven.test.skip=true代码结构如下:2.源码启动2.0 修改配置文件先在项目目录下创建一个conf目录,并

2021-08-08 22:58:44 658

原创 RocketMQ模型架构以及高级原理

一、简介RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的一个顶级项目。目前RocketMQ有商业版本和开源版本。开源版本相对于阿里云上的商业版本,功能上略有缺失,但是大体上是一样的。RocketMQ的官网地址: http://rocketmq.apache.orgRocketMQ的官网源码地址:http://rocketmq.apache.org/dowloading/rele

2021-08-07 12:17:07 368

原创 RocketMQ原生API以及整合SpringBoot

一、Java原生API一、maven依赖<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.7.1</version></dependency>在RocketMQ源码包中的example模块提供了非常详尽的测试代码,可以拿来直

2021-08-01 22:50:29 577

原创 Kafka的Java客户端访问以及整合SpringBoot

一、基本使用以2.4.1 release版本为例—kafka_2.11-2.4.1.tgz,其中2.11是scala的版本,2.4.1是kafka的版本0.准备Kafka运行在JVM上,因此需要先安装JDKKafka依赖zookeeper,因此需要先安装并启动zookeeper(不安装也可,Kafka中会自带zookeeper,推荐自行安装)1.下载解压解压完成后,可以使用bin目录下的脚本对Kafka进行下列操作,此处略过。2.修改配置config/server.properties修改b

2021-08-01 01:07:04 540

原创 Kafka模型架构与核心机制原理

一、简介Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,用scala语言编写,于2010年贡献给了Apache基金会并成为顶级开源项目。二、架构三、概念3.1Broker消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群。类似于RabbitMQ Server3.

2021-08-01 01:03:31 361

原创 Fabric-02Peer、Orderer以及CA

五、Peer5.1Fabric Peer特点联盟链中,peer节点代表各个企业和组织。区块链网络主要是由一系列peer节点组成,peer节点是整个区块链网络的基础,因为它是账本和智能合约的载体,通过智能合约,账本以不可篡改的方式记录了交易的全过程;每个节点可以加入一个或多个channel;每个channel维护自己的一个或多个账本,账本之间是隔离的;每个peer可以安装不同的智能合约;交易完成后,peer会发送event事件给client端;每个channel都有local MSP,提

2021-07-11 13:35:51 7107 1

原创 Fabric-01模型及交易流程

内容及图片整理自IBM开放技术微讲堂一、Fabric Characteristic多重认证机制高度模块化通用语言编写智能合约可插拔的共识机制隐私性没有挖矿执行-排序-验证 vs 排序-执行二、Fabric ModelFabric模型示例图(以一个channel为例):2.1Organizationfabric中最小单位是组织Organization。组织可以是工厂、零售商、批发商或者监管机构等,它们之间组成了一个联盟,每个都是以组织的名义参与到网络中。组织是由MSP(M.

2021-07-11 12:42:25 470

原创 SpringSecurity(三)授权流程

授权流程1、拦截请求,已认证用户访问受保护的web资源将被SecurityFilterChain中(实现类为DefaultSecurityFilterChain)的 FilterSecurityInterceptor 的子类拦截。FilterSecurityInterceptor: public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOExcept

2021-07-02 11:40:00 246

原创 SpringSecurity(二)认证流程

认证流程1.UsernamePasswordAuthenticationFilter的父类AbstractAuthenticationProcessingFilter,它的doFilter方法中authResult = attemptAuthentication(request, response); 触发了子类的attemptAuthentication方法;2.用户提交的用户名、密码被SecurityFilterChain中的 UsernamePasswordAuthenticationFilte

2021-07-01 17:47:44 164 2

原创 Docker Swarm集群搭建

一、前提1.在网络方面,需要在路由器和防火墙中开放如下端口:2377/tcp:用于客户端与 Swarm 进行安全通信。7946/tcp 与 7946/udp:用于控制面 gossip 分发。4789/udp:用于基于 VXLAN 的覆盖网络。2.每个节点都需要安装docker,并且能够与 Swarm 的其他节点通信。二、初始化 Swarm初始化第一个管理节点 -> 加入额外的管理节点 -> 加入工作节点 -> 完成。示例包含 3 个管理节点(m1,m2,m3)和 3 个

2021-06-16 17:54:23 103

原创 RabbitMQ整合Spring&SpringBoot

RabbitMQ + Spring使用 Spring整合RabbitMQ,将组件全部使用配置方式实现,简化编码。生产者生产者注入RabbitTemplate发送消息。public class ProducerTest { //注入 RabbitTemplate @Autowired private RabbitTemplate rabbitTemplate; /** * 发送queue消息 */ public void test

2021-06-06 15:51:40 253

原创 RabbitMQ工作模式及高级特性

一、MQ基本概念MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式应用各个系统之间的通信。优势异步提速例如用户在订单系统下订单,订单系统调用库存系统进行减库存操作。如果是同步通信,那么从用户下单(100ms)到更新库存(300ms),整个流程的处理时间大概是400ms。但如果是异步通信,那么用户下单(100ms)信息发送给MQ(10ms)之后直接给用户响应,库存系统从MQ中获取相关订单信息进行更新库存的操作,那么整个流程的处理时间大概是110ms

2021-06-06 15:50:12 388

原创 JVM调优命令及工具

jvisualvm命令JVisualVM是JDK自带的性能检测工具,路径在%JAVA_HOME%/bin下,可以识别机器上所有Java进程,可以对堆内存进行dump、快照以及性能可视化分析,也可以安装插件来分析GC趋势、内存消耗详细状况(Visual GC插件)等。Jmap命令Jmap是JDK自带的一种内存映像工具,可以用来查看内存信息,实例个数以及导出dump文件等。命令帮助geniusdew@localhost ~ % jmap -helpUsage: jmap [option]

2021-05-28 14:34:52 157 1

原创 JVM垃圾回收机制

对象存活分析引用计数法给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用失效,计数器就减1;任何时候计数器为0的对象就是不再被使用的。 这种方法很难解决对象之间相互循环引用的问题,所以很少有被使用。可达性分析算法将“GC Roots” 对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象 。GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。分代收集理论根据对象存活周期的不同将内存

2021-05-21 17:15:39 202

原创 JVM对象创建和内存分配

1 对象创建流程设置对象头(Object Header)初始化零值之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头Object Header之中。在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、 实例数据(Instance Data)和对齐填充(Padding)。HotSpot虚拟机的对象头包括两部分信息:1.Mark Word标

2021-05-13 18:10:46 141 1

原创 Redis主从、哨兵、集群架构

5 主从同步Redis 单节点存在单点故障问题,为了解决单点问题,一般都需要对 Redis 配置从节点,然后使用哨兵来监听主节点的存活状态,如果主节点挂掉,从节点能继续提供缓存功能。5.1. Redis 主从复制简介Redis 支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。1) master 可以有多个 slave。2) 除了多个 slave 连到相同的 master 外,slave 也可以连接其它 slave 形成图状结构。3) 主从复制不会阻塞 master。也就是

2021-04-29 20:37:21 187

原创 智能合约编译、部署、调用

〇、准备工作安装node.js安装solc安装web3.js安装mocha启动私链或公网区块链节点创建文件目录......mkdir contract_workflowcd contract_workflowmkdir contracts #存放智能合约.sol文件mkdir compiled #存放编译后的json文件mkdir scripts #存放脚本js文件mkdir tests #存放测试调用脚本js文件一、智能合约开发通过solidity语言,实现一

2021-04-19 17:28:15 1064

原创 docker命令

一、准备工作下载Dockercurl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo安装Docker依赖yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm安装Dockeryum i

2021-04-18 16:38:08 97

原创 Solidity开发智能合约

一、Solidity简介1.介绍solidity是一门面向合约的、为实现智能合约而创建的高级编程语言,能在以太坊虚拟机(EVM)上运行。它是一门静态语言。内含的类型除了常见编程语言中的标准类型,还包括address等以太坊独有的类型。solidity源码文件通常以.sol作为扩展名。2.语言特性它的语法接近于Javascript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约,它又有很多的不同,下面列举一些:以太坊底层是基于帐户,而非UTXO的,所以有一个特殊的Address

2021-04-09 17:46:23 2072

原创 web3.js连接geth私链

准备工作0.安装geth(Mac系统)brew install ethereum1.查看geth版本geth versionGethVersion: 1.10.1-stableArchitecture: amd64Go Version: go1.16Operating System: darwinGOPATH=GOROOT=go同步公网数据1.指定数据目录同步区块(默认Ethereum主网、full模式)geth --datadir ./data 2.以快速模式同步主网

2021-03-30 16:04:36 3440

原创 Go-02语言并发Goroutine&Channel

一、协程概念进程(Process),线程(Thread),协程(Coroutine)进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为“正在执行的程序”,它是CPU资源分配和调度的独立单位。线程是在进程之后发展出来的概念。它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。一个进程可以包含多个线程。协程是一种用户态的轻量级线程,又称微线程,英文名Coroutine,协程的调度完全由用户控制。二、Goroutinego中使用Go

2021-03-09 15:14:44 130

空空如也

空空如也

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

TA关注的人

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