自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(346)
  • 资源 (2)
  • 收藏
  • 关注

原创 Java volatile的性能分析

volatile通过内存屏障来实现禁止重排序,通过Lock执行来实现线程可见性,如果我们的程序中需要让其他线程及时的对我们的更改可见可以使用volatile关键字来修饰,比如AQS中的state所以在一个线程写,多个线程读的情况下,或者是对volatile修饰的变量进行原子操作时,是可以实现共享变量的同步的,但是i++ 不行,因为i++ 又三个操作组成,先读出值,然后再对值进行+1 ,接着讲结果写入,这个过程,如果中间有其他线程对该变量进行了修改,那么这个值就无法得到正确的结果。今天我们讨论的重

2021-03-19 15:20:25 742 2

原创 伪共享以及缓存行填充

我们都知道CPU的速度是很快的,而目前的内存技术跟CPU还存在着数量级的差距,所以存在差距就有缓存的存在,CPU的L1, L2,L3就是这么来的可以看到CPU的L1,和L2缓存是核心私有的,而L3是核心共享的,可以打个比喻,一个宿舍4个人,L1就相当于是每个人的书包,空间不大,但是在自己身边,取东西放东西都很快,L2就相当于是自己的桌子,每个人都在自己桌子上放东西,空间也不是很大,取东西放东西也要比在自己身边的书包慢一点,而宿舍有个阳台,这个是公共的,这相当于是L3,都可以放,但是要比在桌子上慢一点

2021-03-18 14:48:25 203 2

原创 Java的四种引用类型及用法实例(本地缓存,ThreadLocal,DirectByteBuffer实现分析)

Java的对象都是在堆中,我们程序中使用对象都是用的引用,通过引用来对对象进行修改,传递等,也就是说,jvm帮我们完成了对象的内存申请,创建,我们只需通过引用来使用对象就可以了,这样屏蔽了很多复杂的操作,那么java中引用有四种类型:强引用:我们最常用的就是这种引用,比如Object obj = new Object(),那么obj就是强引用,如果一个对象具有强引用,那就类似我们经常穿的衣服啊等必不可少的生活用品,我们肯定不会把他扔掉,同样jvm的垃圾回收器也不会回收它。当内存空间不足的时候,java虚

2020-11-26 13:55:02 418

原创 基于OAuth2微服务的登录模块(数据库服务build-data)

在这次的微服务设计中,我将数据库的操作集中到了一起,其他微服务获取数据都是通过feign调用获取,这样的好处是数据集中管理,便与数据处理和管控,因为只有一个数据库,所以也没有必要每个服务都配置相同的数据库配置,坏处就是每次调用都需要通过远程调用,增加了网络成本,以及我们的数据库访问接口都对外开放,这样也增加了风险(这个就需要授权来控制)先看下工程结构:pom文件内容如下<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi

2020-11-16 14:42:11 327

原创 基于OAuth2微服务的登录模块(授权中心服务build-auth)

上一篇文章介绍了关于公共模块,在里面我们配置了Token的存储方式,为什么要在公共模块呢,因为在其他服务,比如网关,我们如果想校验token,就得使用tokenStore,那么每一个请求我们都得发一次请求到auth,但是有了tokenstore,不管是jwt还是redis,我们都可以直接校验。首先要明白,oauth不管是密码模式还是客户端模式,都是需要客户端信息的,这里呢我们定义了一组客户端信息保存在数据库CREATE TABLE `build_auth_client_info` ( `id`

2020-11-09 10:37:17 515 1

原创 基于OAuth2微服务的登录模块(common模块)

这一章介绍下公共的依赖模块build-common,首先贴出pom依赖<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <

2020-11-06 17:46:47 717

原创 基于OAuth2微服务的登录模块(总体介绍)

在系统比较庞大的时候,微服务便成了很多项目的最佳选择,因为他便与开发,便与维护,并且可以随意增加节点数量,提高并发量,提高系统的性能,然而他的缺点也很多,1.服务多了,维护便是个问题,2.服务多了,链路多了,问题定位也是个问题 3.服务有很多,那么我们的性能分析也成了问题,那么多的服务,我怎么知道哪个服务性能慢呢但是呢,以上的缺点都有解决方案,我们可以后面再说,接下来说的是登录模块,因为不管什么系统,登录是必须的,权限控制是必须的,既然是微服务,那么以前的那一套直接从数据库取用户信息验证密码的那一.

2020-11-05 14:24:19 750

原创 React前端功能测试覆盖率统计-覆盖率统计

前面通过一些依赖,配置完成了覆盖率数据的产生,运行成功后我们可以通过控制台window.__coverage__查看覆盖率数据,但是我们怎么把window.__coverage__采集到我们需要分析的系统里面呢,在不改动原工程源码的情况下貌似只有chrome插件可行,通过定时任务的话,定时任务只有加载到该js的时候才执行,使用修改istanbul源码写文件方式的话,文件也是存放在客户端本地的,综合下来,只有chrome插件最为合适在谷歌插件开发中,https://www.cnblogs.com/liux

2020-11-04 13:50:22 1532

原创 React前端功能测试覆盖率统计-插桩

1.React工程插桩教程对于前端的覆盖率统计,单元测试的可以i通过jest和Enzyme配合进行单元测试并统计覆盖率,但是现在说的覆盖率主要是指功能测试的覆盖率。而对于功能测试的测试覆盖率,肯定是需要进行代码插桩然后统计代码执行的密度,进行覆盖率统计,而插桩的库主流的就是istanbul一,对于node项目可以使用istanbul-middleware来进行插桩以及覆盖率统计,可以参考样例https://github.com/chenhengjie123/middleware-browser-co

2020-10-28 17:47:45 2206

原创 Java从开发到架构(虚拟机 一)

一,什么是虚拟机 java虚拟机无疑是java权杖,承担着解释执行,垃圾回收,内存管理等等,有了他,我们使java同时拥有了跨平台性和优秀的执行性能,我们只需要实现自己的业务逻辑,而不需要管理内存,我们不需要关系程序运行的环境,我们也不需要关心程序的内存释放。二,从编译执行到解释执行...

2020-10-16 14:37:07 124

原创 Java从开发到架构(前言)

一,先简单介绍下java java是一门面向对象语言,什么是面向对象,就是说,java里面的一切都是通过对象来进行交流,计算,处理,这跟面向过程(类似C,C++)不一样,比如说我要去上学这个动作,用C++ 表示怎么写呢:我 -> 走路 -> 到了学校 ;如果用java则是:我(一个对象),学校(一个对象),马路(一个对象),然后我通过走这个方法,使用马路这个对象传输到了学校对象。 同时,java也是跨平台的,我们都知道当前主流操作...

2020-10-16 14:10:47 101

转载 docker-compose搭建spark集群,包括hdfs集群

我们经常会遇到这样一个情况,想搭建一个简单的大数据环境用来运行一些小工程小项目或者仅仅是用来学习和完成作业,然而spark集群和hdfs集群环境会消耗很多时间和精力,我们应该关注的是spark应用的开发,快速搭建整个环境,从而尽快投入编码和调试,今天我们就使用docker-compose,极速搭建和体验spark和hdfs的集群环境。先创建一个文件夹用来存放配置文件,集群的安装路径也会是这个文件夹,所以想好放在哪里比较好,我的路径是:/home/sparkcluster_hdfs。

2024-03-15 15:04:16 52 1

转载 java 堆外内存的回收方法

什么时候才是合适的时机呢?这个是很有可能的...所以堆外内存的垃圾回收也很重要。Direct Memory是受GC控制的,例如ByteBuffer bb = ByteBuffer.allocateDirect(1024),这段代码的执行会在堆外占用1k的内存,Java堆内只会占用一个对象的指针引用的大小,堆外的这1k的空间只有当bb对象被回收时,才会被回收,这里会发现一个明显的不对称现象,就是堆外可能占用了很多,而堆内没占用多少,导致还没触发GC,那就很容易出现Direct Memory造成物理内存耗光。

2024-02-28 10:39:47 144

转载 SpringBoot远程配置实现

传统开发微服务开发中,我们通常是将系统的配置(数据库,缓存服务器)在application.properties中配置,但随着系统规模的扩大,项目成员增多,越来越多的人更改配置文件,开发、测试、生产环境分离,因配置产生的问题越来越多。为了避免因配置文件的导致的问题产生,配置服务应运而生。在分布式系统中,配置中心是一个独立的服务部件,作用是专门为其他服务提供系统启动所需的配置信息,保证系统正确启动。配置中心有哪些功能呢?

2024-01-04 10:08:39 135 1

原创 基于Raft解决“幽灵复现”问题

假设C成为leader后,Leader运行过程中会进行副本的修复,对于A来说,就是从log index为6的位置开始,C将会把自己的index为6及以后的log entry复制给A,因此A原来的index 6-10的日志删除,并保持与C一致。首先,我们聊一下Raft的日志恢复,在 Raft 中,每次选举出来的Leader一定包含已经Committed的数据(抽屉原理,选举出来的Leader是多数中数据最新的,一定包含已经在多数节点上Commit的数据),新的Leader将会覆盖其他节点上不一致的数据。

2023-10-25 09:19:18 155

转载 Raft 的 Figure 8 讲了什么问题?为什么需要 no-op 日志?

具体流程是在 Leader 刚选举成功的时候,立即追加一条 no-op 日志,并立即复制到其它节点,no-op 日志一经提交,Leader 前面那些未提交的日志全部间接提交,问题就解决了。那这里不就阻塞了吗?,Leader 查到日志有记录但又不能回复 1 给客户端(因为按照约束这条日志未提交),线性一致性要求不能返回陈旧的数据,Leader 迫切地需要知道这条日志到底能不能提交。只有等到新的请求进来,超过半数节点复制了 1-3-5 后,term=3 的日志才能跟着 term=5 的一起提交。

2023-10-25 08:44:56 136

原创 HTTPS 加密全过程

加密协议以前是SSL,现在都是TLS, 而证书现在大多数都是SSL证书。

2023-10-11 22:15:48 1029

原创 SSTables和LSM-Tree

LSM-Tree是基于SSTables的:在内存中维护两个Tree(交替工作),当Tree的大小达到一定的阈值之后,写操作转移到另一个tree,并将当前tree写入磁盘,形成一个SSTables实例,当读的时候,先从内存实例中查找,然后依次从磁盘的SSTables查找,并且写的时候为了避免宕机,会先写一个顺序预写日志(这也是Rockes和Level-DB的视线)

2023-09-12 10:16:33 280

原创 Eureka配置

【代码】Eureka配置。

2023-08-16 11:28:11 152

原创 docker-compose部署Minio

1. 关于volumes,因为我这里是使用的docker-desktop,windows的磁盘文件映射到linux内部,这样导致minio请求磁盘信息的时候有问题,所以我们直接使用内部目录,会导致容器销毁后文件丢失,但是测试不影响。2. 关于command:这里我们是模拟四个节点 每个节点一个驱动一个磁盘 , 所以这里是http://minio{1...4}/miniodisk 如果每个驱动2个磁盘,直接可以http://minio{1...4}/miniodisk{1...2}

2023-06-30 11:11:36 345

原创 docker-compose部署Redis主从+哨兵

这里分别起了三个Redis实例和三个哨兵实例,实测数据同步和master挂了之后slave自动成为master通过,这里需要注意的是,command 为覆盖dockerfile里面的command命令,在redis:4的dockerfile中启动命令为执行脚本: /usr/local/bin/docker-entrypoint.sh 但是不好传递参数,所以我们使用了覆盖的方式。3. redis-slave2.conf: redis slave2 的配置文件:内容同上。

2023-06-28 14:08:21 326

转载 SQL 语句的加锁方式

美团问数据库应该是非常多的,尤其喜欢考手写 SQL 然后问你这个 SQL 语句上面加了哪些锁,你会发现其他厂面试基本很少会这样考,所以很多小伙伴遇到这种问题的时候都是一脸懵逼,这篇文章就来详细总结下 InnoDB 存储引擎中的行锁的加锁规则,并辅以实例解释。首先众所周知,InnoDB 三种行锁:Record Lock(记录锁):锁住某一行记录Gap Lock(间隙锁):锁住一段左开右开的区间Next-key Lock(临键锁):锁住一段左开右闭的区间哪些语句上面会加行锁?

2023-06-26 17:55:28 1114

原创 Kafka学习笔记

4. 如果产生了消息积压,或者是吞吐量不够,可以通过增加主题的分区来解决,但是分区也不是越多越好,如果超过了一定的阈值,可能会导致不升反降,所以需要对硬件资源做一个吞吐量的测试,来找到一个合适的分区阈值区间,分区数过多也可能会导致leader宕机的时候不可用时间变得很长(选主过程)在均衡也可能会导致消息的重复消费。4. 可以根据seek方法进行消息回溯。1. kafka可以配置自动创建主题,如果收到一个未创建的主题消息,会自动创建默认分区数,默认副本数的主题,但是不推荐,推荐使用脚本创建。

2023-06-07 10:11:48 592

原创 Mysql的可重复读解决了幻读问题吗

针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读。针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读。我举例了两个发生幻读场景的例子。第一个例子:对于快照读, MVCC 并不能完全避免幻读现象。因为当事务 A 更新了一条事务 B 插入的记录,那么事务 A 前后两次查询的记录条目就不一样了,所以就发生幻读。

2023-05-07 13:52:45 1558 1

转载 Docker 搭建Spark集群

jdk 从oracle官网进行下载,复制相应下载链接.我是在本地下载后上传到linux上,再docker cp到容器里.在linux上命令如下。生成新镜像,此处取名为my-ssh-centos7。配置hdfs-site.xml,设置副本数和NameNode、DataNode的目录路径。参考csdn等文章,利用docker安装spark。用虚拟化容器模拟出三个节点。再度进入容器后,执行下列操作,设置ssh免密登录。配置mapred-site.xml。配置yarn-site.xml。进入容器后,进行下列操作。

2023-04-10 22:39:19 886

原创 Hive和Hadoop

2023-04-02 23:09:11 88

原创 Swarm网络分析(2)

那么这里的ingress网络,是一个overlay网络,overlay是一个覆盖网络,基于linux的vxlan在三层网络上组成的二层网络,我们看到docker_gwbridge的驱动是local,也就是说他是一个本地的网络设备,可以看到,他的网段是10.255.0.0/16而接入他的有两个容器,一个是ingress-box,一个是web.2的一个容器,他的ip是10.255.0.8,下面的peers是集群的所有节点。

2023-03-12 12:42:35 311

转载 JVM桥接方法

根据操作数栈的信息以及invokevirtual所引用的方法签名信息,我们不难得出这条指令要去执行person引用所指向的对象中的一个方法名为get,方法参数为Number,返回值为Number的方法,但是请注意,我们的Son对象中没有这样的一个方法,我们在Son中重写的方法是这样的。桥接方法到底桥接的什么?总的来说:桥接方法就是JVM无法通过方法签名来匹配多台的方法,比如继承,泛型,所以在实际调用中会调用桥接方法,桥接方法保持跟父类一样的参数和签名,然后桥接方法调用我们自己的方法,也就是被桥接方法。

2023-03-02 11:14:09 159

原创 Sofa-jraft的Rpc调用客户端分析

也就是说BoltRpcClient的大部分操作其实是通过RpcClinet来完成的,在创建rpcclient之后调用了init然后创建了rpc的线程池,我们看下init方法。startup主要的部分就是设置了链接管理器,这里的链接管理器配置了ConnectionFactory,这个就是具体生产连接的,后面看。父类是AbstractClientService:实现对链接的管理的实现,以及请求发送的方法实现,实现接口ClientService: 定义链接,链接检查,断连,以及发送请求的方法。

2023-02-23 18:34:36 359

原创 Sofa-jraft的Rpc调用服务端分析

初始化了连接事件监听器,这个里面就是一个map,然后可以添加事件监听的处理器,初始化userProcessors, codec 是一个编码和解码器的工厂,可以获取编码器和解码器,然后他调用了父类的构造器super(port);解码器的流程是,先解析出协议的版本,将协议code写入channel的attribute,然后重置读指针,获取版本对应的解码器进行解码,而解码的流程也比较简单,逐个获取各个数据,根据长度将数据填入对象中。

2023-02-22 17:34:16 510

原创 Kafka的日志同步

上图中,如果此时三个副本都在ISR集合中,那么此时他们的LEO,分别为9,7,6 ,而HW则为6,只有在HW之前的消息才是消费者可见的。现在,生产者一直往leader(带阴影的方框)写入消息,某一时刻,leader的LEO增加至5,并且所有副本的HW都还为0。fllower副本收到leader副本返回的拉取结果,将消息追加到本地日志中,并更新日志的偏移量信息。leader副本所在的服务器读取本地日志,并更新对应拉取的follower副本的信息。这个过程中,我们分析下LEO和HW的变化。

2023-02-16 14:31:23 366

转载 Seata的全局锁

我们知道 Seata 的事务是一个全局事务,它包含了若干个分支本地事务,在全局事务执行过程中(全局事务还没执行完),某个本地事务提交了,如果 Seata 没有采取任务措施,则会导致已提交的本地事务被读取,造成脏读,如果数据在全局事务提交前已提交的本地事务被修改,则会造成脏写。由此可以看出,传统意义的脏读是读到了未提交的数据,Seata 脏读是读到了全局事务下未提交的数据,全局事务可能包含多个本地事务,某个本地事务提交了不代表全局事务提交了。我们分别在执行、提交的过程都做了什么。

2023-02-15 15:27:24 1046

原创 K8s为何需要Pod

不过这里的war包容器不是一个普通的容器,而是一个Init Container类型的容器,在Pod中,Init container定义的容器,都会比spec.container定义的用户容器先启动,并且Init Container容器会按顺序逐一启动,知道他们都启动退出了,用户容器才启动,这里war包容器启动后将war包拷贝到一个目录下,然后tomcat容器共享同一目录,就可以获取到这个war包了,而这里Init Container容器就扮演了一个sidecar的角色。二,统一Pod中容器的关系。

2022-11-17 15:31:57 457

原创 容器网络原理

我们创建了一个veth-pair设备后,我们两端分别有两个网段的ip,我们从ip1ping到ip2的时候,如果没有相应的路由规则,那么主机会不知道该吧包发送到哪个设备,我们创建路由后协议栈就知道该发往veth-pair设备,但是发送后vethpair需要目的地的mac地址,我们的ip2收到arp请求之后,回复mac地址,但是它回复的请求也不知道该发送到哪个设备,所以也需要创建路由来匹配。calico是通过配置路由规则来实现一个不同主机间的通信,他的优势是没有封包解包,比较高效。......

2022-07-21 17:17:53 470

原创 K8S笔记之Pod思想

举例说明:War包与Web服务器现在有—个JavaWeb应用的WAR包’它需要放在TOmcat的webapps目录下运行°假如只能用Docker来做这件事’那该如何处理这个组合关系呢?第一种方法是把WAR包直接放在TOmcat镜像的webapps目录下’做成_个新的镜像运行起来。可是’这时如果要更新WAR包的内容’或者要升级Tomcat镜像’就需要重新制作—个新的发布镜像,非常麻烦°另一种方法是压根儿不管WAR包’永远只发布一个TOmcat容器。不过’这个容器的webapps目录必须声明—个ho

2022-07-11 17:40:58 420 1

原创 K8S笔记只Pod讲解

Pod:Pod是一个逻辑概念,也就是说,K8s真正处理的还是宿主机操作系统上Linux容器的Namespace和Cgroups,并不存在所谓的Pod的边界或者隔离环境, 具体的说,Pod里的所有容器都共享一个Network Namespace,并且可以声明共享同一个Volume,具体做法是,Pod需要使用一个中间容器,叫做Infra容器。这个Pod中 Infra容器永远是第一个被创建的容器,用户定义的其他容器则通过Join Network Namespace的方式与Infra容器关联再一起,这个I

2022-07-11 17:12:51 229

原创 Mysql间隙锁

Mysql的间隙锁是为了在RR级别解决幻读问题而引入的,间隙锁是gap lock ,而mysql 用的是间隙锁和gap锁的结合,也就是next-key lock,而在不同的索引上,mysql加锁的方式也不一样:唯一索引上:如果条件为=5 ,间隙锁退化为行锁,也就是只会锁住条件中的那一行对象,如果是>5,则会添加一个[5, ∞) 的一个next-key锁,5这个行锁和(5,∞)这个间隙锁普通索引上:如果条件为5,那么mysql会通过5查询左右两边的一个间隙,也就是比5小的第一个值和比5大的第一个值,然

2022-06-28 18:06:05 5478 3

原创 Feign & Eureka & Zuul & Hystrix 流程

流程图

2022-06-27 07:34:44 116

转载 JVM 的指针压缩

在介绍完关于内存对齐的相关内容之后,我们来介绍下前边经常提到的压缩指针。可以通过JVM参数开启,当然默认是开启的。在本小节内容开启之前,我们先来讨论一个问题,那就是为什么要使用压缩指针??假设我们现在正在准备将32位系统切换到64位系统,起初我们可能会期望系统性能会立马得到提升,但现实情况可能并不是这样的。在JVM中导致性能下降的最主要原因就是64位系统中的。在前边我们也提到过,64位系统中对象的引用以及类型指针占用也就是8个字节。这就导致了在64位系统中的对象引用占用的内存空间是32位系统中的两倍大小,因

2022-06-22 17:17:53 723

转载 Linux进程空间地址划分

以Linux 64位系统为例。理论上,64bit内存地址可用空间为0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF(16位十六进制数),这是个相当庞大的空间,Linux实际上只用了其中一小部分(256T)。Linux64位操作系统仅使用低47位,高17位做扩展(只能是全0或全1)。所以,实际用到的地址为空间为0x0000000000000000 ~ 0x00007FFFFFFFFFFF(user space)和0xFFFF800000000000 ~ 0xFFFFFFFFFFF

2022-06-18 12:04:30 1096

springboot https 配置

springboot https 配置

2022-09-08

linux & JVM内存结构分析

linux & JVM内存结构分析

2022-06-21

javase api

javase api

2015-07-21

空空如也

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

TA关注的人

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