自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 消息中间件学习二之ActiveMQ

一、安装ActiveMQ是Apache旗下的一款消息中间实现,可以支持多语言客户端,也是一个老牌消息中间件实现,所以各项功能也相对成熟。首先我们可以去官网下载所需要的版本我这里用的是centos去安装的,下载好对应的版本即可。下载完成之后解压:启动ActiveMQ(进入到安装目录的bin目录下执行):启动完成之后,就可以采用ip:8161/admin/html查看管理后台界面,默认账号密码都是admin。此时我们就可以在我们的应用中使用ActiveMQ了,本文将使用Springboot

2022-03-14 17:44:42 847

原创 消息中间件学习一之JMS

一、JMSJMS是Java Message Service的简称,也就是Java消息服务,他是一个标准的与具体平台无关的API,类似于JDBC,可以用于不同应用中进行收发消息(异步通信)。既然是规范,那么其就有一定的标准或者说JMS的体系架构。一般来说JMS由如下组成:提供者:也就是JMS的实现,可以是其它平台的实现,类似于JDBC的mysql实现和oracle实现使用者:一般指具体使用JMS服务的具体应用生产者:消息的生产者消费者:消息的消费者消息:具体需要传递的消息队列:可以理解为消息被

2022-03-13 14:16:22 2644

原创 Docker容器学习八之Docker-Swarm

一、Swarm前文的学习都是针对docker单机环境下,进行简单的认识与了解,那么如果是docker集群环境下又是怎么管理呢?这时候就需要一个容器的编排技术,docker中默认是实现了swarm技术,用来管理docker集群环境下的容器,同时还可以使用Kubernetes(k8s,也就是后续将要学习的新的容器编排技术)可以通过docker swarm --help指令来查看当前的一个帮助文档在swarm集群中有两个部分组成:管理节点:主要负责整个集群的管理工作,比如集群的配置以及服务的管理等工作

2022-03-06 17:14:14 2974

原创 Docker容器学习七之Docker-Compose

一、安装compose当我在进行docker容器管理的时候,针对打个容器,比较好操作,如果容器过多,各种不一样的容器怎么进行同一管理,这尤为重要,所以compose,技术可以帮我去实现这样的功能,他采用yaml文件方式,用户只需要编写好对应的yaml文件,然后执行这个文件即可。第一步需要按照compose组件,依然从官方教程获取首先:通过如下命令获取稳定版本sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2

2022-03-03 14:43:04 987

原创 Docker容器学习六之Volume

一、Volume当我们在编写Dockerfile文件时,会有这么个语句VOLUME这个语句的意思就是在容器和宿主机中建立一个共享目录,也就是容器可以把数据保存到这个目录下。这也是docker中容器数据持久化保存的一种方式。那么如何去使用这个Volume呢?我们先来做个小实验,这个实验是这样的,我们创建一个带有jdk的镜像,并与主机共享一个目录"/usr/mydata",然后把打包好的一个应用放在这个目录下,之后启动容器,并在这个目录下去运行应用,此时我们从容器中取创建一个文件,再回到宿主机中取查看当前文

2022-02-28 09:27:05 4572

原创 Docker容器学习五之Dockerfile

一、语法Docker中的镜像可以通过Dockerfile来构建,在第二节中,简单编写了一个Dockerfile文件,并成功生成了一个镜像。FROM openjdk:8LABEL author="cainiao1024"COPY docker-1.0.jar my-sp-docker.jarCMD ["java","-jar","my-sp-docker.jar"]本文,将围绕着Dockerfile相关语法进行说明。FROM: 意思是当前镜像需要什么镜像的支持 ,比如第二节中的sprin

2022-02-27 18:31:06 675

原创 Docker容器学习四之网络

一、虚拟网卡1、网卡网卡是一块可以使计算机网络之间通信的硬件设备,他拥有一个独一无二的MAC地址,这是在网卡被生产之出就已经写入网卡的ROM中,也就是说计算机网络中所有的计算机都有一个独一无二的MAC地址。当计算机在网络中间进行通信时,还需要绑定一个IP,也就是IP用来在网络中进行选址,但是IP是经常变动的,而MAC地址却是唯一不变的,所以我们可以通过IP去定位到某一个网络,然后再通过MAC地址去定位到具体的某一个设备,网络会给每个网卡分配一个IP地址,这个地址是可变的。可以通过ipconfig /al

2022-02-27 16:32:28 1231

原创 Docker容器学习三之容器

一、容器docker中容器具体是什么?我们应该怎么去理解容器这一概念呢?当我们拿到一个镜像去运行,此时会产生一个实例,这个实例就是容器,同一个镜像可以生成多个实例,这个就有点类似于Java中类与对象之间的关系。当我们只需docker ps的时候就可以查看当前运行了多少个容器:我先来看看关于docker的一张架构图:从图中可知,Docker的Client端通过Docker提供的API与Docker主机通信,Docker主机会保存当前的镜像,以及运行的容器实例,最右边就是一个镜像仓库。Docker

2022-02-26 21:24:59 1049 2

原创 Docker容器学习二之镜像

一、镜像Docker可以把我们的应用打包成一个可移植的镜像,也可以拉取打包好的镜像来共自己使用,那么也会存在一个存放docker镜像的仓库。一个官方的镜像仓库地址[https://hub.docker.com/],我们可以注册相应的账户就可以登录使用。(https://hub.docker.com/),此时,我们也可以使用阿里云的镜像仓库。本文,将分别介绍镜像仓库的设置、镜像的拉取、镜像删除、镜像修改、镜像的制作以及发布镜像到远程仓库。二、镜像仓库设置docker安装的时候,会默认配置官方的镜像仓库

2022-02-26 15:04:34 1242

原创 Docker容器学习一之初识Docker

一、什么是DockerDocker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。以上这段话引用自百度百科,初步理解Docker是一项容器技术,可以根据我们自定义规则把应用打包成一个镜像,其他机器就可以使用这个镜像,启动我们的应用。二、Docker安装官网有各种系统的安装教程,本文学习是在centos系统下进行(在Windows机器上立永VM虚拟机安装的centos系统)。

2022-02-26 12:55:50 741

原创 分布式锁实现

一、什么是分布式锁在一个进程中,多线程去竞争资源时,可以通过synchronized或者Lock锁进行同步执行,保证多线程情况下,资源的调用是安全的,那么多进程中或者多节点机器中如何去保证对相同资源的调用是安全的,此时就引出了分布式锁解决方案。分布式锁就是用来保证在分布式系统中对共享资源调用时保证其一致性。二、分布式锁实现在实现分布式锁过程中需要考虑如下几点:加锁和释放锁的原理怎么保证一次只有一个节点拿到锁锁的可重入性怎么预防死锁问题没有获得锁的节点应该怎么处理需要实现分布式锁,就得借

2022-01-14 15:43:28 503

原创 Spring事务传播机制

一、环境搭建Spring中事务的传播机制,主要是指多个事务方法相互调用过程中,事务在方法间的传递过程,比如方法A,调用了方法B(A、B都是事务性调用),此时不管是在方法A还是在方法B中出现了异常,那么事务回滚状态是怎样进行的。...

2022-01-10 15:36:58 640

原创 ZooKeeper源码分析十八之原子广播

一、原子广播当完成Leader选举或者集群崩溃恢复之后,就开始原子广播过程,这个过程是保证当前集群中的数据一致性,原子广播也就是ZAB协议的实现过程。选举出来的Leader中的事务id,通常来说是集群中最新的,但是Follower和Observer节点可能存在数据不一致的情况,此时需要进行数的同步操作。我们以Follower节点为例,完成Leader选举之后,会调用followLeader()方法,方法中首先会设置当前的ZAB状态为DISCOVERY。self.setZabState(QuorumPe

2022-01-05 16:54:54 523

原创 ZooKeeper源码分析十七之崩溃恢复

一、崩溃恢复崩溃恢复一般指当前集群中不存在Leader节点时,此时集群处于一个崩溃的状态需要及时的选举出新的Leader,然后进行数据一致性处理,Leader崩溃是指,Leader节点退出或者重启以及集群中半数Follower不能与Leader保持通信,此时认为处于崩溃状态。针对这几种情况从源码角度分析集群的恢复过程。1、Leader宕机或者重启出现这种情况是,集群中的Follower节点会重新选举新的Leader节点,此时我们从Follower节点来分析,新的Leader发起过程。在完成Leader

2022-01-05 14:08:23 1664

原创 ZooKeeper源码分析十六之集群下Leader数据处理流程

一、LeaderLeader处理写请求,发起Proposal提案给Follower进行表决,协调集群中其它节点,同步最新数据给集群中其它节点。QuorumPeer的run方法中会根据当前的状态是LEADING执行对应的操作: //设置当前leader setLeader(makeLeader(logFactory)); //调用lead方法 leader.lead(); setLeader(null); vo

2022-01-05 10:37:58 719

原创 ZooKeeper源码分析十五之集群下Follower数据处理流程

一、FollowerFollower节点在集群中会参与投票以及Leader选举,同样会转发事务请求给Leader节点,然后通过Leader发起的投票进行表决,通过后提交当前事务。如果是写请求直接执行操作。与Observer节点不一样的地方在于Follower会参与投票和Leader选举。QuorumPeer的run方法中会根据当前的状态是FOLLOWING执行对应的操作 setFollower(makeFollower(logFactory)); follower.f

2022-01-04 16:25:07 234

原创 ZooKeeper源码分析十四之集群下Observer数据处理流程

一、请求处理前文分析了Leader选举过程,完成选举之后,就会把对应节点设置成对应的状态,我们知道集群中有三种角色Leader、Follower、Observer,分别对应着源码中的LEADING、FOLLOWING、OBSERVING。还是回到QuorumPeer的run方法: public void run() { try { while (running) { switch (getPeerState()) {

2022-01-04 14:42:23 641

原创 ZooKeeper源码分析十三之Leader选举(2)

一、QuorumPeer的run方法前文,只是为Leader选举做好前期准备,但是还没触发选举过程,在start方法中,调用完startLeaderElection()后,会启动QuorumPeer线程,接下来我们就从他的run方法入手。 public void run() { try { while (running) { switch (getPeerState()) { case LOOK

2021-12-31 18:14:05 576

原创 ZooKeeper源码分析十二之Leader选举(1)

一、节点角色ZooKeeper中节点角色有Leader、Follower、Observer。Leader:负责处理处理写请求、协调集群中的其它节点、发起投票,以及同步最新数据给其它节点Follower:负责读请求,当接收到写请求会转发当前的写请求给Leader节点,参与Leader选举Observer:负责读请求,不参与Leader选举二、源码分析接下我们从源码的角度去分析ZooKeeper中的ZAB实现过程,回到集群启动的QuorumPeer的start方法: public syn

2021-12-31 10:34:52 277

原创 ZooKeeper源码分析十一之ZAB协议

一、数据一致性1、背景随着业务的不断增大,单点系统不足以支撑业务的不断壮大,此时就引出了分布式服务,分布式服务就是把原本的单点系统进行拆分,拆分又分为水平拆分和垂直拆分,水平拆分按照分层模式来拆分,比如表示层和业务逻辑层进行拆分,分别部署到不同的机器上,每一层还可以进行集群搭建,垂直拆分就是把一个系统进行模块化拆分,比如电商系统中的用户模块、购物车模块、订单模块等,每个模块单独部署,所以通过服务拆分,集群部署等多种技术提高了原来系统的可用性。在分布式环境中节点故障、网络的不可靠性等因素,给构建高性能、

2021-12-29 17:37:10 555

原创 ZooKeeper源码分析十之集群启动

一、ZooKeeper集群我们先模拟搭建一个ZooKeeper集群环境:第一步,把下载好的文件复制好三份第二步,准备三个数据目录第三步,在每个数据目录下创建myid文件,文件内容分别写入1、2、3第四步,修改每个zoo.cfg配置文件,具体修改内容如下,不同的服务使用不同的clientPort端口tickTime=2000initLimit=10syncLimit=5dataDir=D:\\zookeeper\\data1clientPort=2181server.1=127.0.

2021-12-29 11:50:51 431

原创 ZooKeeper源码分析九之Watcher机制

一、什么是WatcherWatcher是观察员的意思,ZooKeeper中Watcher就是观察节点状态变化的观察员,也就是说ZooKeeper通过在节点上添加一个Watcher来感知节点的变化,我们先来看一个简单样例:先通过命令创建一个/wathcer节点:通过get命令注册一个watcher通知在该节点上:再起一个客户端去修改当前的节点值:此时,原来的客户端就会接收到一条通知:当我们再去修改节点值的时候,就会发现客户端不在收到节点变化通知,说明watcher是一次性的。以上大致处理

2021-12-28 17:35:50 604

原创 ZooKeeper源码分析八之Session管理

一、Session客户端成功连接到服务端表示一个会话建立成功,会话成功建立后,客户端和服务端就可以正常的交互,所以本文将从服务端源码级来探寻ZooKeeper中的Session管理机制。还是先回到NIOServerCnxn的doIO方法,这是处理客户端连接的入口方法,由之前的分析我们知道,客户端请求建立连接时候,会先调用readConnectRequest()方法,这个方法是处理客户端的连接请求,转而又调用ZooKeeperServer中的processConnectRequest方法(省略了部分代码)

2021-12-27 14:49:42 483

原创 ZooKeeper源码分析七之通信协议

一、序列化和反序列化以上,有任何不对的地方,请留言指正,敬请谅解。

2021-12-24 16:11:03 726

原创 ZooKeeper源码分析六之FileTxnSnapLog

一、FileTxnSnapLog前边分析可知,ZooKeeper中数据的持久化以及日志文件的写入都是通过FileTxnSnapLog对象来实现的,本文大致分析一下这个对象的整体结构。FileTxnSnapLog的初始化在runFromConfig方法中:FileTxnSnapLog txnLog = new FileTxnSnapLog(config.dataLogDir, config.dataDir)其中dataDir和dataLogDir是在配置文件中进行路径配置,并且dataDir必须的且

2021-12-23 16:10:43 866

原创 ZooKeeper源码分析五之ZKDatabase

一、数据结构ZooKeeper中数据结构是以树(DataTree)的形式保存,树中的节点对象是DataNode,主要保存节点值data、当前节点的权限acl、以及当前节点的状态stat(节点状态和权限在第一节的时候简单分析过),DataNode中还保存了children子节点的路径。DataTree会保存当前所有节点到nodes集合中,DataTree中还有两个属性dataWatches和childWatches,这是实现watcher机制的重要属性。dataWatches是监控当前节点的变化,chil

2021-12-23 13:57:05 1187 2

原创 ZooKeeper源码分析四之接收请求(单机启动下)

一、接收请求前文分析了ZooKeeper单机模式下的简单启动过程,本文接着前文继续分析,ZooKeeper启动之后,是怎么样处理来自客户端的请求。前文分析可知,ZooKeeper开启了三类线程来处理客户端的请求,AcceptThread、SelectorThread、ExpirerThread,本文将围绕着这三类线程进行展开,同时还需要注意WorkerService对象,三个线程的实例化都是在ServerCnxnFactory的configure方法中实现。expirerThread = new Co

2021-12-23 11:04:31 586

原创 ZooKeeper源码分析三之单机启动

一、解析配置文件单机启动时,配置文件解析对象是ServerConfig,查看其parse方法: public void parse(String path) throws ConfigException { //这里是通过集群启动下的解析对象来解析配置文件 QuorumPeerConfig config = new QuorumPeerConfig(); //解析配置文件,先从文件中读取配置信息到Properties对象中,然后赋值到对应的属性上,配

2021-12-21 14:26:18 1470

原创 ZooKeeper源码分析二之启动类

一、启动类如果你编辑zkServer.cmd文件就会发现ZooKeeper的启动类是QuorumPeerMain实例,既然是启动类,必然存在一个main方法。如下: public static void main(String[] args) { QuorumPeerMainmain = new QuorumPeerMain(); main.initializeAndRun(args); }main方法通过调用QuorumPeerMainmain的ini

2021-12-17 11:23:32 499

原创 ZooKeeper源码分析一之初识ZooKeeper

一、什么是ZooKeeper?ZooKeeper是Apache旗下开源的分布式协调服务,可以支持分布式配置、分布式同步、命名注册等服务,这是进行分布式系统开发中非常重要的一个软件,本文开始将从源码级来认识ZooKeeper。二、ZooKeeper安装第一步:从官网下载对应版本的安装包第二步:修改conf目录下的zoo_sample.cfg为zoo.cfg第三步:编辑zoo.cfg 找到dataDir字符配置好对应的位置第四步:启动zkServer.cmd,此时ZooKeeper就可以正常启动

2021-12-16 15:55:51 756

原创 Mybatis源码分析十四之MyBatis-Spring整合

一、MyBatis-SpringMyBatis-Spring会将Mybatis无缝的接入到Spring容器中,也就是可以正常的使用Spring来管理Mybatis。先看一个整合demo。@Configurationpublic class Configure { @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean factoryBean = new Sql

2021-12-15 10:28:49 206

原创 Mybatis源码分析十三之DataSource

一、DataSourceFactory本文简单分析一下,mybatis中数据源的实现逻辑,从配置来看,可以配置池化和非池化以及JNDI模式,也就是type=“POOLED|UNPOOLED|JNDI”,依旧从源码入手,回到Configuration解析中。解析dataSourceElement方法。会根据配置好的type得到对应的DataSourceFactory工厂,通过DataSourceFactory工厂返回对应的数据源。mybatis配置了如下三种数据源工厂。UnpooledDataSour

2021-12-14 15:24:57 1214

原创 Mybatis源码分析十二之Plugin插件

一、插件Mybatis中允许我们在执行过程中,在一些节点处进行拦截,具体可以在如下对象的方法中进行拦截:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParameters)ResultSetHandler (handleResultSets, handleOutputParamet

2021-12-14 10:32:22 496

原创 Mybatis源码分析十一之SqlSource

一、SqlSource在分析mapper映射文件解析时,我们只是整体介绍了mapper映射文件,而sql语句的解析过程没做进一步说明,分析中可知,用户编写的sql语句是存放在SqlSource对象中,但是语句中的参数怎么解析的、参数映射关系是怎么保存的以及动态sql是怎么实现的,将是本文的重点。SqlSource是只有一个方法的简单接口。public interface SqlSource { BoundSql getBoundSql(Object parameterObject);}它有如

2021-12-13 16:46:21 958

原创 Mybatis源码分析十之MapperProxy

一、MapperProxyFactory在使用mybatis的时候,配置好对应文件,只需要调用接口方法就可以实现对数据库操作。接口本身是不可以直接使用的,需要有具体的实现类,在mybatis中我们不需要去编写具体的实现类,只需要编写对应的接口就行。到这里,估计大家都已猜出,mybatis用代理的方式为我们做了实现,所以本文会重点分析mybatis中代理的实现。在SqlSession中有个getMapper(Class< T > type),我们只需要传递一个具体的接口,就可以得到其代理对象。

2021-12-10 14:41:58 955

原创 Mybatis源码分析九之StatementHandler 二(ResultSetHandler)

一、ResultSetHandler,回顾之前配置结果集的时候,有两种配置方式resultMap和resultType只能是二选一。resultType是一种简单模式,只需要配置类的全限定名或者别名即可,而resultMap则更加的灵活,可以进行复杂的映射,至于结果映射,mybatis又提供了三种映射等级NONE、PARTIAL 、FULL,默认是PARTIAL,可以通过autoMappingBehavior来全局配置,接下来我们就从源码来分析,这三种映射等级和两种配置方式在源码中的实现与不同。结果集处

2021-12-10 10:45:31 388

原创 Mybatis源码分析八之StatementHandler一

一、StatementHandler我们在分析Executor的最后发现,对数据库的实际操作都是通过StatementHandler来实现,本文接着Executor中调用StatementHandler开始分析,一步步的走向最底层。 public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql

2021-12-07 15:12:12 950

原创 Mybatis源码分析七之Cache缓存

一、一级缓存我们知道mybatis的一级缓存是默认开启的,不需要配置,也没有相应的配置功能去关闭。所以有必要了解一级缓存的使用,以及实现原理,这样我们才能更好的使用其缓存机制。前文分析知道,mybatis的缓存实现逻辑在Executor中实现的,所以这里我们还是要重新分析一下BaseExecutor中的query方法。 public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBou

2021-12-01 17:23:54 966

原创 Mybatis源码分析六之Executor

一、Executor前文分析了SqlSession,总的说来就是实现了数据库操作的增删改查方法,但是具体的调用都是通过Executor来实现的,所以分析Executor对了解Mybatis是怎么运行极其重要。Executor是SqlSession的构造参数之一,他的实例化过程是调用Configuration的newExecutor方法返回的Executor executor = configuration.newExecutor(tx, execType),tx是事务工厂(已经介绍过),execType

2021-12-01 10:48:03 508

原创 Mybatis源码分析五之SqlSession

一、SqlSession第一节我们知道,Mybatis执行sql语句的时候都是通过SqlSession来执行的,从第二节我们分析了SqlSessionFactory,也就是不断的产生SqlSession的工厂类,只需要调用其openSession方法即可。 private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {

2021-11-29 16:58:01 203

空空如也

空空如也

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

TA关注的人

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