- 博客(108)
- 收藏
- 关注
原创 1.5w字+30图带你彻底掌握 AQS!
AQS( AbstractQueuedSynchronizer )是一个用来构建锁和同步器(所谓同步,是指线程之间的通信、协作)的框架,Lock 包中的各种锁(如常见的 ReentrantLock, ReadWriteLock), concurrent 包中的各种同步器(如 CountDownLatch, Semaphore, CyclicBarrier)都是基于 AQS 来构建,所以理解 AQS 的实现原理至关重要,AQS 也是面试中区分侯选人的常见考点,我们务必要掌握。
2024-10-11 15:29:10 1036
原创 熔断、隔离、重试、降级、超时、限流,高可用架构流量治理核心策略全掌握
那么可以对服务进行熔断降级,后面的请求不再重试,这段时间做降级处理,减少没必要的请求,等服务端恢复了之后再进行请求,这方面的工程实现很多,比如 go-zero 、 sentinel 、hystrix-go。因此,在架构设计时,我们不仅要接受故障的可能性,而且要学会拥抱故障。重试策略就包含了重试间隔时间,重试次数等。服务的响应时间并不是恒定的,在某些长尾条件下可能需要更多的计算时间,为了有足够的时间等待这种长尾请求响应,我们需要把超时设置足够长,但超时设置太长又会增加风险,超时的准确设置经常困扰我们。
2024-06-19 13:24:05 742
原创 聊聊 Mybatis 动态 SQL
如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。Mybatis 借助功能强大 OGNL 表达式,可以根据参数条件,动态生成执行 SQL。使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。这条语句提供了可选的查询博客文章列表 ,如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 博客都会返回。
2024-06-19 13:22:42 931
原创 ConcurrentHashMap如何保证线程安全?
ConcurrentHashMap 在 JDK 1.7 时使用的是数据加链表的形式实现的,其中数组分为两类:大数组 Segment 和小数组 HashEntry,而加锁是通过给 Segment 添加 ReentrantLock 锁来实现线程安全的。而 JDK 1.8 中 ConcurrentHashMap 使用的是数组+链表/红黑树的方式实现的,它是通过 CAS 或 synchronized 来实现线程安全的,并且它的锁粒度更小,查询性能也更高。
2024-06-15 13:02:35 1229
原创 消息队列的 6 种经典使用场景和 Kafka 架构设计原理详细解析
今天来聊一聊 Kafka 消息队列的使用场景和核心架构实现原理,帮助你全面了解 Kafka 其内部工作原理和设计理念。。Apache Kafka 是一个高吞吐量、分布式的流处理平台,广泛应用于实时数据管道和流处理应用中。Kafka 以其高性能、低延迟、扩展性和可靠性,成为了大数据生态系统中的重要组件。
2024-06-06 13:36:11 1379
原创 高德面试:为什么Map不能插入null?
所谓的二义性问题指的是代码或表达式存在多种理解或解释,导致程序的含义不明确或模糊。以 ConcurrentHashMap 不允许为 null 的二义性问题来说,null 其实有以下两层含义:这个值本身设置的是 null,null 在这里表示的是一种具体的“null”值状态。null 还表示“没有”的意思,因为没有设置,所以啥也没有。所以,如果 ConcurrentHashMap 允许插入 null 值,那么就会存在二义性问题。
2024-06-06 13:33:52 788
原创 如何防止线上事故?从一次流水号重复引发的故障说起
今天分享了我在工作中遇到的一次生产事故。生产事故除了影响业务正常运转,处理事故的过程也是非常花费时间和精力的。完全不出事故是不可能的,如果能对历史故障吸取教训,多花心思研究自己的系统,可以有效降低故障率。
2024-06-06 13:27:57 804
原创 当Synchronized遇到这玩意儿,有个大坑!
前几天在某技术平台上看到别人提的关于 Synchronized 的一个用法问题,我觉得挺有意思的,这个问题其实也是我三年前面试某公司的时候遇到的一个真题,当时不知道面试官想要考什么,没有回答的特别好,后来研究了一下就记住了。所以看到这个问题的时候觉得特别亲切,准备分享给你一起看看:程序逻辑也很简单,是一个模拟抢票的过程,一共 10 张票,开启两个线程去抢票。票是共享资源,且有两个线程来消费,所以为了保证线程安全,TicketConsumer 的逻辑里面用了 synchronized 关键字。
2024-06-05 13:32:01 769
原创 Feign如何设置超时时间,不同情况下还真不一样
今天给大家扒了扒在不同使用条件下Feign的超时时间设置,总结起来大致如下:单独使用Feign时:通过和方法参数SpringCloud环境下单独使用Feign:方法参数、配置文件、声明OptionsBean跟Ribbon配合使用:通过Ribbon的超时参数设置跟Hystrix配合使用:修改默认的超时时间,尽量符合 Hystrix超时时间 >= (连接超时时间 + 读超时时间) * 重试次数。
2024-06-05 13:30:08 3382
原创 离谱!CPU狂飙900%,这怎么处理?
最近有位小伙伴面试了网易,遇到了一个 性能类的面试题:CPU飙升900%,该怎么处理?可惜的是,上面的问题,这个小伙没有回答理想。最终,导致他网易之路,终止在二面,非常可惜。
2024-06-04 13:30:09 970
原创 SpringCloud 微服务中网关如何记录请求响应日志?
在基于SpringCloud开发的微服务中,我们一般会选择在网关层记录请求和响应日志,并将其收集到ELK中用作查询和分析。今天我们就来看看如何实现此功能。
2024-06-04 13:29:23 899
原创 万字聊一聊RocketMQ一条消息短暂而又精彩的一生
为了更好地理解本文,这里再来总结一下RokcetMQ消息一生的各个环节。最后,如果有对RocketMQ源码感兴趣的小伙伴可以从如下地址中拉取RocketMQ源码,里面我已经对RocketMQ一些源码进行了注释。
2024-06-04 13:28:28 979
原创 拼多多面试:Netty如何解决粘包问题?
在 TCP 协议的基础上封装一层自定义数据协议,在自定义数据协议中,包含数据头(存储数据的大小)和 数据的具体内容,这样服务端得到数据之后,通过解析数据头就可以知道数据的具体长度了,也就没有粘包的问题了。
2024-06-03 13:14:35 851
原创 Spring Boot 性能太差?试试这几招!
默认 Tomcat 容器改为 Undertow(Jboss 下的服务器,Tomcat 吞吐量 5000,Undertow 吞吐量 8000)线程池中执行,而这个线程池中的所有线程都是 Daemon(守护)线程,所以,当主线程结束时,这些线程无论执行完毕都会退出系统。实例就可以作为这次调用的契约,在将来任何场合,用于获得最终的计算结果。方法中,它会在一个新线程中,执行传入的参数。方法,这个方法可能是比较慢的,但这并不影响。这两个方法如果在不指定线程池的情况下,都是在。在该示例中,启动一个线程,此时。
2024-06-03 13:12:33 336
原创 滴滴面试:谈谈对Netty线程模型的理解?
Netty 线程模型是指 Netty 框架为了提供高性能、高并发的网络通信,而设计的管理和利用线程的策略和机制。
2024-06-01 13:53:36 443
原创 Spring Boot + URule 实现可视化规则引擎,太优雅了!
规则引擎其实是一种组件,它可以嵌入到程序当中。将程序复杂的判断规则从业务代码中剥离出来,使得程序只需要关心自己的业务,而不需要去进行复杂的逻辑判断;简单的理解是规则接受一组输入的数据,通过预定好的规则配置,再输出一组结果。当然,市面上有很多成熟的规则引擎,如:Drools、Aviator、EasyRules等等。但是URule,它可以运行在Windows、Linux、Unix等各种类型的操作系统之上,采用纯浏览器的编辑模式,不需要安装工具,直接在浏览器上编辑规则和测试规则。
2024-06-01 13:52:08 994
原创 告别裸奔,聊聊主流消息队列的认证和鉴权!
RabbitMQ 和 Pulsar 都提供了自定义、可插拔的身份认证框架,然后基于框架的接口来实现各种认证插件,在配置文件中指定要使用的认证插件。Pulsar 内置的认证插件包括 JWT、OAuth2.0、Athenz、Kerberos 等。RabbitMQ 实现的认证插件包括 AMQPLAIN 和 PLAIN。总结:认证框架的选择很多,Kafka 选择的 SASL 机制更加完善,功能更加强大,实现起来也更加复杂。而自定义的机制则实现更加简单,同时也能满足消息队列的认证需求。消息队列认证方式。
2024-06-01 13:50:31 876
原创 把 Spring Boot 项目从 18.18M 瘦身到 0.18M,部署超级快!
SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼:编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud等),那就更大了。这个时候如果想要对线上运行工程有一些微调,则非常痛苦。
2024-05-31 13:11:35 219
原创 面试官:说说Netty核心组件?
Netty 核心组件是指 Netty 在执行过程中所涉及到的重要概念,这些核心组件共同组成了 Netty 框架,使 Netty 框架能够正常的运行。
2024-05-31 13:10:47 553
原创 SpringBoot 动态加载 Jar 包,玩转动态配置!
动态加载Jar包是指在应用程序运行时,动态地加载和卸载Jar包中的类和资源。这种机制可以提高系统的灵活性和可扩展性,允许在不重启应用程序的情况下,添加、更新或删除组件。本文详细介绍了如何在Spring Boot应用程序中实现动态加载Jar包。我们首先了解了动态加载Jar包的基本概念和作用,然后学习了如何使用Spring Boot的类加载器和第三方库来实现Jar包的动态加载。我们还通过具体的示例展示了如何在Spring Boot应用程序中配置和使用Jar包的动态加载,以提高系统的灵活性和可扩展性。
2024-05-30 14:18:49 1033
原创 面试官:消息队列的应用场景有哪些?
通常来说,使用消息队列主要能为我们的系统带来下面三点好处:异步处理削峰/限流降低系统耦合性除了这三点之外,消息队列还有其他的一些应用场景,例如实现分布式事务、顺序保证和数据流处理。如果在面试的时候你被面试官问到这个问题的话,一般情况是你在你的简历上涉及到消息队列这方面的内容,这个时候推荐你结合你自己的项目来回答。
2024-05-30 14:18:10 682
原创 Controller层代码就该这么写,简洁又优雅!
Controller层代码应该是后端开发接触非常多的代码了,好的接口设计能让你的Controller层代码简洁又优雅,今天给大家分享下接口设计的18条军规!
2024-05-30 14:15:59 618
原创 你管这破玩意儿叫负载均衡?
架构一定要结合业务的实际情况来设计,脱离业务谈架构其实是耍流氓,可以看到上文每一个架构的衍化都与我们的业务发展息息相关,对于中小型流量没有那么大的公司,其实用 Nginx 作为负载均衡足够,在流量迅猛增长后则考虑使用 lvs+nginx,当然像美团这样的巨量流量(数十 Gbps的流量、上千万的并发连接),lvs 也不管用了(实测虽然使用了 lvs 但依然出现了不少丢包的现象)所以它们开发出了自己的一套四层负载均衡器 MGW。
2024-05-29 13:19:43 826
原创 京东二面:为什么Netty要造FastThreadLocal?
FastThreadLocal 从字面意义上来看,它是“Fast”+“ThreadLocal”的结合体,寓意为快速的 ThreadLocal。那么,问题来了,Netty 为什么要再造一个 FastThreadLocal?FastThreadLocal 运行快的原因是啥?除了快之外,它还有其他优势吗?ThreadLocal 线程本地变量,每个线程都拥有一份该变量的独立副本,即使是在多线程环境下,每个线程也只能修改和访问自己的那份副本,从而避免了线程安全问题,实现了线程间的隔离。ThreadLocal 底层是使
2024-05-29 13:17:05 881
原创 阿里面试:NIO为什么会导致CPU100%?
在 Java 中总共有三种 IO 类型:BIO(Blocking I/O,阻塞I/O)、NIO(Non-blocking I/O,非阻塞I/O)和 AIO(Asynchronous I/O,异步I/O),它们的区别如下:在 JDK 1.4 之前,只有 BIO 一种模式,其开发过程相对简单,新来一个连接就会创建一个新的线程处理,但随着请求并发度的提升,BIO 很快遇到了性能瓶颈。
2024-05-28 15:24:28 719
原创 1.4万字+20张图探秘Redis高效的网络模型
这部分在一定程度上是我的强迫症作祟,我关于文章对知识点讲解的完备性上对自己近乎苛刻。我觉得把Socket讲明白对接下来的讲解是一件很重要的事情,看过我之前的文章的读者或许能意识到,我尽量避免把前置知识直接以链接的形式展示出来,我认为会割裂整篇文章的阅读体验。不割裂的结果就是文章可能显得很啰嗦,好像一件事情非得从盘古开天辟地开始讲起。因此,如果各位觉得对这个知识点有足够的把握,就直接略过好了~我们所做的任何需要和远程设备进行交互的操作,并非是操作软件本身进行的数据通信。
2024-05-28 15:16:15 987
原创 使用 查询分离 后 从20s优化到500ms
查询分离从字面上来说非常容易理解,其实就是在写数据时保存一个备份数据到另外的存储系统,在查询时直接从另外的存储系统中获取数据,如下图:查询分离以上只是简单的架构图,其中有些细节还是需要深究,如下:什么时候触发查询分离?如何实现查询分离?查询数据的存储系统选型?查询数据如何使用?本篇文章介绍了表数据量大查询缓慢的一种解决方案:查询分离,但这也不是银弹,仍然是存在一些不足,比如表数据量大,写入缓慢怎么办?这个后面文章再介绍吧。
2024-05-28 15:13:47 640
原创 把Redis当作队列来用,真的合适吗?
好了,总结一下。这篇文章我们从「Redis 能否用作队列」这个角度出发,介绍了 List、Pub/Sub、Stream 在做队列的使用方式,以及它们各自的优劣。之后又把 Redis 和专业的消息队列中间件做对比,发现 Redis 的不足之处。最后,我们得出 Redis 做队列的合适场景。这里我也列了一个表格,总结了它们各自的优缺点。
2024-05-27 13:22:22 638
转载 SpringBoot接口防抖(防重复提交)的一些实现方案
设置额外选项:过期时间和SET_IF_ABSENT选项”,有些同学可能不太清楚SET_IF_ABSENT是个啥,这里我解释一下:SET_IF_ABSENT是 RedisStringCommands.SetOption 枚举类中的一个选项,用于在执行 SET 命令时设置键值对的时候,如果键不存在则进行设置,如果键已经存在,则不进行设置。从测试的结果上看,防抖是做到了,但是随着缓存消失、锁失效,还是可以发起同样的请求,所以要真正做到接口幂等性,还需要业务代码的判断、设置数据库表的UK索引等操作。
2024-05-27 13:21:17 728
原创 官方推出了 Spring AI 框架,Java集成 AI 不再是难事!
在软件开发的世界中,Java一直是企业级应用的主力军。而Spring框架,尤其是Spring Boot,以其生态系统的丰富性,为开发者提供了无与伦比的便利。现在,Spring Boot正迈向一个新的纪元——人工智-能的时代。Spring AI项目的推出,不仅标志着Spring生态的进一步扩展,也为广大Java开发者开启了一个全新的编程领域。图片Spring AI项目是为了解-决现代开发者在集成AI功能时遇到的挑战而诞生的。
2024-05-25 13:36:26 368
原创 Spring Boot 3.3 正式发布,王炸级更新,应用启动速度直接起飞!
Spring Boot 3.3 这个版本的变化还挺大的,很多功能都得到了增强,做技术的真要时刻保持对新技术的渴望啊,不然都跟不上时代的步伐了。
2024-05-25 13:35:48 983
原创 京东面试:SpringBoot同时可以处理多少请求?
Spring Boot 作为 Java 开发中必备的框架,它为开发者提供了高效且易用的开发工具,所以和它相关的面试题自然也很重要,咱们今天就来看这道经典的面试题:Spring Boot 同时可以处理多少个请求?准确的来说,Spring Boot 同时可以处理多少个请求,并不取决于 Spring Boot 框架本身,而是取决于其内置的 Web 容器(因为 Web 容器的行为,决定了 Spring Boot 的行为,所以咱们姑且认为两个问题的回答是一样的)。
2024-05-25 13:34:01 386
原创 全面解析服务容错中间件 Sentinel 持久化两种模式
到这儿,服务容错中间件Sentinel的两种持久化模式就已经介绍完了。下一篇将为大家带来Feign整合容错组件 Sentinel 的文章,敬请期待吧!
2024-05-24 13:35:12 426
原创 跨域问题的4种解决方案
跨域问题指的是在Web开发中,由于浏览器的同源策略限制,当一个网页尝试访问与它不同源(协议、域名或端口不同)的资源时,可能会遇到安全限制导致无法正常访问的问题。这种策略旨在防止恶意网站读取或修改其他网站的数据,保护用户信息安全。这样说可能有点抽象,下面具体展开说明。跨域问题指的是在Web开发中,由于浏览器的同源策略限制,导致无法正常访问的问题。主要原理就是请求参数。
2024-05-24 13:33:56 552
原创 项目终于用上了 Spring 状态机,太优雅了!
先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如自动门的状态就是两个 open 和 closed。状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。例如,根据自动门的运行规则,我们可以抽象出下面这么一个图。
2024-05-24 13:32:24 959
原创 用 explain 如何优化sql性能?
对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢查询,意味着接口响应慢、接口超时等问题。如果是高并发的场景,可能会出现数据库连接被占满的情况,直接导致服务不可用。慢查询的确会导致很多问题,我们要如何优化慢查询呢?主要解决办法有:监控sql执行情况,发邮件、短信报警,便于快速识别慢查询sql打开数据库慢查询日志功能简化业务逻辑代码重构、优化异步处理sql优化索引优化其他的办法先不说,后面有机会再单独介绍。
2024-05-23 13:57:03 1278
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人