- 博客(25)
- 资源 (1)
- 收藏
- 关注
原创 Innodb间隙锁实战
锁概念InnoDB存储引擎包含了三种行锁的算法,分别如下所示:Record Lock:行锁,针对的是单行记录;Gap Lock:间隙锁,锁定的是一个范围,但是不包含记录本身;Next-Key Lock:其实就是行锁+间隙锁,包含了记录本身和范围;为什么需要间隙锁数据库一般都有四种隔离级别,其中最常用的就是:已提交读(Read committed)和可重复读(Repeatable read);在已提交读隔离级别下会出现不可重复读的现象,而在可重复读隔离级别下会出现幻读(Phantom Read
2021-08-23 17:16:48
313
1
原创 一次被木马攻击的记录
描述最近一个老同学跟我说他部署在阿里云上的系统,在tomcat的目录下出现了一个index.jsp文件,内容大致如下:我一看发现这不就是一个木马后门文件吗,只需要通过参数ejiaogl传入一个经过base64编码的Class文件,这样就可以解码然后被类加载器加载,而我们知道类被加载的时候是可以执行static代码块的,而这个代码块可以任由攻击者来指定要执行的代码,是非常危险的,为了更加形象我特意做了一个模拟攻击。模拟攻击准备木马文件准备一个Tomcat,直接启动即可,默认访问的是ROOT目录下的
2021-07-29 10:15:15
368
原创 Redis实现分布式锁十连问
前言分布式锁就是在多个进程之间达到互斥的目的,常见的方案包括:基于DB的唯一索引、Zookeeper的临时有序节点、Redis的SETNX来实现;Redis因为其高性能被广泛使用,本文通过一问一答的方式来了解Redis如何去实现分布式锁的。1.Redis怎么实现分布式锁使用Redis提供的SETNX命令保证只有一次能写入成功SETNX key value当且仅当key不存在,则给key设值为value;若给定的key已经存在,则什么也不做;127.0.0.1:6379> setnx lo
2021-07-22 17:34:18
216
原创 字节码增强概述
前言字节码我们都知道是java文件经过编译之后的class文件,每一个字节码文件都要由10部分按照固定的顺序组成;增强其实就是对字节码文件进行改造生成一个新的文件,已达到我们的目的,比如动态代理,AOP等;当然增强完需要能被使用,所以涉及到到加载的问题;在介绍之前我们先来看看都有哪些字节码增强技术。常见技术常见的字节码增强技术大致分为两类:静态增强和动态增强;静态增强最常见的就是AspectJ了,可以直接编译类,有自己的语法;动态增强包括:ASM、Javassist、Cglib、Java Proxy;
2021-06-23 16:12:16
1157
原创 ASM在FastJson中的应用
前言上文ASM入门篇中除了对ASM的使用做了介绍,同时也提到ASM被使用的一些场景,其中有一项就是ASM被用来代替Java反射;FastJson作为序列化工具,就使用了ASM来代替反射的使用,提高整体的性能。序列化序列化就是将对象转换成Json格式的字符串,然后用来持久化或者网络传输;FastJson提供了接口类ObjectSerializer:public interface ObjectSerializer { void write(JSONSerializer seriali
2021-06-17 09:36:48
2526
1
原创 ASM入门篇
ASM简介ASM是一个通用的Java字节码操作和分析框架,它可以用来修改现有的类或直接以二进制形式动态生成类。ASM提供了一些常见的字节码转换和分析算法,从中可以构建定制的复杂转换和代码分析工具。ASM提供了与其他Java字节码框架类似的功能,但侧重于性能。因为它的设计和实现都尽可能小和快,所以它非常适合在动态系统中使用(当然也可以以静态方式使用,例如在编译器中)。ASM被用在很多项目中,包括如下:OpenJDK,生成lambda调用站点,以及Nashorn编译器;Groovy编译器和Kotlin
2021-06-11 10:22:52
2498
2
原创 对高可用系统的一点理解
什么是高可用简单来讲就是我们系统如何提高对外的服务时间,想要系统达到100%可用基本是不太可能的,也内有一个专门的衡量标准SLA(全称:Service Level Agreement),也就是有几个9的高可用性: 90% (1个9):系统全年有36.5天不可用; 99% (2个9):系统全年有3.65天不可用; 99.9% (3个9):系统全年有8.76小时不可用; 99.99% (4个9):系统全年有52.56分不可用; 99.999% (5个9):系统全
2021-06-01 15:34:24
288
原创 超时与重试浅析
前言超时可以说是除了空指针我们最熟悉的异常了,从系统的接入层,到服务层,再到数据库层等等都能看到超时的身影;超时很多情况下同时伴随着重试,因为某些情况下比如网络抖动问题等,重试是可以成功的;当然重试往往也会指定重试次数上限,因为如果程序确实存在问题,重试多少次都无济于事,那其实也是对资源的浪费。为什么要设置超时对于开发人员来说我们平时最常见的就是设置超时时间,比如数据库超时设置、缓存超时设置、中间件客户端超时设置、HttpClient超时设置、可能还有业务超时;为什么要设置超时时间,因为如果不设置超时
2021-05-24 13:04:12
881
1
原创 ShardingSphere-JDBC分片改写引擎
前言上文ShardingSphere-JDBC分片路由引擎中介绍了分片流程中的路由引擎,最终获取了路由结果;本文要介绍的改写引擎需要使用路由结果来对SQL进行改写,改写成可以被正确的分库分表能够执行的SQL;这里面涉及对各种SQL改写的情况众多,接下来本文会进行一一分析。改写装饰器重写引擎同样使用了装饰器模式,提供了接口类SQLRewriteContextDecorator,实现类包括:ShardingSQLRewriteContextDecorator:分片SQL改写装饰器;ShadowSQL
2021-05-18 19:18:22
848
原创 ShardingSphere-JDBC分片路由引擎
前言上文ShardingSphere-JDBC分片解析引擎中介绍了分片流程中的解析引擎,重点介绍了解析引擎的核心组件ANTLR;本文继续介绍分片流程中的路由引擎,路由引擎可以说是整个分片流程的核心模块,用户自定义的分片算法都在路由引擎中执行;开启日志为了更加清晰详细的查看路由日志,开启SQL_SHOW功能:引入log4j相关jar,以及log4j.xml配置文件配置SQL_SHOW属性为开启:Properties prop = new Properties();prop.put(Con
2021-04-28 20:37:14
807
1
原创 ShardingSphere-JDBC分片解析引擎
前言上文ShardingSphere-JDBC入门实战中对ShardingSphere-JDBC如何使用做了简单介绍,接下来打算从源码层面对数据分片做更加详细的介绍,整个数据分片会经过一个复杂的流程包括:解析、路由、改写、执行、归并这几个子流程,每个子流程都有对应的引擎来处理,本文重点分析子流程中的解析引擎。分片流程在介绍解析引擎之前,我们对各个子流程做一个简单的介绍;我们可以想象一下大概要经过几个流程;首先用户操作的都是逻辑表,最终是要被替换成物理表的,所以需要对SQL进行解析,其实就是理解SQL;
2021-04-23 10:24:54
560
原创 ShardingSphere-JDBC入门实战
前言Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成;接下来的几篇文章将重点分析ShardingSphere-JDBC,从数据分片,分布式主键,分布式事务,读写分离,弹性伸缩等几个方面来介绍。简介ShardingSphere-JDBC定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包
2021-04-20 10:07:36
953
原创 Jackson-databind引发的漏洞问题分析
前言最近公司内部提供了一份应用高危漏洞的清单,其中提到了fastjson和jackson,因为之前对fastjson因为多态问题引发的反序列化问题有过了解,所以打算也做一个简单的分析。漏洞简述2020年08月27日,360CERT监测发现 jackson-databind 发布了 jackson-databind 序列化漏洞 的风险通告,该漏洞编号为 CVE-2020-24616 ,漏洞等级:高危,漏洞评分:7.5。br.com.anteros:Anteros-DBCP 中存在新的反序列化利用链,
2021-03-25 17:31:28
8191
4
原创 分布式事务浅析
前言分布式事务拆开来其实就是分布式、事务两个概念,分布式简单讲就是不同进程间的系统进行通信;事务狭义上我们经常把它看作是数据库的事务,事务具有ACID特性即:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),通俗来说就是同一个事务中对于数据库的更新操作来说要么都成功,要么都失败;广义上来说同一个事务中的一批操作(非局限于数据库操作)要么都成功,要么都失败;综合来说就是事务的参与者分别位于不同的进程节点中。分布式理论既然和分布式
2021-03-16 19:24:26
257
原创 负载均衡浅析
前言负载均衡这个概念在我们工作中经常被提及到,因为纵观我们系统的整个链路层,每层都会用到负载均衡,从接入层,服务层,到最后的数据层,当然还有MQ,分布式缓存等等都会存在一些负载均衡的思路在里面;给负载均衡做一个简短的定义:就是将请求分摊到多个操作单元上进行执行;其实就是一种分而治之的思想,面对高并发的情况下,这是一种非常行之有效的方法。核心功能上面简短的定义中我们大致可以看到两个内容:将请求分发,操作单元;其实就是控制器+执行器模式、Master+Worker模式等等,是不是很熟悉;当然一个成熟的负载
2021-01-07 15:13:21
1336
1
原创 如何自定义协议
前言何为自定义协议,其实是相对标准协议来说的,这里主要针对的是应用层协议;常见的标准的应用层协议如http、ftp、smtp等,如果我们在网络通信的过程中不去使用这些标准协议,那就需要自定义协议,比如我们常用的RPC框架(dubbo,thrift),分布式缓存(redis,memcached)等都是自定义协议;本文就来讲讲如何去自定义私有协议,在此之前我们先考虑一下为什么要自定义协议。为什么要自定义协议直接使用标准的协议好处是显而易见的,我个人理解的几点优点:既然是标准协议说明已经成为了标准,这样
2020-12-28 08:51:41
6161
原创 对序列化中反射的一点思考
前言序列化大家都不陌生,说白了就是把当前类对象的状态保存为二进制,然后被用来持久化或者网络传输;常用的RPC框架在数据传输前都会进行序列化操作,主流的RPC框架包含了多种序列化方式比如protobuf,fastjson,kryo,hessian,java内置序列化等等,大致可以分为二进制和字符串(json字符串)。反射因为需要把当前类对象状态保存为二进制,所以往往需要获取所有类属性,这时候大部分的序列化方式都用到了反射,通过反射获取所有类属性获取方法,然后获取到属性值,大致如下://1.方法Met
2020-12-21 08:53:19
152
原创 如何动态改变日志级别
前言关于日志级别,大部分项目可能都设置为info级别,当然也可能有一些追求性能或者说包含很多敏感信息的项目直接将级别设置为warn或者error;这时候如果项目中出现一些未知异常,需要用到很详细的日志信息,此时如果项目中没有动态改变日志级别的机制,排查问题将很棘手。日志系统我们常用的一些日志系统包括:Log4j2、Logback、Java Util Logging;我们想动态改变日志的级别,前提是这些日志系统都支持我们直接设置日志等级,当然这些系统提供了很简单的接口;Log4j2LoggerC
2020-12-17 08:45:22
3113
原创 记一次ThreadLocal引发的内存泄露
概念首先解释下内存溢出和内存泄露的概念。内存溢出一般指的是out of memory,也就是我们经常说的OOM,常发生在堆,方法区和方法栈。内存泄露指的是一段程序在申请内存空间后,无法释放已经申请的内存空间,导致该内存地址不可达,后续程序里这块内存空间永远被占用。就好像商场的物品柜设计了10个抽屉,每个人使用后都会归还给下一个用户使用,如果有某个人一直占用不退还,别的用户就只能使用剩下的9个抽屉,这样的人多了以后,最后大家一个抽屉也无法使用了。所以内存泄露跟内存溢出是存在联系的,一次内存泄露不会有太大的
2020-12-16 08:48:12
239
原创 RPC设计概要
前言RPC全程远程方法调用,已经在各大小公司被广泛使用,种类也是很多比如:Dubbo,Spring cloud那一套,GRPC,Thrift,可能还有很多公司自研的等等;每个公司都可能根据自己的业务需求,场景选择自己合适的RPC框架;但大体的考察维度无非就这么几个:性能,可扩展性,跨平台,功能性,可监控,使用性;所以我们如果要设计一个RPC框架,可以从这几个角度去考虑。性能作为微服务中的核心组件,在一个系统中RPC的调用量往往是很高的,所以性能是一个很重要的考虑点;既然是远程调用,必然牵扯到网络连接,
2020-12-15 08:45:52
371
原创 线上故障如何排查
前言说起线上故障,程序员应该都经历过,从故障处理恢复过程中我们能快速提高。踩坑多了,慢慢也就成了大牛。这道题也是大厂的面试官们特别喜欢问的问题之一,从候选人对这道题的回答过程中,面试官至少能获取到两个方面的反馈。第一是你平时负责的项目是不是核心项目,如果你说你负责的是后管系统,出了问题重启就OK了,那结果只能是出门右转了。第二是候选人系统化处理问题的能力。你是如何快速止血;如何一步步快速定位到具体问题;故障前的准备工作是否充分,风险点有没有紧急应对方案。下面我们就一起来聊聊线上故障的排查过程快速止血
2020-12-14 09:18:19
1023
原创 一次反射引发的宕机问题
背景介绍整个系统是一个第三方支付平台,面向的是商户端;出现宕机是其中的通知服务,通知服务主要的功能是将支付的结果通知商户,通知地址其实就是每个商户在提交支付订单的时候提供的;而通知地址大部分都是域名地址,所以会出现大量通过域名获取ip的操作。问题描述通知系统在运行一段时间后(可能是一周,一个月,甚至几个月),突然出现宕机,无法提供通知,日志中出现大量的如下错误:java.lang.NullPointerException at java.net.InetAddress$Cache.put(I
2020-12-11 08:37:54
327
原创 如何做一个防重设计
前言在业务设计中防重设计是一个关键点,以接口设计为例,防重就是防止接口被多次调用而产生脏数据,比如支付订单出现重复支付,所以说防重至关重要,在如何防重之前我们首先看一下是如何出现重复请求的。何时出现多次调用多次调用接口的出现有主观原因比如:人为的重复请求攻击,用户的误操作等;也有客观原因比如:为了健壮性进行超时重试;重复请求攻击对于这种恶意攻击,其实已经属于安全范畴了,我们可以通过黑名单+限流来处理,下一步再考虑防重处理;用户的误操作比如用户在界面点击提交按钮,因为手误出现多次点击提交
2020-12-09 13:54:59
1446
原创 灰度发布浅析
定义灰度发布就是已一种平滑过渡的方式来发布,通过切换线上新旧版本之间的路由权重,逐步从旧版本切换到新版本;比如要上线新功能,首先只是更新少量的服务节点,通过路由权重,让少部分用户体验新版本,如果没有什么问题,再更新所有服务节点;这样可以在出现问题把影响面降到最低,保证了系统的稳定性。灰度发布一个系统往往有接入层比如nginx(Openresty),网关层比如zuul,以及服务层比如各种rpc框架;在这几层都有路由功能,也就是说这几层都可以做灰度;接入层可以使用nginx+lua来实现灰度,网关层zuu
2020-12-08 08:46:01
370
1
原创 限流浅析
前言我们每个系统在做压测的时候,都有一个处理峰值,当接近峰值继续接受请求的时候,会导致整个系统响应缓慢;为了保护系统,需要拒绝处理过载的请求,这就是我们下面介绍的限流,通过设定一个峰值阈值,限制请求达到这个峰值,以此来保护系统;我们常见的一些中间件比如tomcat,mysql,redis等等都有类似的限制。限流算法做限流的时候我们有一些常用的限流算法包括:计数器限流,令牌桶限流,漏桶限流;1.令牌桶限流令牌桶算法的原理是系统以一定速率向桶中放入令牌,填满了就丢弃令牌;请求来时会先从桶中取出令牌
2020-12-07 16:06:01
348
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人