Java
文章平均质量分 84
Java学习交流
小小怪下士 XIA
20年码农
展开
-
满分Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC
最近小编整理了一下一线架构师的Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC,分享给大家一起学习一下~Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spri原创 2023-05-24 16:07:27 · 603 阅读 · 1 评论 -
GitHub星标70k,堪称2023年最全Java面试手册(性能优化+微服务架构+并发编程+开源框架)
众所周知RocketMQ消息队列一直是由阿里云作为此技术的天花板,消息队列RocketMQ版(原名开放消息服务,简称ONS)是阿里云基于Apache RocketMQ构建的低延迟、高并发、高可用、高可靠的分布式消息中间件。原创 2023-05-13 14:52:04 · 90 阅读 · 0 评论 -
限时白嫖,2000多题,阿里内产“2023年Java面试手册”开源
虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因:第一,“知其然不知其所以然”。做了多年技术,开发了很多业务应用,但似乎并未思考过种种技术选择背后的逻辑。所以,他无法向面试官展现出自己未来技术能力的成长潜力。面试官也不会放心把具有一定深度的任务交给他。第二,知识碎片化,不成系统。原创 2023-03-30 14:35:09 · 52 阅读 · 0 评论 -
好家伙!1700多道题,美团内产“2023年Java面试手册”开源
从时间节点上来看,每年的3,4月是一年中跳槽的黄金季!以BATJ为代表的互联网大厂,无论是薪资待遇、还是平台和福利,都一直是求职者眼中的香饽饽,“大厂经历” 在国内就业环境中无异于一块金字招牌。在这金三银四的时间里,进大厂,是绝佳机会,也是大部分小伙伴的第一选择!很多想进大厂的朋友都在问,该怎么备战 2023年春招?为此我专门找了一份分享给大家,内容涵盖:计算机基础、Java基础、JVM、spring、算法、微服务、分布式、大厂面经、技术脑图等等...质量非常高!!原创 2023-03-16 09:26:04 · 221 阅读 · 0 评论 -
深入分析Java的序列化与反序列化
1、如果一个类想被序列化,需要实现Serializable接口。否则将抛出异常,这是因为,在序列化操作过程中会对类型进行检查,要求被序列化的类必须属于Enum、Array和Serializable类型其中的任何一种。2、在变量声明前加上该关键字,可以阻止该变量被序列化到文件中。3、在类中增加writeObject 和 readObject 方法可以实现自定义序列化策略。原创 2023-03-09 16:19:39 · 621 阅读 · 0 评论 -
【多线程与高并发】- 浅谈volatile
volatile是Java语言中的一种轻量级的同步机制,它可以确保共享变量的内存可见性,也就是当一个线程修改了共享变量的值时,其他线程能够立即知道这个修改。跟synchronized一样都是同步机制,但是相比之下,synchronized属于重量级锁,volatile属于轻量级锁。JMM就是Java内存模型),是Java虚拟机规范的一种内存模型,屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果。原创 2023-03-09 16:19:02 · 418 阅读 · 0 评论 -
线程池的线程是如何复用的
进程和线程的关系相信大家都知道,这里我就不做过多的解释了,既然一个进程是由多个线程组成的,那么线程池又是由若干个线程队列组成的,在并发量比较高的情景下,我们通常会去创建线程池就执行任务,而不单一的创建多个线程去执行任务,因为线程的创建的一系列动作,是需要资源开销的,如果频繁的对线程创建销毁,其实本身是一种很浪费资源的,就更谈不上提高效率了。原创 2023-03-09 16:14:50 · 653 阅读 · 0 评论 -
Java8中那些方便又实用的Map函数
java8之后,常用的Map接口中添加了一些非常实用的函数,可以大大简化一些特定场景的代码编写,提升代码可读性,一起来看看吧。一直以来,java因代码编写太繁琐而被开发者们所广泛诟病,但从java8开始,从Map、Stream、var、multiline-string再到record,java在代码编写层面做了大量的简化,java似乎开窍了🤔。原创 2023-03-09 16:14:02 · 653 阅读 · 0 评论 -
Spring Boot 实现接口幂等性的 4 种方案
在HTTP/1.1中,对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外),即第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。这里的副作用是不会对结果产生破坏或者产生不可预料的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。幂等性是开发当中很常见也很重要的一个需求,尤其是支付、订单等与金钱挂钩的服务,保证接口幂等性尤其重要。原创 2023-03-09 16:12:58 · 482 阅读 · 0 评论 -
Java代码是如何被CPU狂飙起来的?
无论是刚刚入门Java的新手还是已经工作了的老司机,恐怕都不容易把Java代码如何一步步被CPU执行起来这个问题完全讲清楚。但是对于一个Java程序员来说写了那么久的代码,我们总要搞清楚自己写的Java代码到底是怎么运行起来的。另外在求职面试的时候这个问题也常常会聊到,面试官主要想通过它考察求职同学对于Java以及计算机基础技术体系的理解程度,看似简单的问题实际上囊括了JVM运行原理、操作系统以及CPU运行原理等多方面的技术知识点。我们一起来看看Java代码到底是怎么被运行起来的。原创 2023-03-08 10:41:50 · 14634 阅读 · 10 评论 -
八股文系列:Java虚拟机(JVM)
类加载通过后,接下来分配内存。双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。原创 2023-03-08 10:37:40 · 506 阅读 · 0 评论 -
Nacos 注册服务源码分析
本篇文章只写了client是如何请求服务端的,整理还是比较清晰易懂的。一般我们使用会依赖Nacos客户端,由客户端去访问服务端。而会定义顶层接口,决定何时去调用服务端。关键在于服务端如何处理客户端的请求,这也是Nacos的核心所在,此部分的内容也会在后续更新,敬请期待。原创 2023-03-08 10:34:26 · 549 阅读 · 0 评论 -
一文讲清楚SpringBoot六种读取配置方式
本文梳理了SpringBoot六种读取配置方式,大家项目中可以进行灵活组合和应用,希望本文对大家有所帮助。原创 2023-03-08 10:33:51 · 562 阅读 · 0 评论 -
Spring源码解析-Spring 循环依赖
⼀个或多个对象之间存在直接或间接的依赖关系,这种依赖关系构成⼀个环形调⽤,有下⾯ 3 种⽅式。我们看⼀个简单的 Demo,对标“情况 2”。@Service@Autowired@Service@Autowired复制代码这是⼀个经典的循环依赖,它能正常运⾏,后⾯我们会通过源码的⻆度,解读整体的执⾏流程。⼀级缓存:为“Spring 的单例属性”⽽⽣,就是个单例池,⽤来存放已经初始化完成的单例 Bean;⼆级缓存:为“解决 AOP”⽽⽣,存放的是半成品的 AOP 的单例 Bean;原创 2023-03-08 10:32:45 · 548 阅读 · 0 评论 -
要理解网络,其实不就是理解这三张表吗
下面的流程图是对上述过程的汇总,可以点开下面的大图查看。其中有几个细节要理解,对理解整个过程有很大帮助。1、链路层的以太网数据帧必须要有目的端的 MAC 地址,而且必须是下一跳的 MAC 地址。别问为什么,协议就是这么规定的。2、正因为链路层以太网帧必须是下一跳MAC地址,所以整个传输过程中,以太网帧是一直解包、重组的,目的就是把下一跳MAC地址重组进去。原创 2023-02-26 11:47:39 · 1517 阅读 · 0 评论 -
阿里是如何做Code Review的?
但代码其实不是写给自己看的,是写给下一任看的,就像经常被调侃的“程序员不喜欢写注释,更不喜欢别人不写注释”,代码风格的统一更有助于代码的可读性及继任者的快速上手。分页size的大小并没有一个固定的标准,取决于业务需求、数据量及数据库等,但动辄几千上万的分页size,会带来性能瓶颈,而大量的慢SQL不但影响客户体验,对系统稳定性也是极大的隐患。上面的加锁和解锁都是手动编写,而这两个动作一般是成对出现的,在手动编写时容易发生遗漏解锁而导致线上问题,推荐封装一个加解锁的方法来实现,会更加安全和便利。原创 2023-02-25 11:52:36 · 1959 阅读 · 0 评论 -
SQL性能优化的47个小技巧,果断收藏!
1、先了解MySQL的执行过程了解了MySQL的执行过程,我们才知道如何进行sql优化。客户端发送一条查询语句到服务器;服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据;未命中缓存后,MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树,MySQL解析器将使用MySQL语法进行验证和解析。例如,验证是否使用了错误的关键字,或者关键字的使用是否正确;预处理是根据一些MySQL规则检查解析树是否合理,比如检查表和列是否存在,还会解析名字和别名,然后预处理器会验证权限;原创 2023-02-25 11:50:21 · 1529 阅读 · 0 评论 -
从 JDK 8 到 JDK 18,Java 垃圾回收的十次进化
对年长对象进行增量回收,比一次性回收(如 Parallel GC 的做法)的效率略低,因为跟踪对象关系图总会不准确,而且增量回收所需的数据结构的管理也需要额外的时间和空间开销,但这种方式可以有效减小暂停的时长。图 4 展示了从 JDK 8 到 JDK 18 中,G1 的原生内存占用情况,测试应用程序实现了一个对象缓存:对象表示缓存信息,对象可以被查询、添加,并以最近最少使用(LRU)的方式从一个更大的堆中删除。在今天的计算机体系架构中,减小元数据意味着更小的内存访问开销,能够带来性能的提升。原创 2023-02-25 11:48:48 · 739 阅读 · 0 评论 -
28张图讲解支付系统的通用设计,漂亮!
支付永远是一个公司的核心领域,因为这是一个有交易属性公司的命脉。那么,支付系统到底长什么样,又是怎么运行交互的呢?抛开带有支付牌照的金融公司的支付架构,下述链路和系统组成基本上符合绝大多数支付场景。其实整体可以看成是交易核心+支付核心 两个大系统。交易系统关联了业务场景和底层支付,而支付系统完成了调用支付工具到对账清算等一系列相关操作。下面我们就来一起看下各个系统的核心组成和交互。原创 2023-02-25 11:47:11 · 1452 阅读 · 0 评论 -
SpringBoot 面试问答总结(VIP典藏版)
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用Spring 的难度, 简省了繁重的配置,提供了各种启动器,使开发者能快速上手。Spring JavaConfig 是 Spring 社区的产品,Spring 3.0 引入了他,它提供了配置 Spring IOC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:面向对象的配置。原创 2023-02-25 11:46:07 · 514 阅读 · 0 评论 -
Redis 被问麻了...
要注意,Redis 对 RDB 的执行频率非常重要,因为这会影响快照数据的完整性以及 Redis 的稳定性,所以在 Redis 4.0 后,增加了 AOF 和 RDB 混合的数据持久化机制: 把数据以 RDB 的方式写入文件,再将后续的操作命令以 AOF 的格式存入文件,既保证了 Redis 重启速度,又降低数据丢失风险。额,这个主要是由于Redis在写入日志之前,不对命令进行语法检查,所以只记录执行成功的命令,避免出现记录错误命令的情况,而且在命令执行后再写日志不会阻塞当前的写操作。原创 2023-02-24 11:45:01 · 15364 阅读 · 13 评论 -
Spring Bean 生命周期,好像人的一生
到这,这篇Bean的生命周期文章就走向destory了,自定义destory方法——回顾一下这篇文章的“一生”。Bean的生命周期大致可以分为四个阶段:实例化、属性赋值、初始化、销毁,对应人生的出生、登记、成长、离世。Bean生命周期中可以有很多扩展,就像人生的走向,会受很多影响,社会的环境、自身的选择、自己的努力。原创 2023-02-24 11:44:11 · 369 阅读 · 0 评论 -
聊聊动态线程池的9个场景(改进版)
hippo4j 通过对 JDK ThreadPoolExecutor 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。小贴士:hippo4j 不止于 Java ThreadPoolExecutor 的增强,DubboRabbitMQRocketMQHystrixTomcatJettyUndertow等框架线程池也都有进行监控和动态变更。在系统开发的过程中,因为涉及到多人协作,难免会出现信息不互通的情况。在同一个系统,对于线程池来说,常见的是线程池随意定义。原创 2023-02-24 11:43:58 · 400 阅读 · 0 评论 -
同事每天早下班,原来是用了这8个开发工具
而Maven Helper就是一款Java开发必不可少的Maven管理插件,没有它之前我们需要人工手动的去分析jar包版本冲突,费时又费力,通过Maven Helper可以一键找到工程中相冲突的jar包,然后通过exclude将冲突的jar包进行排除,在对应的pom文件中会自动添加,如此我们可以快速地去除工程中的冲突的jar包,让技术人员可以更加关注业务功能实现,尽可能的不被这些琐事浪费时间。实际上在分析内存溢出的时候,我们可以借助于内存分析工具来进行,提高我们定位问题的效率。原创 2023-02-24 11:41:20 · 370 阅读 · 0 评论 -
缓存数据丢了,原来是Redis持久化没玩明白
本文主要分析了Redis AOF、RDB以及混合持久化的内存数据持久化的机制原理,同时分析了两种持久化方式的优点以及缺点。我想只有理解了中间件的特性机制原理,知道了特性的长处以及不足我们才能设计适合我们平台的缓存数据持久化策略,从而提升平台的稳定性。原创 2023-02-24 11:40:29 · 499 阅读 · 0 评论 -
下一代MQ中间件,不来了解下?
系统架构功能特色租户和命名空间(namespace)是 Pulsar 支持多租户的两个核心概念。在租户级别,Pulsar 为特定的租户预留合适的存储空间、应用授权与认证机制。在命名空间级别,Pulsar 有一系列的配置策略(policy),包括存储配额、流控、消息过期策略和命名空间之间的隔离策略。Pulsar 做了队列模型和流模型的统一,在 Topic 级别只需保存一份数据,同一份数据可多次消费。以流式、队列等方式计算不同的订阅模型大大提升了灵活度。原创 2023-02-24 11:38:54 · 271 阅读 · 0 评论 -
没想到字符串分割还能这样玩
字符串分割在我们工作中很常用,但大部分情况我们只会使用, 看到其他的一些情况,是不是感觉有点有趣,没想到字符串分割还能这样玩。原创 2023-02-24 11:38:05 · 345 阅读 · 0 评论 -
百万数据excel导出功能如何实现?
最后用两张图,总结一下excel异步导数据的流程。如果是使用mq导数据:如果是使用job导数据:这两种方式都可以,可以根据实际情况选择使用。我们按照这套方案的开发了代码,发到了pre环境,原本以为会非常顺利,但后面却还是出现了性能问题。后来,我们用了两招轻松解决了性能问题。原创 2023-02-24 11:38:52 · 452 阅读 · 0 评论 -
这可能是Spring Boot Starter 讲的最清楚的一次了
前面我们简单介绍了如何使用消息中间件,但是在项目中那样使用,显然是不太好的,不管从易用性和扩展性来看,都是远远不够, 为了和springboot项目集成,写一个pulsar-spring-boot-starter是非常有必要的,在此之前,我们先看看一个starter需要些什么。原创 2023-02-24 11:38:10 · 430 阅读 · 0 评论 -
有了这 4 款工具,老大再也不怕我写烂SQL了
第二部分:查询分组统计结果 Rank:所有语句的排名,默认按查询时间降序排列,通过--order-by指定 Query ID:语句的ID,(去掉多余空格和文本字符,计算hash值) Response:总的响应时间 time:该查询在本次分析中总的时间占比 calls:执行次数,即本次分析总共有多少条这种类型的查询语句 R/Call:平均每次执行的响应时间 V/M:响应时间Variance-to-mean的比率 Item:查询对象。](中括号有叹号的项)例如[!针对潜在的问题,给出改进的建议。原创 2023-02-10 13:30:59 · 552 阅读 · 0 评论 -
Redis 分布式基础——主从复制其实挺简单
所谓无盘复制是指主服务器直接通过套接字 socket 将快照内容发送到从节点,生成快照是一个遍历的过程,主节点会一边遍历内存,一边将序列化的内容发送到从节点,从节点还是跟之前一样,先将接收到的内容存储到磁盘文件中,再进行一次性加载。此外,在主节点中使用 info Replication,可以看到其从节点的状态中的 lag 值,代表的是主节点上次收到该 REPLCONF ACK 命令的时间间隔,在正常情况下,该值应该是 0 或 1。在主库将数据同步给从库的过程中,主库不会被阻塞,仍然可以正常接收请求。原创 2023-02-10 13:30:53 · 1502 阅读 · 0 评论 -
API 面试四连杀:接口如何设计?安全如何保证?签名如何实现?防重如何实现?
Token:访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证,减少用户名和密码的传输次数。一般情况下客户端(接口调用方)需要先向服务器端申请一个接口调用的账号,服务器会给出一个appId和一个key, key用于参数签名使用,注意key保存到客户端,需要做一些安全处理,防止泄露。原创 2023-02-10 13:29:16 · 1961 阅读 · 1 评论 -
面试官问:为什么SpringBoot的 jar 可以直接运行?
LaunchedURLClassLoader重写了loadClass方法,也就是说它修改了默认的类加载方式(先看该类是否已加载这部分不变,后面真正去加载类的规则改变了,不再是直接从父类加载器中去加载)。return cls;加载规则:如果根类加载器存在,调用它的加载方法。这里是根类加载是ExtClassLoader。原创 2023-02-10 13:28:21 · 6411 阅读 · 2 评论 -
Redis 哨兵模式
如果从库的优先级都一样,那么哨兵开始第二轮打分。一旦哨兵判断主库下线了,就会开始选择新主库,并让从库和新主库进行数据同步,这个过程本身就会有开销,例如,哨兵要花时间选出新主库,从库也需要花时间和新主库同步。(哨兵节点本质上是特殊的 Redis 节点,所以配置几乎没什么差别,只是在端口上做区分就好,每个哨兵只需要配置监控主节点,就可以自动发现其他的哨兵节点和从节点),即使有哨兵实例出现故障挂掉了,其他哨兵还能继续协作完成主从库切换的工作,包括判定主库是不是处于下线状态,选择新主库,以及通知从库和客户端。原创 2023-02-10 13:28:16 · 1072 阅读 · 0 评论 -
23 种设计模式的通俗解释,看完秒懂
跟 MM 交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的 MM 就会说 “有事情啦”,对你不讨厌但还没喜欢上的 MM 就会说 “好啊,不过可以带上我同事么?MM 最爱听的就是「我爱你」这句话了,见到不同地方的 MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到 MM 我只要按对应的键,它就能够用相应的语言说出「我爱你」这句话了,国外的 MM 也可以轻松搞掂,这就是我的「我爱你」builder。原创 2023-02-10 13:26:51 · 819 阅读 · 0 评论 -
图解 git 常用命令
本文图解 Git 中的最常用命令,如果你稍微理解 Git 的工作原理,这篇文章能够让你理解的更透彻。原创 2023-02-10 13:23:57 · 402 阅读 · 0 评论 -
聊聊分布式锁——Redis和Redisson的方式
分布式~~锁,要这么念,首先得是『分布式』,然后才是『锁』分布式:这里的分布式指的是分布式系统,涉及到好多技术和理论,包括CAP 理论、分布式存储、分布式事务、分布式锁...分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。锁:对对,就是你想的那个,Javer 学的第一个锁应该就是Java 初级面试问题,来拼写下赛克瑞纳挨日的线程锁。原创 2023-02-10 13:22:16 · 3712 阅读 · 0 评论 -
Redis为什么变慢了-常见延迟问题定位与分析
以上我们总结了Redis中常见的可能导致延迟增大甚至阻塞的场景,这其中既涉及到了业务的使用问题,也涉及到Redis的运维问题。可见,要想保证Redis高性能的运行,其中涉及到CPU、内存、网络,甚至磁盘的方方面面,其中还包括操作系统的相关特性的使用。作为开发人员,我们需要了解Redis的运行机制,例如各个命令的执行时间复杂度、数据过期策略、数据淘汰策略等,使用合理的命令,并结合业务场景进行优化。作为DBA运维人员,需要了解数据持久化、操作系统fork。原创 2023-02-10 13:19:00 · 316 阅读 · 0 评论 -
正面刚ChatGPT,谷歌发布Bard! AI们要battle起来了?
不过这次发布的Bard,是向测试人员开放,在未来的几周才可能与公众见面。值得注意的是,Bard 将使用“轻量级”版本的LaMDA,“需要的计算能力要比完整版低得多”。还能帮助人们做一些复杂的任务,包括”计划朋友的新生儿派对“、”比较两部奥斯卡提名的电影“和”根据冰箱里的食物给出一些午餐点子”等。而从皮柴博文里的图片来看,Bard能做的事除了简化复杂的主题,比如”向9岁的孩子解释NASA的韦伯望远镜带来的新发现“。将来可能会出现更多类ChatGPT的对话机器人的情况,但Bard的情况也让更多人意识到,原创 2023-02-09 15:38:16 · 3160 阅读 · 0 评论 -
求你了,不要再在对外接口中使用枚举类型了!
还有一种看起来比较特殊,但是实际上比较常见的情况,就是有的时候一个接口的声明在A包中,而一些枚举常量定义在B包中,比较常见的就是阿里的交易相关的信息,订单分很多层次,每次引入一个包的同时都需要引入几十个包。而参数的构造过程是由B系统完成的,如果B系统使用到的是一个旧的二方库,使用到的枚举自然是已有的一些,新增的就不会被用到,所以这样也不会出现问题。比如前面的例子,B系统在调用A系统的时候,构造参数的时候使用到AType的时候就只有P_T和A_B两个选项,虽然A系统已经支持P_M了,但是B系统并没有使用到。原创 2023-02-09 15:35:15 · 608 阅读 · 0 评论