- 博客(109)
- 收藏
- 关注
原创 AQS之Condition刨根问底拦不住~
Object 的监视器方法:wait、notify、notifyAll 应该都不陌生,在多线程使用场景下,必须先使用 synchronized 获取到锁,然后才可以调用 Object 的 wait、notify。Condition 的使用,相当于用 Lock 替换了 synchronized,然后用 Condition 替换 Object 的监视器方法。具体如何替代的下方将会一一解析。
2023-02-25 21:09:11 674 1
原创 手写RPC框架07-框架容错性设计
服务端异常日志的返回客户端调用超时重试服务端连接数限制服务端Service请求数限流其实在容错性方面还有很多待优化的空间,比如方法级别的限流、超时或者异常之后指定参数回调、服务降级、注册中心异常后的自动重连、Server支持动态调整限流参数等。
2023-01-10 22:48:46 559
原创 手写RPC框架08-自定义SpringBoot-Starter
本次我们主要通过自定义的Springboot-starter来完成了我们RPC框架对Springboot的集成,方便了框架的接入和使用成本,大家还有什么需要直接在基础上扩展即可,新年即将来临,别的也不祝福了,就祝大家身体健康吧,目前虽然很难,让我们一起前行,共渡难关!
2023-01-10 22:42:16 608
原创 手写RPC框架06-基于线程和队列提升框架并发处理能力
本次版本主要是针对于Server和Client端的并发处理能力进行了优化,Server端主要是通过对请求通过队列和业务线程异步化,使得Netty的NIO线程和业务逻辑解耦,以免阻塞时间过长的逻辑影响整个RPC框架的请求接入;Client端主要是增加了对异步请求的支持,变相的提升了整个框架的处理能力。
2023-01-09 15:46:58 602
原创 手写RPC框架05-通过SPI机制增加框架的扩展性的设计与实现
SPI全称,是Jdk提供的一种用来扩展框架的服务能力的机制,它能够在运行时将我们定义的类加载到JVM中并实例化。通常面向对象编程推荐的是面向接口编程,而SPI机制就需要先定义好接口,后续对接口进行实现,而如果我们想要替换实现或者增加接口实现的的话,一般都需要修改源代码,SPI机制就是来解决这个问题的,在运行时可以动态的去加载我们配置的Class,将其装配到框架中去。SPI的主要实现思路其实就是通知设置某种规则,将需要扩展的类配置到指定目录下,通过程序读取到指定的配置后,将类进行实例化,供框架使用。
2023-01-06 10:18:42 574
原创 手写RPC框架04-过滤器模块实现
本版本我们基于责任链模式完成了对RPC框架中流程化功能的整合,这些零零散散的功能我们通过过滤器的方式进行了实现,比如服务的分组选择、IP直连、Token统一校验等,减少了各个模块间的耦合性,如果需要扩展新的过滤器,只需要实现Client或者Server对应的接口即可。
2023-01-06 10:17:29 895
原创 手写RPC框架03-序列化模块设计与实现
计算机底层的传输都是通过字节流的方式进行传输的(byte[]),如果我们的内容(字符串、自定义实体、文件等等)需要传输,则需要把这些内容转换成byte[],这一过程就是序列化;常见的序列化框架有:JDK、FastJSON、Hessian、Kryo、Protocol Buf,为了兼容各种不同的序列化框架,因此我们在RPC框架中抽离了一层序列化层,专门用于对接市面上常见的序列化技术框架。每种序列化框架的性能各有不同,在使用时还需要根据实际情况自行选择,后续我们会对常见的序列化框架进行性能对比测试。
2023-01-04 23:02:08 826
原创 手写RPC框架01-整合注册中心模块设计与实现
- 如果同一个服务有10台不同的机器进行提供,那么客户端该从哪获取这10台目标机器的ip地址信息呢?- 随着调用方的增加,如何对服务调用者的数据进行监控呢?- 服务提供者下线了,该如何通知到服务调用方?
2023-01-03 20:56:57 748
原创 IO模型之I/O多路复用
假如我们设计了一个程序,该程序从标准输入接收数据输入,然后通过套接字发送出去,同时,改程序也通过套接字接收对方发送的数据流。我们可以调用某些语言提供的API等待标准输入,但是一旦这样做,就没有办法在套接字有数据的时候读出数据;我们也可以使用某些API等待套接字有数据返回,但是这样做,也没有办法在标准输入有数据的情况下,读入数据并发送给对方。I/O多路复用意味着我们可以同时监视多个fd上的I/O,并在其中任何一个就绪时读取,而非阻塞I/O意味着在读取fd时,如果没有可用的,则立即返回一个错误,而不是等待/阻塞
2022-12-03 19:44:12 1282
原创 Java Design Patterns 之 抽象工厂模式 02
抽象工厂模式与工厂方法模式虽然主要意图都是为了**解决接口选择问题**,但是在实现上,抽象工厂是一个中心工厂,创建其他工厂的模式。
2022-09-05 21:57:03 273
原创 Java Design Patterns 之 抽象工厂模式
简单来说抽象工厂就是将独立的但是又互相有依赖关系的工厂组合在一起而不指定具体类的工厂。
2022-08-31 22:57:25 665
原创 Java Design Patterns 之API 网关模式
在单个位置聚合对微服务的多个调用,用户只需要对Api网关调用一次,由网关再对各个微服务发起调用。
2022-08-30 22:19:11 343
原创 CentOS 7下使用Kubeadm部署最新版Kubernetes
个人把玩用的,不推荐生产环境使用Kubeadm部署哈,生产环境可以使用国人开源的kubeasz前言安装这个花了我两天的时间,想想过程就非常的难受啊,各种小问题层出不穷,最开始打算在阿里云上面搭,但是我阿里云的三台机器是用我家人的手机号买的(双十一活动,哈哈),可这也就导致了搭建失败,网络不通,k8s只会绑定内网IP,无法绑定外网IP,而阿里云不同账号的内网是不互通的,可以搞但是得花钱,一说花钱,那。。我必不可能花钱,于是果断在本地搭了三台虚拟机,在虚拟机上搭建的过程虽然没有网络的问题了,但零零碎碎.
2022-03-27 16:36:04 1345 1
原创 深入剖析Netty之NioEventLoop寻根究底
EventLoop在Netty中的作用至关重要,设计也非常的复杂,今天就跟随我一起将EventLoop拆解清楚!
2022-01-16 17:59:47 1240 7
原创 深入剖析Netty之EventLoop刨根问底
在我们的日常使用中,EventLoopGroup是我们的老朋友了,EventLoopGroup我们已经讲解过了,那EventLoop是个啥呢?主要是用来做什么的?今天我就来带大家一探究竟!
2022-01-16 17:45:50 621
原创 Reactor模型你知道都有哪些吗?
从传统的BIO到NIO,NIO之后又衍生出的Reactor模型,到底都有哪些?Netty的线程模型是基于哪种Reactor模型的呢?
2022-01-09 15:13:45 1032 3
原创 Doug lea《Scalable IO in Java》翻译
英语水平有限,翻译的不是太好,大家多多见谅????,但是读完之后对Reactor的设计肯定是更上一层楼,还需要细细品尝
2022-01-09 15:01:52 674 1
原创 Netty服务端创建源码流程解析
本专栏基于4.1.73.Final版本进行解析相信大家对创建一个Netty服务端已经很熟悉了,下边是一个简单的服务端的例子:public final class EchoServer { static final boolean SSL = System.getProperty("ssl") != null; static final int PORT = Integer.parseInt(System.getProperty("port", "8007")); publ.
2022-01-08 15:28:21 838 1
原创 EventLoopGroup到底是个啥?
在Netty中,Channel为网络操作抽象类,EventLoop负责处理注册到其上的Channel处理I/O操作,两者配合参与I/O操作;EventLoopGroup是一个EventLoop的分组,它可以获取到一个或者多个EventLoop对象,因此它提供了迭代出EventLoop对象的方法。在我们的使用示例中,使用到的就是:new Nio.
2022-01-07 16:12:09 2663 1
原创 Java NIO三大角色Channel、Buffer、Selector
从JDK 1.4开始支持NIO编程,虽然目前用Netty的人占大部分,但是我们还是要先了解下Java的NIO是怎么实现的,今天就来一探究竟
2021-12-02 16:04:13 827 3
原创 order by是怎么排序的,该如何优化?
在我们的业务系统中难免用到排序,那order by这个语法你肯定用过,今天我们就来聊聊order by是怎么工作的,遇到排序慢了又该怎么优化。order by相关的官方文档:https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.htmlsort bufferMySQL会为每个线程分配一块内存用于排序,这块内存就被称为“sort buffer”,这块内存的大小通过参数sort_buffer_size来控制,超过这个值就需要使用磁
2021-11-24 09:52:55 2374
原创 InnoDB怎么执行删除的?
InnoDB表都包含哪些部分一个InnoDB表包含两部分,表结构定义和数据。在MySQL8.0之前,表结构存在以.frm为后缀的文件里,MySQL8.0版本,已经允许把表结构定义存放在系统数据表中了(因为表结构定义占用的空间很小)简单的删除表数据,表占用空间不会减小表数据既可以存在共享表空间里,也可以是单独的文件,这个行为是由参数innodb_file_per_table控制的:设置为OFF:表的数据放在系统共享表空间,也就是根数据字典放在一起设置为ON:每个InnoDB表数据存储在一个.i.
2021-11-08 09:54:37 744
原创 你知道都有哪些I/O模型吗?
Linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作被调用内核提供的系统命令,返回一个file descriptor(fd ,文件描述符)。对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)UNIX提供了5种I/O模型,分别如下:阻塞I/O模型最常见的I/O模型就是阻塞I/O迷行,缺省情形下, 所有的文件操作都是阻塞的,以套接字接口为例来讲解此模型:在进程空间.
2021-10-31 21:35:48 290 1
原创 记一次使用低版本ES Java Client偶尔查询超时问题解决过程
首先说明项目中ES使用版本为2.4版本,ES JavaClient为2.4.4版本。服务器配置为16G、8核。现象我们一个地区项目中有一个查询ES的接口莫名其妙的翻页会出现超时,可能翻第一页会出现,可能翻第三页会出现。排查思路 由于项目没有做任何监控系统,因此唯一的排查思路就是定位到底是哪里执行超时的,在代码中可能发生超时的位置都打了日志并进行临时发布,最后发现是在调用查询ES的时候卡住的(`searchRequestBuilder.execute().actionGet();`),并且没有任何
2021-10-22 10:58:48 817
原创 MySQL的“刷脏”机制
在MySQL日志系统文章中我们已经介绍过MySQL中的重做日志redo log,对于更新操作,InnoDB会写redo log,以保证MySQL崩溃恢复。InnoDB在处理更新语句时,更新完内存记完redo log后就返回客户端成功,更新结束。脏页此时内存中的数据和磁盘中的数据是不一致的,不一致的这个数据页就被称为“脏页”。刷脏页(flush)既然磁盘中的数据和内存中的数据有不一致的,那肯定就涉及到将内存中的数据同步到磁盘中,那这个过程就被称为**“刷脏”**。刷脏页的时机MySQL定时
2021-10-21 09:06:14 1672 1
原创 MySQL中的间隙锁
在MySQL中的锁机制文章中我们讲解了MySQL中涉及的锁相关概念,本片文章我们来详细解析下MySQL中的间隙锁,跟着我的脚步一起学习吧!有问题欢迎大家指正讨论!????????????间隙锁用来解决什么问题?用来解决幻读问题,并且幻读只在RR隔离级别下才会存在。什么是幻读?幻读指的是同一个事务前后两次查询同一个范围的时候,后一次查询看到了前一次查询没看到的行。说明:幻读仅专指“新插入的行”在RR隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的,因此,幻读在“当前读”下才会
2021-10-12 11:27:17 592
原创 MySQL中的锁机制
本片文章总结下MySQL锁相关的知识,有问题欢迎大家指正讨论!全局锁全局锁会对整个数据库加锁,开启全局锁之后数据库处于Read Only状态,所有DML及DDL语句都会被阻塞;通过命令Flush tables with read lock(FTWRL)来开启全局锁,对应使用unlocak tablse来解锁。场景: 做全库逻辑备份,也就是把整个库每个表都select出来存成文本弊端:在主库备份,备份期间涉及DDL业务需要暂停在从库备份,备份期间从库不能执行主库同步过来的binlog,导致.
2021-10-12 11:23:23 183
原创 MySQL索引你真的会用吗?
表构成在InnoDB中,每一张表其实就是多个B+数,即一个主键索引树和多个非主键索引树。如果不使用索引进行查询,则从主键索引B+树的叶子结点进行遍历索引类型主键索引(聚簇索引)叶子节点存储的是整行的数据非主键索引(二级索引)叶子节点存储的是主键的值回表基于非主键索引查询,如果要查询的字段不在非主键索引中的非主键字段,就需要再根据主键的值去查询主键索引树,查询出其他字段的值,这个操作叫回表。假设有一张表t_user,主键索引是id,name是非主键索引create table .
2021-10-10 15:22:00 146
原创 TCP粘包、拆包问题
粘包假设客户端向服务端发送了两个数据包D1和D2,假如服务端一次收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包。拆包假设客户端向服务端发送了两个数据包D1和D2,假如服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容,第二次读取到了D1包的剩余部分和D2的包的整包,这被称为拆包。如果此时服务端TCP接收滑窗非常小,而数据包D1和D2比较大,很有可能会发生第5种可能,即服务端分多次才能将D1和D2包接收完全,期间发生多次拆包。粘包、拆包发生的原因要发送的数据大于TC.
2021-10-09 14:57:39 147
原创 MySQL普通索引和唯一索引的区别
查询**普通索引:**查找到满足条件的第一个记录后,需要检索下一个记录,直到碰到第一个不满足条件的记录(由于B+数的叶子节点的数据都是顺序存放的)**唯一索引:**只要查找到满足条件的第一个记录后就停止检索buffer pool这两种查询方式的性能差距微乎其微,原因是InnoDB底层是以页才存储数据,每一页都是16KB,在读取数据的时候不是只是将符合条件的记录读取出来,而是将记录所在的整页数据都读取出来放到内存中,这个内存就是**buffer pool,**这样当读取到满足条件的记录后,就不.
2021-10-05 09:10:58 579
原创 读已提交和可重复读隔离级别下到底能读到哪些记录?
在事务的隔离性及MySQL多版本并发控制实现这篇文章中讲过中讲过,在RC和RR隔离级别下MySQL有ReadView来实现隔离级别。在RC隔离级别下,ReadView是在每次执行查询时会生成;在RR隔离级别下,当使用start transaction with consistent snapshot开启事务,那ReadView就是在开启事务的时候创建,如果使用begin或者start transaction,ReadView就是在开启事务后执行第一条查询语句时才会生成。事务ID(trx_id)I
2021-09-30 10:25:39 831
原创 事务的隔离性及MySQL多版本并发控制实现
隔离级别说到隔离性,肯定就会想到隔离级别,SQL标准的事务隔离级别包括:读未提交(Read uncommited 简称RU):指一个事务还没有提交,它做的修改就可以被另一个事务读到读提交(Read Commited 简称RC):指直到一个事务提交,它做的修改才可以被另一个事务读到可重复度(Repeatable Read 简称RR):指从一个事务开启,到事务提交,在这个事务执行过程中,它看到的数据总是跟在这个事务启动的时候看到的数据一致串行化(Serializable):对同一行记录,“写”会加.
2021-09-27 09:52:49 177
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人