自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM内存区域与内存溢出异常

序言:在java应用中,内存溢出是很常见的问题.只有了解内存区域的分布和各自负责的功能,我们才能在编写代码时注意编码质量,并且在发生溢出异常的时候能够根据异常提升快速找到溢出原因。1:JVM虚拟机所管理的内存包括以下几个区域,如图所示:1.1 Java堆内存对于我们应用环境来说,堆内存的占比是Jvm所管理内存是最大的。该内存是被所有线程所共享的,在虚拟机启动的时候被分配。...

2019-12-10 20:23:55 271

原创 Java中HashMap底层实现

不论在面试题中还是在我们业务代码中hashmap这一容器的出场率是非常高,那么它的底层是怎么实现的?jdk1.7和jdk1.8两者实现方式有什么不同呢?当我们调用put(key,value)时,hashmap到底是怎么保存数据的?它为何能做到get(key) 的时间复杂度为O(1)的?在JDK1.7中,HashMap采用位桶+链表实现,同一hash值的链表都存储在一个链表里。但是当位于一个桶中...

2019-12-06 16:41:40 259 3

原创 java实现应用系统中字典统一翻译组件

字典翻译在我们应用里是一个很正常普遍的需求。对于小型项目我们可能在数据库设计层面通常不会进行分库处理,那么对于此类项目,通常字典翻译会通过sql语句的子查询来处理,如果业务系统中存在较多的字段为code值时,我们需要编写大量的子查询用于code->name 的代码。在代码层面上造成代码的冗余,在查询数据体量较大的情况并且编写sql人员的能力的不足导致查询性能问题。对于中大型项目我们可...

2019-11-23 15:20:04 1554 3

原创 基础图算法:广度搜索优先(BFS)

什么是图?这里有对图的描述https://www.jianshu.com/p/bce71b2bdbc8那么广度搜索优先算法与深度搜索优先算法的作用就是遍历整个图数据的两种算法,两种算法的核心都是对图的遍历,都属于对贪心算法的体现。广度优先算法(BFS又称为宽度优先算法)广度优先算法是遍历完整图的一种遍历算法,也是很多高级算法的基础,例如Dijkstra又称迪杰斯特拉算法(用来计...

2019-11-15 22:07:57 382

原创 阿里分布式事务框架-seata源码分析

详细可参考:AT下流程图TCC下流程图基于该流程图可大致了解seata中TC,TM,RM这3个角色在seata框架中的作用,以及两种模式的优缺点

2020-09-15 22:51:54 285

原创 阿里开源一站式分布式事务框架seata源码分析(AT模式下TC分析)

1:seata Server分析(TC源码分析)在seata tc服务的启动的时候都是通过它提供的启动脚本来启动,对于seata Server的入口分析,也是启动脚本就可以看出。如下我截最后执行命令,才下面可以很清晰的看到它的入口启动main类为io.seata.server.Serverexec "$JAVACMD" $JAVA_OPTS -server -Xmx2048m -Xms2048m -Xmn1024m -Xss512k -XX:SurvivorRatio=10 -XX:Metaspa

2020-09-15 22:48:22 1070

原创 阿里开源一站式分布式事务框架seata源码分析(AT模式下TM与RM分析)

序言:对于阿里开源分布式事务框架seata的详细了解可以参考官网,这里不会详细介绍。本章只会介绍seata中AT模式的源码分析(对阿seata有一定了解或者成功完成过demo)。seata中一个事务的开启是由TM角色来完成,在整体事务发起方我们可以通过在执行方法中包含@GlobalTransactional来标示启用全局事务,并包含该全局事务的一定自定义设置。如下所示:public @interface GlobalTransactional { /** * 设置该全局事务

2020-09-15 22:47:09 873

原创 Apollo核心功能源码分析(1)-发布配置信息流程分析

序言:Apollo目前是国内开源中对于配置中心这一组件来说使用率应该是最高的一个项目了,它可以快速整合入我们当前的SOA(Dubbo体系),微服务架构中(springcloud体系)。相对于之前基于zk的自我实现(开发成本太高,强依赖与zk),或springcloud config(开发成本不高,使用简单但是运行维护很是不变复杂)来说,它提供了一套基于配置管理平台,对于某一服务在不同环境(开发-DEV,测试-TEST,预生产,生产-PRO)使用不同配置或同一环境不同集群都可以做到协做管理。基于Eurek

2020-08-08 23:31:25 384

原创 Java中J.U.C包下锁的基础-AQS分析

对于锁的作用,简单保证临界区(多个线程,进程同时访问的区域,最终我们希望只有一个线程进去执行操作的区域)中数据的一致性,不会因为在并发的时候出现脏数据,错乱数据。对于java中存在的锁有两种,第一个以Synchronized关键字,第二也是今天重要说明的以AQS(AbstractQueuedSynchronizer)为核心的基于此框架衍生的各种锁。在java中我们可以从不同的纬度来看待锁,如下脑图所示:我们可以看到除了Automi各实现,以及Synchronized关键字,基本上java中的

2020-07-30 13:01:48 235

原创 Kafka副本剖析

序言:副本机制是分布式系统中最常见的概念,在常见的分布式系统中,为了对外提供高可用的服务,一般都对数据和服务进行副本构建。Kafka对于Topic进行了物理上进行数据切片(Partition分区),而对于每一个分区都为了其高可用,在0.8之后采用了多副本的概念,即一个Partition对应多个副本,其中一个副本为leader, 其它的为follower,典型的主从结构,而与其它分布式系统中主从结构的不同,Kafka中只有leader对外提供服务,而follower只会同步leader数据,而不提供服务,至于

2020-07-26 22:13:13 273 1

原创 XxlJob添加Sleuth链路追踪

XxlJob是是一个轻量级分布式任务调度平台。对于此可以通过官网进行学习使用。我们在拥有Sleuth的环境下使用xxjob的时候,就会发现一个问题就是通过xxjob中调用的代码中并不存在链路,当我在XxlJob中出现异常时,需要跨系统查询日志等操作后,得到结论,该操作耗时耗力。所以我们不如向feign,rpc调用一样在xxjob中添加链路。为了不变更xxjob的源码结构,这里我通过spring aop的方式对@XxlJob注解进行切面编程,而注解@Xxljob就是一个切点。代码如下所示:将Tr.

2020-07-22 21:19:34 1910 3

原创 springclou中Sleuth异步中trace传递

在工作中同步转异步处理的场景非常多,例如日志记录,图片异步上传等。sleuth中trace链路+ELK收集,可以让我们很直观看到整个完整的链路,我们知道sleuth中在同一线程的链路的传递是通过ThreadLocal来做到的,而http或rpc调用这种方式的链路一般通过添加header头来进行传递的(这个需要我们去自己实现对http请求的拦截处理-当然我们不需要重复造轮子,spring已经帮我们把这些都实现了,我们只需要进行调用正常调用即可),那么如果我们创建一个线程pool,并异步执行数据,那么原线程中的

2020-07-22 15:18:15 2439 1

原创 Kafka吞吐量为啥那么大

序言:Kafka是一个依赖磁盘来存储和缓存消息,一般对于磁盘的读写我们认为它的速度很慢的(实际上对于磁盘的读写速度也是根据我们的使用方式来决定它的快慢,例如如果我们进行顺序读写那么它的速度和内存相差无几,但若我们进行随机读写时),关于服务器中各存储介质的读写速度可参考以下图。从上述我们可以看出磁盘处于一个底层的位置,而缓存(内存)处于金字塔位置。那么Kafka为何不向Rabbitmq那样采用内存作为默认的存储介质,使用磁盘作为备用(使用磁盘作为消息的持久化,避免内存丢失)来以此实现高吞吐和低延.

2020-07-22 00:18:04 507

原创 Kafka中的选举机制

序言:Kafka作为一个分布式消息中间件(存储消息).既然是一个分布式存储系统(message是分区进行存储),那么肯定需要考虑到数据一致性算法的实现。对于现在较多的开源分布式系统基本会采用两种思路:第一基于paxos算法(衍生出来其它算法例如Fast Paxos,zookeeper的ZAB原子广播协议),第二种基于leader与follower多副本机制(对于数据的写入,同一由leader进行管理写入,follower基本与leader进行同步,例如Raft算法-Nacos实现,Bully霸道选举算法

2020-07-20 23:32:56 1690

原创 springboot2.x +rabbitmq使用和源码分析四(消费者-Listener使用)

序言:当数据通过生产者产生到发送到exchange交换器,再通过设定的路由规则,经过routingKey,最终会落地到queue 中。这个时候引出了Listener消费者了。在第一章中有对RabbitAnnotationDrivenConfiguration该类中源码做过基本分析,该类最大的作用就是通过配置文件的设定用于构建RabbitListenerContainerFactory(该接口的实现,工厂设计模式用以创建核心的MessageListenerContainer容器类,而该类Message

2020-07-17 00:20:33 1483

原创 springboot2.x +rabbitmq使用和源码分析三(消息转换器)

序言:在第一篇和第二篇中,描述了自动装配的过程以及如何发送消息到mq。这里会涉及到将数据转化的工作,也就是如何将我们string或者java对象转化到二进制数据,传输到rabbitmq服务器中(在网络中只能传输二进制数据),而又是如何将到rabbitmq服务器传输的二进制数据转化为监听者需要的实体类型,这里就用到了消息转换器(也就是MessageConverter接口,在RabbitAnnotationDrivenConfiguration我们可以看到有该类的定义并将该类与监听工厂类绑定,在Rabbit

2020-07-13 22:52:08 628

原创 springboot2.x +rabbitmq使用和源码分析二(生产者配置)

1:手动构建RabbitmqQueueExchangeAutoConfiguration该类用于初始化 queue exchange 并进行Binding绑定package com.fc.rabbitmq_demo.config;import org.springframework.amqp.core.*;import org.springframework.context.annotation.Bean;import org.springframework.context.annotat

2020-07-13 00:10:11 930

原创 springboot2.x +rabbitmq使用和源码分析一(自动装配)

序言:之前描述过springboot对kafka对支持,这里主要描述springboot对于rabbitmq的支持。这里建立在对rabbitmq有一定了解,若是一个新手建议参考官网结合一些博客来自我学习。springboot对于rabbitmq各核心组件初始化都在:autoconfigure包下 (这里用的springboot版本较新2.3.1)上面描述的这些类中,主要例举一个核心类并对其介绍:1: RabbitProperties该类从命名上也知道它是一个属性配置文件类,映..

2020-07-12 13:41:01 854

原创 Springcloud-注册中心-Eureka源码分析

springCloud对于注册中心提供了很多的选择,例如实现CAP中AP的Eureka,实现了CP的zookeeper等,这里主要介绍使用的是给予Netflix的Eureka。首先我们基于的springcloud的最新版本-Hoxton来介绍,这里使用的是springboot2.2.5,关于springboot与springCloud的版本对应关系可以参考下表:SpirngCloud Ve...

2020-07-07 23:54:20 387

原创 分布式一致性算法与开源分布式应用具体实现

Paxos算法:Paxos是目前最广泛流行的分布式一致性算法之一,也是目前被各大开源分布式框架使用较多的算法之一(例如zookeeper的核心算法就是基于Paxos算法优化实现的),它的核心思想就是少数服从多数原则,即对于任意的value的产生都需要进行半数以上通过。在Paxos算法中存在3个角色:Proposer (提案者-用于生成各提案-其中提案由-提案编号(一般为全局唯一且递增的)+...

2020-07-03 00:29:24 395

原创 Nacos注册中心客户端与服务端源码分析

Nacos作为SpringCloud Alibaba (SCA)中注册中心以及配置中心的组件。这里主要分析Nacos客户端与服务端之间注册,下线,心跳续约源码以及对Ribbon负载均衡的Nacos的具体实现。核心对外提供API接口类:对于客户端的使用其实很简单,只要引入spring-cloud-starter-alibaba-nacos-discovery包即可。这个包是一个springboot start项目,所以查看它的源码在上述的每一个AutoConfiguration都有自.

2020-07-03 00:25:34 2601 1

原创 Mysql数据数据库引擎InnoDB与MyISAM

序:什么是数据引擎?它的作用是什么?mysql的数据存储在磁盘与内存(内存中数据也是来源与磁盘,放在内存中为了加快查询效率)中,这些数据被mysql使用了不同的技术形成了不同的数据文本结构放入了磁盘中,在我们使用时这些技术通过不同的索引技巧,不同的锁定水平使得我们可以放心,便捷快速的使用这些数据。这些对应的技术就是数据引擎,数据引擎在mysql是一个核心组建,在每一张表的创建时,都会指定先对应...

2020-03-07 02:24:49 470

原创 Synchronized原理和jdk1.8后的优化

Synchronized关键字使用较多的形式如下所示:1:以synchronized同步代码块的形式synchronized(Object){ //代码}2:对一个方法进行synchronized声明,进而对一个方法进行加锁来实现同步。如下面代码public synchornized void test(){ //代码}上述中其实都是对对象加锁,对于第...

2020-03-07 02:21:07 11020 8

原创 算法数据结构-树(1)

此文包含树,二叉树,满二叉树,完全二叉树,二叉查找树(BST Binary Search Tree,也可以成为排序二叉树,有序二叉树),平衡二叉树(BBT),红黑树,B-树,B+树,B*树。这里暂时不包含各树的java实现。1:树2:二叉树每个节点最大只存在左右两个节点3:满二叉树对于一个深度为h的二叉树中,若节点的个数为2^h-1,则代表该树为一个满二叉树4:完全二叉树...

2020-03-03 11:31:14 256

原创 算法数据结构-Trie树

Trie树,又称为前缀树(因为某节点的后代存在共同的前缀,比如pan是panda的前缀),字典树,顾名思义它本事也是属于树这个数据结构体系中的一员,当然它也有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree等等。我们通常使用Trie来处理字符串匹配的,使用它可以解决在一组字符串集合中快速查找某个字符串的问题。它为...

2020-02-26 14:54:44 310

原创 Java实现LRU算法

LRU算法LRU(Least recentlyused)—最近最少被使用算法。在一些内存算法表现中若在一个内存有限的环境中,出现内存不足时为了保证程序的正常运行,会将一些价值较低的对象(如何来评定一个对象的价值的高低,对于LRU算法来说:如果数据最近被访问过,那么将来被访问的几率也更高,那么对应的价值就越高)进行清除,空出内存空间。计算机操作系统基础理论中有一个经典理论:最近使用的页面数...

2020-01-10 19:30:14 500

原创 Java中LinkedHashMap底层实现

目录序言:1:LinkedHashMap中的put(key,value)1.1:LinkedHashMap中对putVal()方法源码描述:1.2:LinkedHashMap中对节点操作方法源码描述:1.3:LinkedHashMap中afterNodeAcces()方法源码描述:1.4:LinkedHashMap中afterNodeInsertion()方法源码描述:...

2020-01-09 17:40:32 336

原创 Redis中info命令详解

目录序言:1:Server2:Clients3:Memory4:Persistence5:Stats6:Replication7:CPU8:Cluster9:Keyspace序言:redis中info命令可以很直观的通过各种维度属性描述信息告知我们当前redis的状态。我们可以通过此命令构建redis的实时监控系统。在上线之前的压测过程中,监控red...

2020-01-07 16:03:07 2583 3

原创 redis中内存碎片处理

目录序言:1:Redis中提供了哪些关于内存有关的命令(4.0之后)1.1:MEMOEY DOCTOR1.2:MEMOEY MALLOC-STATS1.3:MEMOEY PURGE1.4:MEMOEY STATS1.5:MEMOEY USAGE1.6:MEMOEY HELP2:什么时候需要进行内存清理2.1:我们通过命令行 INFO MEMORY查看redi...

2020-01-06 17:31:52 2575

原创 springboot2.x +redis使用和源码分析三(序列化器)

目录1:spring-redis中提供的默认序列化器1.1:StringRedisSerializer1.2:JdkSerializationRedisSerializer1.3:Jackson2JsonRedisSerializer1.4:GenericJackson2JsonRedisSerializer1.5:GenericToStringSerializer...

2020-01-01 14:38:14 432

原创 springboot2.x +redis使用和源码分析二(RedisTemplate)

目录序言:本文讲述RedisTemplate对象如何构建以及该对象对于redis提供的功能的支持1:定义RedisTemplate2:基本使用Ddemo3:RedisTemplate对Pipelined支持4:RedisTemplate对事务支持5:RedisTemplate对Lua语言支持5.1:使用内置字符串形式5.2:以文件的形式5.3:使用Lua的一些应...

2019-12-30 23:33:12 813 1

原创 springboot2.x +redis使用和源码分析一(springboot自动装配源码分析)

序言:个人感觉springboot的源码是web应用开源框架中写的最好的,观看它的源码可以学习它的编码风格,代码设计思想,如何做到给予使用者最好的使用体验,隐藏连接各应用组件的实现细节,极大降低类开发者实力的要求。查看springboot对各组件的自动装配实现,可以很详细的了解到spring对于组件核心类的初始化过程,以及核心类的作用以及之间的依赖关系。springboot提供的所有的自动...

2019-12-26 18:31:55 926

原创 自定义Dockerfile安装Redis单点

1:构建Dockerfile文件(Redis版本为5.0.4)FROM centosMAINTAINER [email protected]##暴露默认端口6379EXPOSE 6379ARG BB="redis-5.0.4"##安装清理RUN yum clean allWORKDIR /usr/local/software/redis##copy最新tar到目前位置...

2019-12-25 10:25:16 325

原创 docker-将ab测试工具打包镜像

这里我们使用docker的可迁移性将一些本地构建的docker镜像打包到生产环境中。1:本地构建docker镜像1.1 编写DockerfileFROM centosMAINTAINER [email protected] BB="httpd-2.4.41"##安装清理RUN yum clean allWORKDIR /usr/local/software/ab...

2019-12-24 11:27:16 1014

原创 Centos7通过iso镜像挂载本地yum源

话不多说直接开干:在官网中下载Centos对应版本的镜像下载地址:http://mirrors.cn99.com/centos/7.7.1908/isos/x86_64/1:单台服务机安装yum源1:将下载iso镜像包挂载到Linux中# 在/mnt目录创建挂载镜像的文件夹cd /mntmkdir cdRome# 将iso镜像挂载到/mnt/cdRome目录mount ...

2019-12-23 12:18:44 1220

原创 测试工具: Apache Benchmark(ab)安装

Apache Benchmark 简称ab,是apache里一个压力测试工具。安装ab一种直接安装apache server即可里面自带ab服务;另外一种不安装apache server 直接安装ab;这里是通过安装apache server 环境是centos71:先安装基础依赖环境:1.1:依赖基础环境yum install -y gcc gcc-c++yum instal...

2019-12-20 14:44:05 519

原创 Java垃圾回收机制理解一:垃圾回收算法

概叙:之前描述了Java内存区域的分布,我们知道了虚拟机栈,本地方法栈,程序计数器3个内存区域是各自线程私有的,和线程同生同死。而虚拟机栈中栈帧中分配的内存的区域是随着栈帧的出栈也会跟着消亡。所以这几块区域的内存我们不需要过多的考虑的问题。但是java中堆中和方法区中内存是共享的,在堆中创建的实例对象可能会被多个线程所共有,这时候某一个线程的消亡并不能决定该实例对象是否需要回收。那么我们就会产...

2019-12-18 18:57:07 279 1

原创 Java中引用的概念

序言:Java对于引用概念经历过两个时期,JDK1.2之前和JDK1.2之后。在JDK1.2以前Java对于引用的定义很传统,如果reference类型的数据中存储的数值指定是另外一块内存的起始地址,就称为这块内存代表着一个引用.这个定义过于狭隘,在整个应用中对象就存在两种状态存在引用或者不存在。这样会产生一定的问题,对于我们应用系统存在于一些对象只在初始化使用一次(却被其它对象引用),存在一...

2019-12-15 22:37:30 755

原创 Java中Unsafe类

Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出错的概...

2019-12-11 12:02:50 265

原创 Java中的逃逸分析

1:JIT(Just In Time Compiler即时编译器):虚拟机为了提高执行热点代码(对于某个方法活代码块执行频率非常频繁时,认定这些代码时热点代码)的效率,在运行时会将这些代码编译为与本地平台相关的机器码,并进行各种层次优化,完成这个任务的编译器称为即时编译器。2:对象逃逸: 它并不是一种直接优化代码的手段,而是为其它优化手段提供依据的分析技术(通过此技术可以判定哪些代码可以被优化...

2019-12-10 21:24:08 1078

空空如也

空空如也

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

TA关注的人

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