自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 写出漂亮代码的45个小技巧,真好用

比如在项目中不同的类型的业务可能需要上传各种各样的附件,此时就可以定义好不同的一个附件的枚举,来区分不同业务的附件。不要在代码中直接写死,不定义枚举,代码阅读起来非常困难,直接看到数字都是懵逼的。。

2022-10-22 21:38:28 576 1

原创 撸了一个简易的配置中心,顺带整合到了SpringCloud,真香!!

随着历史的车轮不断的前进,技术不断的进步,单体架构的系统都逐渐转向微服务架构。虽然微服务架构有诸多优点,但是随着越来越多的服务实例的数量,配置的不断增多,传统的配置文件方式不能再继续适用业务的发展,所以急需一种可以统一管理配置文件应用,在此之下配置中心就诞生了。所以配置中心就是用来统一管理各种服务配置的一个组件,本质上就是一个web应用。

2022-10-22 21:31:31 476

原创 RocketMQ保姆级教程

不过这里我还建议再修改一处信息,因为Broker向NameServer进行注册的时候,带过去的ip如果不指定就会自动获取,但是自动获取的有个坑,就是有可能你的电脑无法访问到这个自动获取的ip,所以我建议手动指定你的电脑可以访问到的服务器ip。最后我再说一句,从文章整体也可以看出本文没有涉及太深入的一些机制和原理的讲解,比如消息是如何存储的,事务和延迟消息是如何实现的,主从是如何同步的等等,甚至压根就没提到队列这个词,主要是因为我打算后面再写一篇文章,来单独剖析这些机制和原理。...

2022-08-16 13:20:57 1085

原创 RocketMQ的push消费方式实现的太聪明了

最近仍然畅游在RocketMQ的源码中,这几天刚好翻到了消费者的源码,发现RocketMQ的对于push消费方式的实现简直太聪明了,所以趁着我脑子里还有点印象的时候,赶紧来写一篇文章,来掰扯一下,防止过两天就忘得一干二净了。...

2022-08-10 12:42:53 669 1

原创 @Async引发循环依赖问题的坑

前段时间,一个同事小姐姐跟我说她的项目起不来了,让我帮忙看一下,本着助人为乐的精神,这个忙肯定要去帮。于是,我在她的控制台发现了如下的异常信息:看到BeanCurrentlyInCreationException这个异常,我的第一反应是出现了循环依赖的问题。但是仔细一想,Spring不是已经解决了循环依赖的问题么,怎么还报这个错。于是,我就询问小姐姐改了什么东西,她说在方法上加了@Async注解。这里我模拟一下当时的代码,AService 和 BService 相互引用,AServi...

2022-07-12 13:18:47 472

原创 万字带你一网打尽异步神器CompletableFuture

最近一直畅游在RocketMQ的源码中,发现在RocketMQ中很多地方都使用到了CompletableFuture,所以今天就跟大家来聊一聊JDK1.8提供的异步神器CompletableFuture,并且最后会结合RocketMQ源码分析一下CompletableFuture的使用。我们都知道,Java中创建线程的方式主要有两种方式,继承Thread或者实现Runnable接口。但是这两种都是有一个共同的缺点,那就是都无法获取到线程执行的结果,也就是没有返回值。于是在JDK1.5 以后为了解决这种没有返

2022-07-07 10:08:19 471

原创 6000字|22张图 带你彻底弄懂Zookeeper分布式锁

前面我们剖析了Redisson的源码,主要通过对Redisson实现Redis分布式锁的15问,理清了Redisson是如何实现的分布式锁和一些其它的特性。这篇文章就来接着剖析Zookeeper分布式锁的实现框架Curator的源码,看看Curator是如何实现Zookeeper分布式锁的,以及它提供的哪些其它的特性。Curator框架是封装对于zk操作的api,其中就包括了对分布式锁的实现,当然Curator框架也包括其它的功能,分布式锁只是Curator的一部分功能。本文的目录跟Redisson的目录比

2022-06-13 23:55:44 118

原创 Redis分布式锁实现Redisson 15问(面试常问)

大家好,我是三友。在一个分布式系统中,由于涉及到多个实例同时对同一个资源加锁的问题,像传统的synchronized、ReentrantLock等单进程情况加锁的api就不再适用,需要使用分布式锁来保证多服务实例之间加锁的安全性。常见的分布式锁的实现方式有zookeeper和redis等。而由于redis分布式锁相对于比较简单,在实际的项目中,redis分布式锁被用于很多实际的业务场景中。redis分布式锁的实现中又以Redisson比较出名,所以本文来着重看一下Redisson是如何实现分布式锁的,以及R

2022-06-01 19:31:00 6304 3

原创 画图带你彻底弄懂三级缓存和循环依赖的问题

大家好。我们都知道,Spring可以通过三级缓存解决循环依赖的问题,这也是面试中很常见的一个面试题,本文就来着重讨论一下有关循环依赖和三级缓存的问题。一、什么是循环依赖大家平时在写业务的时候应该写过这样的代码。其实这种类型就是循环依赖,就是AService 和BService两个类相互引用。二、三级缓存可以解决的循环依赖场景如上面所说,大家平时在写这种代码的时候,项目其实是可以起来的,也就是说其实三级缓存是可以解决这种循环依赖的。当然除了这种字段注入,set注入也是可...

2022-05-23 13:09:20 423

原创 万字+28张图带你探秘小而美的规则引擎框架LiteFlow

大家好,今天给大家介绍一款轻量、快速、稳定可编排的组件式规则引擎框架LiteFlow。一、LiteFlow的介绍LiteFlow官方网站和代码仓库地址官方网站:https://yomahub.com/liteflowGitee托管仓库:https://gitee.com/dromara/liteFlowGithub托管仓库:https://github.com/dromara/liteflow前言在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻...

2022-05-16 13:20:32 1917

原创 7000字+24张图带你彻底弄懂线程池

大家好,我是三友。今天跟大家聊一聊无论是在工作中常用还是在面试中常问的线程池,通过画图的方式来彻底弄懂线程池的工作原理,以及在实际项目中该如何自定义适合业务的线程池。一、什么是线程池线程池其实是一种池化的技术的实现,池化技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务。使用线程池的好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗..

2022-05-04 11:51:52 600

原创 【SpringCloud原理】OpenFeign整合Ribbon来实现负载均衡源码剖析

大家好,前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理,如果小伙伴们对OpenFeign的动态代理生成原理和Ribbon的运行原理不熟悉的同学,可以关注微信公众号 三友的java日记,可以通过菜单栏查看,我已经整理好了。这篇文章来继续剖析SpringCloud组件原理,来看一看OpenFeign是如何基于Ribbon来实现负载均衡的,两组件是如何协同工作的。一、Feign动态代理调用实现rpc流程分析通过Feign客户端接口的动态代理生成原理讲解,我们可以清楚的知道,F

2022-05-01 21:51:26 2138

原创 【SpringCloud原理】Ribbon核心组件以及运行原理源码剖析

大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码。本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果不把Ribbon好好讲清楚,那么有些Ribbon的细节理解起来就很困难,所以我还是打算单独写一篇文章来剖析Ribbon的源码,这样在讲Feign整合Ribbon的时候,我就不再赘述这些细节了。好了,话不多说,直接进入主题。【springcloud系列文章】聊一聊nacos是如何进行服务注册的一文带你

2022-04-28 00:10:00 1567

原创 【SpringCloud原理】OpenFeign之FeignClient动态代理生成原理

前段时间我发布两篇关于nacos源码的文章,一篇是聊一聊nacos是如何进行服务注册的,另一篇是一文带你看懂nacos是如何整合springcloud -- 注册中心篇。今天就继续接着剖析SpringCloud中OpenFeign组件的源码,来聊一聊OpenFeign是如何工作的。至于其他组件的原理,我也会不断的剖析和更新,有需要的同学关注一下微信公众号 三友的java日记。一、@EnableFeignClinets作用源码剖析我们都知道,要使用feign,必须要使用@EnableFeignClin

2022-04-24 21:18:00 3863

原创 某小厂面试题:什么是虚假唤醒?

大家好,今天来跟大家聊聊某小厂的一道面试题,什么是虚假唤醒。生产者消费者模型引出虚假唤醒的问题说虚假唤醒之前,我们来测试一段经典的生产者和消费者代码。public class SpuriousWakeupDemo { public static void main(String[] args) throws Exception{ Producer producer = new Producer(); new Thread(() -> {

2022-04-20 22:01:54 442

原创 基于WebSocket实现一个简易的群聊功能

本文主要来讲解如何使用WebSocket来实现一个简易的群聊功能引入maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.2.5.RELEASE</version></dependency&g

2022-04-18 20:38:33 1684

原创 为什么Java有了synchronized之后还造了Lock锁这个轮子?

众所周知,synchronized和Lock锁是java并发变成中两大利器。但是为什么Java有了synchronized之后还是提供了Lock接口这个api,难道仅仅只是重复造了轮子这么简单么?本文就来探讨一下这个问题。谈到这个问题,其实很多同学第一反应都会说,Lock锁的性能比synchronized好,synchronized属于重量级的锁。但是在JDK 1.6版本之后,JDK对synchronized进行了一系列性能的优化,synchronized的性能其实有了大大的提升(如果不清楚的同学可以看

2022-04-18 20:36:29 283

原创 一文带你看懂Java中的Lock锁底层AQS到底是如何实现的

相信大家对Java中的Lock锁应该不会陌生,比如ReentrantLock,锁主要是用来解决解决多线程运行访问共享资源时的线程安全问题。那你是不是很好奇,这些Lock锁api是如何实现的呢?本文就是来探讨一下这些Lock锁底层的AQS(AbstractQueuedSynchronizer)到底是如何实现的。本文是基于ReentrantLock来讲解,ReentrantLock加锁只是对AQS的api的调用,底层的锁的状态(state)和其他线程等待(Node双向链表)的过程其实是由AQS来维护的加

2022-04-18 20:34:43 531

原创 synchronized真的很重么?

synchronized 是java中常见的保证多线程访问共享资源时的安全的一个关键字。很多人在讲到synchronized 时都说synchronized 是一把重量级的锁,那么synchronized 真的很重么?synchronized 在jdk 1.6以前(不包括1.6)的确是一把很重的锁,每次使用锁的时候都是直接向操作系统请求的,所以效率低,且占资源,但是在jdk1.6以后,jvm对synchronized 进行了优化,加入了锁升级的功能,使得synchronized 在一些情况下并不是一把重

2022-04-16 19:49:33 331

原创 面试官:JDK1.8 HashMap扩容rehash算法是如何优化的?

本文跟大家聊一聊一个常见的面试题,那就是JDK1.8 HashMap扩容rehash算法是如何优化的?众所周知HashMap的底层其实是一个数组,既然是一个数组,必然长度是固定的,也就一定存在扩容的问题。在JDK1.7的时候,是将数组扩容为两倍,然后将HashMap中所有的key重新进行hash寻址算法然后再放入到扩容后的新的数组的新的位置。但是从JDK1.8之后,对rehash进行了优化,减少了对key重新进行hash寻址算法的过程,具体怎么实现的,这就上源码。我们都知道HashMap扩容是通

2022-03-01 12:41:13 2985 1

原创 看Spring源码不得不会的@Enable模块驱动实现原理讲解

这篇文章我想和你聊一聊 spring的@Enable模块驱动的实现原理。在我们平时使用spring的过程中,如果想要加个定时任务的功能,那么就需要加注解@EnableScheduling,如果想使用异步的功能,那就要加@EnableScheduling注解,其实这类注解就是属于@Enable模块。那么@Enable模块到底有什么功能?模块是指具备相同领域的功能组件集合,组合所形成一个独立的单元。比如Web MVC模块、AspectJ代理模块Caching缓存模块,JMX(Java管理扩展)、As

2022-02-28 18:43:10 563

原创 从源码的角度带你看懂dubbo的spi机制

dubbo spi机制源码分析

2022-02-09 12:56:11 661

原创 一文带你看懂nacos是如何整合springcloud -- 注册中心篇

nacos整合springcloud源码分析

2022-02-02 15:25:06 1019

原创 聊一聊nacos是如何进行服务注册的

nacos服务注册源码分析

2022-01-26 08:54:07 5701 3

原创 面试常问的dubbo的spi机制到底是什么?(上)

dubbo spi 机制ExtensionLoader源码分析

2022-01-22 14:41:05 2323

原创 spring bean创建过程源码分析(下)

spring bean生命周期源码分析

2022-01-18 13:03:16 406

原创 spring bean创建过程源码分析(上)

spring的bean 生命周期源码讲解

2021-12-12 21:56:51 607 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除