自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hello world

道阻且长 不忘初心

  • 博客(326)
  • 资源 (1)
  • 收藏
  • 关注

原创 分布式环境下的数据一致性问题与协议

1.分布式环境下的数据一致性在分布式环境下 机器越多,就难以保证各个机器之间的数据都是一样的,各个节点的机器总会因为 机器故障/网络延迟/处理能力不同 等原因 导致同一份数据,在不同的机器中,很难达到一致的情况。2.CAP理论CAP理论 即 C 一致性 A 可用性 P 分区容错性一致性是指,一个集群中N台机器的数据都是一样的。可用性 是指, 这个集群可以正常对外提供服务的能力分区容错性,比如说这个集群中 ,某个机器挂了,对整个集群的影响程度。很容易就可以发现,这三个标准,无法同时满足。比

2020-10-23 02:25:43 581

原创 dubbo的几种异步调用

同步调用 是指调用线程在服务提供方返回结果前需要被阻塞,异步调用则是消费端发起调用后会马上返回。 (然后服务方处理完成之后,通过回调的形式将结果告知给消费方。)在dubbo 2.6.*版本中1.通过RpcContext.getContext().getFuture()来获取到 Future对象,然后通过Future.get()方法获取到结果案例服务提供者 public static void main(String[] args) throws IOException { //创

2020-06-27 21:49:21 2051 1

原创 spring内幕(十一)spring自定义命名空间

在spring的xml配置中有形如http://www.springframework.org/schema/context 形式的url链接这个是spring用来定义各种标签用的 ,同时各种第三方和spring集成的框架 比如说dubbo mybatis等 也有自己的命名空间,这些也叫自定义命名空间。是spring里面一个很重要的设计,给第三方应用留足了充分的拓展。如果要自己定一个标签 且能让spring解析到 ,要如何做呢?目的:要实现的一个自定义标签 标签名字叫lxx 属性有id na

2020-06-13 00:37:02 494

原创 spring内幕(十)web项目中的容器初始化前置流程

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http:/.

2020-05-28 22:51:28 351

原创 spring内幕(九)ioc容器初始化总结

1、IoC 和 DIIoC (Inversion of Control),即控制反转,是 Spring 的一种设计思想。们直接在对象内部通过 new 来创建对象,是程序主动去创建依赖对象;而在 Spring 中有专门的一个容器来创建和管理这些对象,并将对象依赖的其他对象注入到该对象中,这个容器我们一般称为 IoC 容器。控制反转是将对象管理的控制权反转DI(Dependency Injection),即依赖注入,IoC 和 DI 其实是同一个概念的不同角度描述。依赖注入是指组件之间的依赖关系由容器在

2020-05-27 15:00:01 313

原创 spring内幕(八)bean的初始化之populateBean()方法

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean1.先从beanDefinition中取得设置的property值2.执行autowireByName方法 (根据bean的名字注入)或者 autowireByType方法 (根据bean的类型注入)举例:byTypebyname区别就是 byName,bean的id要和需要注入的bean里面的类成员变量名称一致,

2020-05-27 13:30:33 5002

原创 spring内幕(七)bean的初始化之creatBean()方法

在creatbean中先看该beanName有没有设置后置处理器,如果有 则返回一个代理对象然后看doCreateBean方法在doCreateBean方法里面createBeanInstance方法将会创建一个对象在createBeanInstance方法里面有从提供者那获取bean instanceSupplier是一个回调接口从工厂方法中获取bean,该工厂方法要先通过配置解析到beanDefinition里面使用指定注入的构造函数进行实例化使用默认的构造函数绝对bea

2020-05-19 01:24:22 319

原创 spring内幕(六)bean的初始化过程和循环依赖的解决

在上一篇,记录了ioc容器的初始化,当ioc容器初始化之后,里面保存了BeanDefinition的信息,但此时 bean还不存在。初始化bean有两个地方触发,一个是在容器的初始化的refresh方法里面的 finishBeanFactoryInitialization(beanFactory) 方法该方法里面其实也是调用了getBean() public void refresh() throws BeansException, IllegalStateException { synchron

2020-05-18 15:03:40 859

原创 使用forupdate解决并发冲突

任务场景:有一个主任务表,然后有个子任务表, 一个主任务对应多个子任务,当所有子任务完成的时候,需要去更新主任务表为完成状态。其中过程为,更新子任务,查询剩余子任务数量,如果剩余子任务数量为0,则更新主任务状态。并发问题就是:如果最后剩两个用户,他们提交子任务时后,去查询剩余子任务数量,因为开启了事务没有提交,所以他们查询到的数量都是1,然后就都不去update主任务了,这样最后子任务都完成了,但没有人来更新主任务了。解决方案:1.该项目如果是单机,就在该方法上加锁,syn锁。如果是分布式,

2020-05-10 21:22:14 740

原创 java注解的本质以及注解的底层实现原理

java注解到底是什么? 是类 还是接口,还是抽象类 ,在java里面是怎么生效的?注解也叫声明式接口,那么真的是接口吗?以下是验证过程:创建注解Test2通过idea的查看类继承关系的功能,可以看到@Test2继承了Annotation 接口Annotation 可以在jdk包里面找到,它是所有注解的父接口现在我们知道 注解是一个继承了Annotation的东西,那么@Test2 到底是类,还是接口,还是抽象类?那么去字节码中找答案,自定义注解之后,我们需要在某个时刻将注解取出来,好取

2020-05-10 17:30:50 25612 16

原创 ClassLoader.getResources 能搜索到的资源路径

代码如下 public static void main(String[] args)throws Exception { ClassLoader cl = xxxx.class.getClassLoader(); Enumeration resourceUrls =cl.getResources("com/souche/"); while(r...

2020-05-07 10:07:21 1021

原创 使用forupdate悲观锁实现幂等造成的bug

线上发现数据重复,排查之后,发现有个接口使用了for update 锁定请求号,试图以此来做幂等。该接口有方法级事务,按照事务的规则,锁会在事务结束之后释放代码里面是通过select for update 进行查询,如果为空,则进行插入,否则就认为已经存在 ,不插入。但是数据依然重复了,因此可以认为该for update 悲观锁没有生效。然后再看,发现该数据库隔离级别为读提交。在读提交...

2020-05-07 09:53:41 700

原创 spring内幕(五)容器的初始化过程之BeanDefinition的注册

前面找到resource ,然后又解析到BeanDefinition之后,接下来要将BeanDefinition注册到容器中。注册就比较简单了,其触发地点在DefaultBeanDefinitionDocumentReader的processBeanDefinition中该方法就是 delegate.parseBeanDefinitionElement(ele)解析元素,然后BeanDef...

2020-05-03 19:57:25 511 1

原创 spring内幕(四)容器的初始化过程之BeanDefinition的解析

BeanDefinition是bean的定义信息,ioc容器初始化阶段,需要知道bean的定义信息,才能为后续的bean创建做准备。那么bean的定义信息来自哪里? 一般是xml配置文件,但是也有需要其他来源,因此会有不同的解析器来对应不同的解析方式。上一篇记录了如何获取到resource这篇记录从xml配置转为beanDefinition的过程。而且需要注意的是 xml里面,除了有spr...

2020-05-03 18:41:10 456

原创 spring内幕(三)容器的初始化过程之获取resource

第一阶段 获取resource过程源码解析:FileSystemXmlApplicationContext的创建方法 public FileSystemXmlApplicationContext( String[] configLocations, boolean refresh, @Nullable ApplicationContext parent) throws Bea...

2020-05-02 01:38:59 506

原创 spring内幕(二)beanFactory和application的类聚合关系

从beanFactory到最终可以用的标准ioc容器的聚合关系图从beanFactory 到application 再到一个可用的具备高级特性的IOC容器的聚合关系

2020-05-01 16:01:04 288

原创 spring内幕(一)容器接口体系

2020-05-01 03:08:32 382

原创 分布式笔记(九)zookeeper技术内幕之数据结构和watcher机制

1.zk的数据结构就像是一颗树,每个节点叫Znode,是zk数据结构中最小的数据结构,Znode可以保存数据,也可以在节点下再创建子节点。2.ZXID 是事务ID,是一个64位的数字,是全局唯一的事务ID,可以体现事务的先后顺序,前32位是leader周期,后32位是递增顺序,每一个ZXID对应一次更新操作。3.zk的节点有三大类,临时节点,持久节点,顺序节点。 这三种可以组合形成如下:持久...

2020-04-29 01:34:45 362

原创 分布式笔记(八)zookeeper的应用场景

zookeeper的典型应用场景zk是一个典型的发布/订阅模式的分布式数据管理与协调框架,可以使用其进行分布式的数据发布订阅。场景有:数据发布/订阅 负载均衡 命名服务 分布式协调/通知 集群管理 master选举 分布式锁和分布式队列zk基于ZAB算法的实现,该框架较好的保证分布式环境中数据的一致性,是解决分布式一致性问题的利器。hadoop hbase kafka 等分布式...

2020-04-21 00:43:06 325

原创 分布式笔记(七)zookeeper的开源客户端zkclien和Curator

zk的开源客户端zkclient和Curator原生的zookeepe java客户端使用起来略为繁琐,比如说需要自己定义watcher ,watcher使用之后需要不断的进行注册。删除节点时需要先删除子节点,需要递归创建父节点等等。而开源客户端则对zk的java客户端进行了封装,更得更容易使用,操作更简便,甚至提供了开箱即用的基于zk封装好的分布式锁,选举leader等工具。zkCl...

2020-04-19 00:54:48 269

原创 分布式笔记(六)zookeeper的使用

zk的部署和操作介绍1.下载好对应的压缩包2.配置zoo.cfg 在conf目录下的zoo.cfg文件里面配置tickTime=2000datdaDir=/var/lib/zookeeperclientPort=2181initLimit=5synclimit=2server.1=IP1:2888:3888server.2=IP2:2888:3888server.3=IP3:2...

2020-04-17 01:17:18 283

原创 分布式笔记(五)ZAB协议详解

ZAB的流程:ZAB的节点有三种状态following:当前节点是跟随者,服从leader节点的命令leading:当前节点是leader 负责协调事务election/looking:节点处于选举状态 正在寻找leader代码实现中,还有一个observing状态这是zookeeper引入Observe之后加入的,observer不参与选举,是只读节点。节点的持久状态:histo...

2020-04-11 20:54:28 345

原创 RocketMQ的订阅关系(topic tag和GID)

GID是集群编码,一个消费者集群中,topic和tag是一致的,比如说项目部署在三台机器上,就会启动三个mq的客户端,这三个客户端都属于同一个集群,就是同一个GID下面,消费的时候,这三台其中之一消费成功就行了,不需要每台都消费一遍,这是集群消费模式。那是生产者的GID,就是发送消息的机器集群,我们用topic来代表大的消息类型,然后用tag来代表大类型里面的小类型,比如说审批-付款 , ...

2020-04-09 16:46:47 7720 1

原创 分布式笔记(四)ZAB协议的原子广播和崩溃恢复

ZAB协议:zookeeper原子广播协议 是其数据一致性的核心算法,并非是完全paxos协议。是为分布式协调服务专门设计的一种支持崩溃恢复的原子广播协议,并非是像paxos那样 是一个通用的分布式一致性协议。基于该协议 zookeeper实现了一种主备模式的系统架构来保持集群中各副本之间数据的一致性。过程为:所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器叫leader...

2020-04-09 00:40:35 596

原创 分布式笔记(三)什么是zookeeper

zookeeper介绍apache zookeeper是apache hadoop的子项目 发展而来,zk为分布式应用提供高效可靠的分布式协调服务。提供了诸如 统一命名服务,配置管理和分布式锁等分布式服务的基础服务。在分布式数据一致性,使用了ZAB(zookeeper atomic broadcast)协议,并非直接使用paxos协议。zookeeper是一个高效可靠的分布式协调服务,设计...

2020-04-06 01:16:18 223

原创 分布式笔记(二)paxos协议与chubby

Paxos协议paxos协议是目前业内使用最广泛的一致性协议。paxos解决的问题:将所有的节点都写入同一值,且写入后不再改变三个参与者: proposer 提出议案, accpetor接受议案, learner 推广议案paxos保证:1.只有提出的议案能被选中,没有议案提出就不会被选中2.多个被提出的议案 只有一个会被选中3.议案被选中后 就不能变了。约束条件:p1:acc...

2020-04-06 01:15:03 536

原创 分布式笔记(一)分布式系统与一致性协议(二阶段提交和三阶段提交)

一致性的级别:强一致性:最高级别的一致性,写入什么 读出来就是什么,用户体验最好,但是实现起来对性能影响最大。弱一致性:数据成功写入后,不保证立刻就可以读到,但是可以保证在某个时间级别后 (比如说秒级)达到一致性。又分为会话一致性:只保证写入的同一个客户端会话中可以读到一致值,但其他会话不能读到(会话缓存)用户一致性: 只保证同一个用户写入的 ,该用户可以读到,不保证其他用户 (...

2020-04-06 01:13:22 409

原创 java虚拟机笔记(十四)java锁优化

锁优化jdk5升级到jdk6 花了大量的精力去实现各种锁优化技术:自旋锁,自适应自旋,锁消除,锁膨胀,轻量级锁,偏向锁1.自旋锁互斥同步对性能最大的影响是阻塞,挂起线程和恢复线程都需要上下文切换, 但大多数时候 共享变量的锁定只会持续很短的时间,因此让想获取锁的线程,先自旋等待一段时间,而不是进入阻塞。缺点:自旋需要占用处理器的时间,如果自旋时间很短 那么很划得来,但是长时间自旋,就浪...

2020-04-02 18:00:43 189

原创 java虚拟机笔记(十三)线程安全的实现方式

线程安全:多个线程存在共享数据访问的场景下 ,线程安全可以分为五个级别1.不可变不可变对象是线程安全的,被final修饰的基本类型变量java中的BigInteger 和BigDecimal Long Double String 等不可变对象 需要保证对象的行为 不影响对象的状态 。比如说String的subString()方法 返回的是一个新的对象,而非改变它本身的值。2.绝...

2020-04-02 00:49:13 234

原创 java虚拟机笔记(十二)java线程原理

java和线程:线程和比进程更轻量级的调度执行单位,线程的引入,使得进程的资源分配和调度分开, 线程之间共享进程的资源,但是执行各自独立调度。线程目前是java里面最小的调度单位。线程的实现:1.内核线程实现:也叫1:1实现,内核线程是由操作系统内核支持的线程,由内核完成线程的切换,内核通过控制调度器对线程进行调度,并负责把线程的任务映射到处理器上。程序使用的是内核线程的接口-轻量级...

2020-04-02 00:48:13 207

原创 java虚拟机笔记(十一)java内存模型和先行发生原则

为了解决处理器与内存速度之间的矛盾,引入了高速缓存,每个处理器都有自己的高速缓存,但是又共享同一个主存,使用时先将一部分数据读到处理器的缓存中,处理器需要的时候则可以自己直接从自己的缓存中获取,要比去主存中获取快不少。但是这样又引入了新的问题:缓存一致性问题。 有时候同一块数据,处理器上的缓存数据和主存数据不一致,因为有其他处理器去更新过这块主存数据。 那么以谁为准,就需要新的协议来协调,比...

2020-04-02 00:46:47 157

原创 java虚拟机笔记(十)编译器优化技术

编译器优化技术:之前说的分层编译,栈上替换 是编译器策略,也是一种优化。语言相关的优化技术有:类型继承分析,自动装箱消除,逃逸分析,锁消除,锁膨胀。代码相关的优化技术:方法内联方法内联:编译器最重要的优化手段,消除方法调用的成本,同时为其他优化手段建立基础。比如说方法A调用了方法B,方法内联 就是将方法B的代码 都放到方法A中,合并成一个方法。这样做的好处就是可以减少方法出栈入栈的次...

2020-03-30 00:33:08 199

原创 java虚拟机笔记(九)前端编译器和后端编译器

前端编译器:将java文件编译成class文件的编译器。java很多提高效率和友好度的语法糖都是依赖前端编译器实现的。javac就是一个典型的前端编译器。执行过程如下:1.准备阶段:初始化插入式注解处理器2.解析与填充符号表阶段:词法 语法分析,将源代码转变为标记集合,构建抽象语法树填充符号表,产生符号地址和符号信息。3.插入式注解处理器的执行阶段:会影响javac的行为,比...

2020-03-30 00:32:09 995

原创 java虚拟机笔记(八)虚拟机字节码执行引擎

虚拟机字节码执行引擎虚拟机是相对物理机而言的,都能够执行代码。但是物理机的执行直接建立在指令集,寄存器,操作系统层面上,严重依赖平台。java通过虚拟机屏蔽了这一层,通过虚拟机执行字节码,内部由虚拟机转为平台支持的二进制指令。虚拟机的执行代码的时候,有解释执行和编译执行两种。解释执行由解释器执行,编译执行由即时编译器产生本地代码执行。java虚拟机以方法作为最小的执行单元,栈帧则为支持...

2020-03-28 02:16:24 195

原创 java虚拟机笔记(七)类加载机制

类加载机制类的生命周期加载-验证-准备-解析-初始化-使用-卸载虚拟机规范里面并没有强制要求什么时候开始加载,由不同版本的虚拟机自己实现,但是强制约束了什么时候初始化。1.遇到new ,getstatic,putstatic,invokestatic这个指令时,如果类型没有进行过初始化,则必须先触发初始化。场景有new关键字创建对象时候读取或者设置静态字段时候调用静态方法时候2...

2020-03-28 02:13:50 153

原创 java虚拟机笔记(六)类文件结构和jvm指令

类文件结构所有虚拟机平台都支持Class文件,也就是字节码。 任何基于虚拟机平台运行的语言,也要将代码编译成字节码。 从而实现了 一次编写,到处运行,通过虚拟机屏蔽了底层的硬件细节。1.Class文件里面 开头4个字节是魔数,标识版本。2.紧跟着就是常量池入口,常量池是Class文件结构里面与其他项目关联最多的数据,也是占用Class文件空间最大的数据项目之一。常量池里面主要放字面量 和符...

2020-03-28 02:11:47 201

原创 java虚拟机笔记(五)基础故障处理工具

基础故障处理工具当出现内存方面的问题时候,能够有帮助的东西有异常堆栈 查异常位置虚拟机运行日志垃圾收集器日志 查gc过程线程快照(threaddump/javacore) 查死锁堆转储快照(headdump/hprof) 查内存泄漏jps命令,用来查看java的进程信息,显示main的类名称,进程ID,进程的启动参数。主要用来取进程ID 和jps -l 或者jps -v 看是哪个进程...

2020-03-28 02:10:21 145

原创 java虚拟机笔记(四)垃圾收集器和策略

4.垃圾收集器和策略java区别于c++的最大不同点,java拥有动态内存分配和垃圾收集技术。栈中的区域的数据,比如说局部变量,随着线程消亡,自然会释放。但是堆中的对象则不然,这部分内存的分配和回收都是动态的,垃圾收集器也是关注堆中的内存回收。垃圾回收时有三个要素要考虑:1.哪些内存需要回收2.什么时候回收3.如何回收1.哪些内存需要回收需要判断出死亡的对象,死亡的对象是指不可能...

2020-03-28 02:08:54 242

原创 java虚拟机笔记(三)内存溢出异常

3.内存溢出异常。3.1 java堆溢出:复现如下java堆用来存储对象实例,只要不断创建对象,利用强引用避免垃圾回收清除对象,那么随着对象的增多,总容量触及最大堆空间限制之后就会抛出内存溢出异常。通过参数 -XX:+heapDumpOnOutOfMemoryError ,可以让虚拟机在出现内存溢出异常的时候保存堆快照 。报错信息是: java.lang.outofMemoryErro...

2020-03-28 02:06:41 202

原创 java虚拟机笔记(二)对象的创建,结构以及访问

对象2.1 对象创建过程new指令执行的时候,先看这个指令的参数 也就是对象的类型,能不能在方法区的常量池里面找到,具体就是去常量池里面找这个类的符号引用,并且检查这个符号引用代表的类 是否已经加载,如果没有 就要执行 加载,解析,初始化的过程,把这个类加载到方法区里面,然后,根据这个类,为对象分配空间,分配空间的具体流程就是,在堆中,划分一块内存区域出来,划分的方式堆空间是否连续,有两种...

2020-03-28 02:05:28 129

可以解析大文件的easyexcel版本

1.1.2版本在堆内存400mb的时候解析10mb的excel 堆内存溢出。 但是1.0.1版本支持,因此将1.0.1里面的部分代码和1.1.2版本进行了整合 打了新包. 新增了getbigredear方法,对原有方法不做任何改动

2019-04-19

空空如也

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

TA关注的人

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