- 博客(53)
- 资源 (1)
- 收藏
- 关注
原创 特别详细的Spring Cloud 系列教程2:微服务网关gateway的启动
在比较多的教程和书籍里,spring cloud的微服务网关用的Zuul。然而,zuul已经不被官方提倡,现在提倡用的是spring cloud gateway。因为gateway的整体性能表现比zuul要好。
2024-04-08 19:24:17 727
原创 特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动
Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中,搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建Eureka Server。我们引入spring cloud的依赖和eureka的依赖。 <dependencyManagement> <!-- spring cloud版本--> <dependencies> .
2024-04-07 23:11:00 1039 1
原创 zookeeper如何管理客户端与服务端之间的链接?(zookeeper sessions)
zookeeper客户端与服务端之间的链接用zookeeper session表示。zookeeper session有三个状态:CONNECTING, ASSOCIATING, CONNECTED, CONNECTEDREADONLY, CLOSED, AUTH_FAILED,NOT_CONNECTED(start时的状态)1、CONNECTING 。 表明客户端正在与服务端建立连接。当客户端的句柄正在建立时,在java中,也就是ZkClient对象在创建后,到与服务端建立起...
2024-03-31 10:47:15 1288 1
原创 深入理解zookeeper
如果想要深入理解zookeeper,并在面试中取得更好的表现,可以看下面的文章,都是偏面试向的角度写的。欢迎关注~,持续产出更优质的内容。
2024-03-31 09:41:12 716
原创 一个写请求到达zookeeper集群后发生什么?
一个写请求到达zookeeper集群后发生什么?1)使用一个单一的主进程(Leader)来接收并处理客户端的事务请求(也就是写请求),并采用了Zab的原子广播协议,将服务器数据的状态变更以 事务proposal (事务提议)的形式广播到所有的副本(Follower)进程上去。2)保证一个全局的变更序列被顺序引用。Zookeeper是一个树形结构,很多操作都要先检查才能确定是否可以执行,比如P1的事务t1可能是创建节点"/a",t2可能是创建节点"/a/bb",只有先创建了父节点"/a",才能创建子
2024-03-31 09:22:15 138 1
原创 三分钟深入理解zab协议的Leader选举过程
之前说过zab协议Leader的四个阶段:选举、发现、同步、广播。选举:选出新Leader发现:Follower发现新Leader同步:Leader同步Follower数据(恢复已提交数据和丢弃未提交数据)广播:即zookeeper集群恢复正常,可以对客户端的事务请求进行广播。这是概念上的四个阶段,在java的实现版本中,只有三个阶段,分别是:选举阶段、恢复阶段、广播阶段。实际上,恢复阶段可以视作是同步阶段,省略了发现阶段。这是因为zookeeper采用的Fast Leader
2024-03-30 12:26:51 932
原创 深入理解zab协议崩溃恢复的过程
zab要求每个 Leader 都要经历三个阶段:发现,同步,广播。因此,当新leader选举出来后,也要经历这三个阶段。**发现**:要求zookeeper集群必须选举出一个 Leader 进程,同时 Leader 会维护一个 Follower 可用客户端列表。将来客户端可以和这些 Follower节点进行通信。**同步**:Leader 要负责将本身的数据与 Follower 完成同步,做到多副本存储。这样也是提现了CAP中的高可用和分区容错。Follower将队列中未处理完的请求消费完成后...
2024-03-30 12:24:22 1226 1
原创 java泛型详解
java泛型详解大部分的泛型文章只涉及到泛型类与泛型方法等一些部分,在这一篇文章中,尽量对泛型有一个详细全面的基础描述,介绍实现自己的泛型需要了解的各种知识。
2024-03-24 18:33:12 841
原创 idea打包war包部署到tomcat以及访问路径问题
但是问题来了,这样配置的时候,部署到tomcat上能找到文件,但是本地idea开发启动tomcat调试之后,会找不到文件。并且做到与部署到tomcat时的文件路径一致,不用在部署到tomcat上时,还要再修改前端页面的地址。这样就算配置完成,点击run执行之后,就到前面的output directory设置的文件夹里找到war包就行了。如果application context只是“/”的话,那么就相当于所有的文件放在tomcat的webapp下面,直接通过localhost:8080/文件就能访问。
2024-03-24 18:22:10 731
原创 读懂zookeeper一致协议:zab原子协议
zookeeper既然作为一个分布式协调中心,那么它要考虑以下几个问题:1、如何保证写操作的原子性,即要么写入成功,要么写入失败?2、当集群崩溃恢复时,如何恢复已提交数据?3、如何保证集群的高可用?
2024-03-24 18:00:37 1118 1
原创 redis key中的“{}“是啥玩意
有一天,在代码中执行redis 的rename命令的时候,突然返回了这个错误这个错误的意思是:rename前的key和rename后的key不在同一个slot。我们知道,在redis集群中,有每个redis实例负责一部分槽。redis会根据key的hash计算出这个key命中哪个slot,从而将key分配到对应的实例中去。当rename前的key和rename后的key计算出来的hash命中了不同的slot后,redis发出了错误。
2024-03-19 21:04:42 562 1
原创 zookeeper快速入门(合集)
zookeeper作为一个分布式协调框架,它的创建就是为了方便或者简化分布式应用的开发。除了服务注册与发现之外,它还能够提供更多的功能,但是对于入门来说,看这一篇就够了
2024-03-19 20:02:13 1905
原创 从头捋完事务(合集)
从大众知识点到原理再到具体实现,争取把一个知识点从头到尾完整讲下来,足以应付面试与工作。让读者读完之后能够有一种:“这个知识我看这一篇就够了”的感觉是本系列最大愿望。这两周把事务有关的写完了,相信完整看下来能对事务有一个系统的认知,在这里整理一下顺序,以便读者阅读。接下来会继续更新其他方面,希望能对更多的知识点从头讲到尾,欢迎关注,也欢迎关注同名公众号私信交流~。希望下面的flag能做到。
2024-03-18 23:37:43 559
原创 如何解决MySQL死锁(看懂MySQL锁日志)
有时候系统在生产运行着,会突然爆出这个时候每个人都会很紧张,因为死锁会影响DB性能,严重时甚至拖垮整个系统。在实际的环境中,很多服务会共用一个数据库,一旦数据库挂了,基本就是P0事故。那么,死锁发生时,我们如何定位到死锁发生的SQL?
2024-03-18 23:20:51 3493
原创 zookeeper快速入门三:zookeeper的基本操作
在zookeeper的bin目录下,输入./zkServer.sh start和./zkCli.sh启动服务端和客户端,然后我们就可以进行zookeeper的基本操作了。如果是windows,请参考前面章节。
2024-03-17 22:55:11 1162
原创 zookeeper快速入门五:用zookeeper实现服务注册与发现中心
同时,我们注册一个监听事件,监听节点的状态变化。当user服务出现故障或其他因素而下线时,/services/user节点会被删除,zookeeper server会通知到监听这个节点的客户端,从而使客户端做出自己的响应,同样的,当user服务上线或地址修改,客户端也能收到通知。比如,我们注册一个user服务,服务地址是localhost:8080,那么我们就在/services下面建立一个user子节点,子节点数据为user服务的真实url地址,比如localhost:8080,子节点类型为临时节点。
2024-03-17 22:54:02 940
原创 zookeeper快速入门四:在java客户端中操作zookeeper
系列文章:zookeeper快速入门一:zookeeper安装与启动-CSDN博客zookeeper快速入门二:zookeeper基本概念-CSDN博客zookeeper快速入门三:zookeeper的基本操作先启动zookeeper服务端。在maven引入zookeeper依赖。<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>zookeepe
2024-03-17 22:52:22 983
原创 MySQL实现事务隔离的秘诀之锁
InnoDB有三种锁:记录锁、间隙锁、临键锁。记录锁只锁住某个具体节点;间隙锁锁住区间但不包含记录本身;临键锁=记录锁+间隙锁,主要用来解决不可重复读的问题诚意满满之MySQL实现事务隔离的秘诀:锁与MVCC。
2024-03-17 00:18:54 1078
原创 zookeeper快速入门二:zookeeper基本概念
上图中的每个节点在zookeeper中称为znode。在zookeeper推荐在znode中存储的数据不超过1M,这是从性能和效率的角度出发。zookeeper作为协调分布式应用的服务中心,一般是存储状态信息、配置信息和本地数据等等。从设计的初衷上看也不是为了存储大量数据准备的。如果真的要存储大数据,应该把数据存储在别的地方比如数据库上,然后在znode上存储他们的引用。znode在每次更新数据时,都是全量更新,直接覆盖以前的值,不存在追加或者修改其中某个地方的操作。读取数据也是全部读取。
2024-03-16 23:46:05 967
原创 zookeeper快速入门一:zookeeper安装与启动
本文是zookeeper系列之快速入门中的第一篇,欢迎大家观看与指出不足。写在前面:不影响教程,笔者安装zookeeper用的是WSL(windows下的linux子系统),当然你想直接在windows上用zookeeper也是可以的。如果你也想用wsl,可以参考这篇文章。
2024-03-16 23:45:18 2773 1
原创 什么是capturing lambda
里引用到了外部变量bb。那么实际上在虚拟机翻译的时候,首先会在lambda所代表的内部类里生成一个引用,这个引用在内部类构造的时候引用了外面的变量bb(lambda表达式其实就是一个匿名内部类)。也就是说在内部类里我们多了一个bb的引用副本,那么在循环的时候,循环多少次就会多几个不必要的bb引用副本。这也是为什么disruptor文档说“(高性能队列)的时候,它的官方文档有这样一段话:(重点部分已加粗)从上面的代码我们可以看到在一个lambda函数。”,这会增加额外的不必要的垃圾。
2024-03-14 20:52:54 591
原创 诚意满满之MySQL实现事务隔离的秘诀:锁与MVCC
快照读与当前读,前者是乐观的并发控制思想,后者是悲观的体现。MVCC,多版本并发控制,是快照读的一种实现
2024-03-14 20:49:21 1319
原创 springboot换日志框架后爆SLF4J: Class path contains multiple SLF4J bindings的解决办法
由于springboot-starter-logging的maven配置是springboot自动配置的,不是我们项目的。所以我们看依赖springboot-starter-logging的包springboot starter,双击点进去,就是我们项目的pom文件了。出现这种错误时,项目还能继续运行 ,但是我们会发现log4j.xml的配置并不生效,日志也没有输出到文件里面。如果还是报错冲突,那就说明项目还有其他依赖也引入了日志框架,这时我们就需要一步步排查了。我们可以在pom.xml的。
2024-03-12 23:21:45 1240
原创 诚意满满之MySQL如何实现原子性、持久性
事务日志的概念1、为了优化数据更新速度,数据只更新到内存池,内存池定时刷回磁盘。为了防止更新丢失,数据更新前先写一条事务日志。2、事务日志是顺序写入,速度比随机写入快很多redolog1、已经提交的事务通过redolog恢复数据2、数据存储也分为buffer和file,提供了三种不同的配置将数据从buffer刷到file:延时写、实时写实时刷、实时写,延迟刷3、redolog逻辑是是环形写入,通过checkpoint清理过期的redologundolog。
2024-03-12 23:19:29 1718
原创 jsp中${xxx}代表什么
{user.name}<====>User user = (User)request(搜寻范围).getAttribute(user);其搜寻的范围依次是:page、request、session、application。从当前页面起开始搜寻 user对象,然后获取改对象的name属性值。目的是为了获取{}中指定的对象(参数、对象等)的值。jsp中${}----是EL表达式的常规表示方式。它在jsp+servlet的编程中经常使用。如果未搜索到,即会返回null值。
2024-03-11 19:26:24 526
原创 诚意满满之讲透事务隔离级别
这一篇讲一下事务隔离。上一篇没看也没关系,知识点是独立的。?首先我们先明白一件事:为了追求高性能,许多程序在设计之初往往会考虑加入并发,一旦加入并发,又面临并发带来的种种问题,为了解决并发问题,又引入了各种各样的机制。同样的,事务隔离是数据库解决并发问题的一种机制这时候*大的举手了:能不能既要快,又安全?这种既要又要且要,答案是有,只不过不是现在。如果未来的科技发展能够使得数据的读取速度跟上cpu的处理速度,那么并发将不复存在,并发带来的许多复杂问题也将迎刃而解。
2024-03-11 19:24:12 1006
原创 诚意满满之讲透事务
诚意满满系列每一篇都是精挑细选,从大众知识点到原理再到具体实现,争取把一个知识点从头到尾完整讲下来,足以应付面试与工作。让读者读完之后能够有一种:“这个知识我看这一篇就够了”的感觉是本系列最大愿望。
2024-03-10 11:50:53 1026
原创 三分钟明白zookeeper集群中的三种角色Leader、Follower和observer
像Mysql的主从模式会分master主节点和slave从节点一样,在zookeeper集群中,节点也有不同的角色,承担着不同角色。zookeeper有三种角色:老大Leader(领导者) 2、Follower (跟随者) 3、Observer(观察者)。其中,Follower和Observer归类为Learner(学习者)按重要性排序是Leader > Follower > Observer老大领导者Leader。Leader在集群中只有一个节点,可以说是老大No.1,是z..
2020-10-13 00:13:00 17507
原创 zookeeper快速入门五:用zookeeper实现服务注册与发现中心
经过前面四章的讲解,我们已经对zookeeper建立起初步的概念,这篇文章就来做一个小小的实践,用zookeeper实现一个简单版的服务注册与发现中心。zookeeper的一个常见功能就是作为服务注册与发现中心。我们先创建一个节点/services。 Stat stat = zkClient.exists("/services",false); if (stat == null ){ zkClient.create("/services",
2020-10-09 23:49:26 1770
原创 zookeeper快速入门四:在java客户端中操作zookeeper
先启动zookeeper服务端。在maven引入zookeeper依赖。<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>zookeeper</artifactId> <version>3.3.1</version></dependency>org.apache.zookeeper.Zookeeper是
2020-10-09 00:27:22 478
原创 zookeeper快速入门三:zookeeper的基本操作
在zookeeper的bin目录下,输入./zkServer.sh start和./zkCli.sh启动服务端和客户端,然后我们就可以进行zookeeper的基本操作了。如果是windows,请参考前面章节zookeeper快速入门一:zookeeper安装与启动目录一、节点的增删改查二、zookeeper的其他命令2.1 ls path:列出path下的文件2.2stat path:查看节点状态2.3 ls2 path:列出path节点的子节点及状态三、其他一...
2020-10-07 23:28:40 2234 1
原创 zookeeper快速入门二:zookeeper基本概念
本文是《zookeeper你想要的全都有系列》之快速入门中的第二篇,欢迎大家观看与指出不足。一、zookeeper的存储结构zookeeper的存储结构极其类似于文件系统,都是树形结构,如下图所示。与文件系统不同的是,文件系统分为目录和文件,目录是没有数据的。而zookeeper则全部称为节点(znode),每个节点既能保存数据又有孩子节点。zookeeper的根节点都是“/"。每一个节点(znode)的命名空间(类似于java中的包名)都由其路径组成。zookeeper称上面.
2020-10-05 22:48:56 2523
原创 zookeeper快速入门一:zookeeper安装与启动
本文是《zookeeper你想要的全都有系列》之快速入门中的第一篇,欢迎大家观看与指出不足。写在前面:不影响教程,笔者安装zookeeper用的是WSL(windows下的linux子系统),当然你想直接在windows上用zookeeper也是可以的。如果你也想用wsl,可以参考这篇文章Windows10安装Linux系统(WSL)目录一、zookeeper下载二、安装zookeeper三、linux下启动zookeeper四、windows下启动zookeeper进入
2020-09-29 18:43:48 32742
原创 方法引用真的等价lambda表达式吗?方法引用不永远等价于lambda表达式!
在网络上包括许多书在介绍java8的时候都会提及lamda表达式与方法引用。拿我们多线程经常用的Runnable接口来说:public interface Predicate<T> { boolean test(T t);}以前我们使用这类接口时,通常需要匿名内部类,比如:...
2020-09-27 22:06:55 621
原创 java造成capturing lambda后需要注意的事情
先说结论:在循环里面使用lambda函数造成捕获性lambda后,会产生多余的引用,从而使程序进行原来本可以避免的垃圾回收。从效率的角度上看,这是我们应该避免的。接下来我们看看什么是capturing lambda。在学习Disruptor(高性能队列)的时候,它的官方文档有这样一段话:(重点部分已加粗)ByteBuffer bb = ByteBuffer.allocate(8);for (long l = 0; true; l++){ bb.putLong(0, l);
2020-09-26 16:54:34 236
原创 假如面试官问你java内部类是如何处理外部引用的,你该怎么回答?
在java内部类里,我们是能直接访问外部类的变量的。如下面例子所述:public class OutterClass { private String outterStr; class InnerClass{ public void innerMethod(){ System.out.printf(outterStr); } }}外部类OutterClass 的属性能够被InnerClass直接使用,从java语
2020-09-25 18:51:34 172
原创 不同分布式锁的实现方式与优劣(一):redis实现分布式锁
在涉及资源共享的问题上,传统应用的解决方法是利用synchronized或者Lock来实现线程锁,从而达到资源访问控制的目的。但是当资源的访问控制涉及到多个进程时,情况就有了变化。由于线程共享进程的数据,所以当锁被某个线程占有时,其他线程能够轻易地知道资源已被他人使用,接下来需要做的是自旋获取或者阻塞等待。而当同一台机器的不同进程或位于不同机器的不同进程对于同一种有限的资源进行访问时,进程间的如何知道当前锁被谁持有成为了一个问题。使用分布式锁需要考虑锁操作的原子性,要不获取成功,要么获取失败,不
2020-08-23 00:16:16 1893 2
原创 springboot换日志框架后爆SLF4J: Class path contains multiple SLF4J bindings的解决办法
sringboot原本使用的是logback日志框架,将它去掉,修改为log4j2日志框架后,往往会出现以下错误:SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/C:/Users/admin/.m2/repository/ch/qos/logback/logback-...
2019-07-19 10:52:53 2291 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人