自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入解析XXL-JOB任务调度执行原理

​ 在分布式系统中,定时任务调度是业务场景中不可或缺的一环。面对海量任务、复杂依赖和高可用性要求,传统单机调度方案逐渐显得力不从心。XXL-JOB作为一款开源的分布式任务调度平台,凭借其轻量级、高扩展性和易用性成为众多企业的选择。本文将深入剖析XXL-JOB的任务执行原理,揭示其背后的设计哲学。将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHand

2025-03-01 17:45:40 1295

原创 ThreadPoolExecutor状态流转和源码分析

线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。而本文描述线程池是JDK中提供的ThreadPoolExecutor类。

2024-09-06 16:22:04 425

原创 Spring-Cloud-OpenFeign源码解析-04-调用流程分析

调用execute方法时会通过`FeignBlockingLoadBalancerClient`完成负载均衡,找到对应的服务器,最后底层默认通过`HttpURLConnection`发起调用。

2024-05-27 17:47:22 678

原创 Spring-Cloud-OpenFeign源码解析-03-FeignClientFactoryBean

通过创建FeignClientFactoryBean对象,在@Autowired或者@Resource注入FeignClient实例的时候,实际上返回的是FactoryBean#getObject()方法创建的对象,底层通过JDK动态代理Proxy.newProxyInstance()返回代理对象,具体的实现逻辑在InvocationHandler的invoke方法中

2024-05-14 15:10:26 482

原创 Spring-Cloud-OpenFeign源码解析-02-OpenFeign自动装配

通过@EnableFeignClients中的@Import和FeignClientsRegistrar配置,当Spring容器扫描到带有 @Import 注解的类时,会调用实现了 ImportBeanDefinitionRegistrar接口的类registerBeanDefinitions方法。从而扫描配置包下面的所有@FeigntClient注解的接口,构建成一个FeignClientFactoryBean对象,包装为BeanDefinition并注入到Spri

2024-05-09 18:06:04 543

原创 Spring-Cloud-OpenFeign源码解析-01-OpenFeign简介

OpenFeign是一种声明式、模板化的HTTP客户端(仅在Application Client中使用)。声明式调用是指,就像调用本地方法一样调用远程方法,无需感知操作远程http请求。

2024-05-07 09:42:48 847 2

原创 RocketMQ消息队列-@RocketMQMessageListener实现原理

相当于定义一个消费者,定义了消费者的一些属性实现接口来处理具体消费逻辑每个消费者初始化了一个对象,该对象中包含消费实例和消费者的属性服务启动的时候开启一个线程轮训队列中的消息,如果没有就一直阻塞,拿到消息后,最终会调用自己实现的onMessage方法。

2023-09-02 16:12:56 10257 7

原创 Redisson分布式锁实现原理

tryLock()方法获取锁会失败,lock()方法获取锁一定会成功。不传锁的过期时间,会开启watchDog机制,每隔一段时间(默认10s),重置超时时间。

2023-07-21 11:28:21 654

原创 Redis分布式锁的演变历程

Redlock红锁是为了解决主从架构中当出现主从切换导致多个客户端持有同一个锁而提出的一种算法。大家可以看官方文档(),以下来自官方文档的翻译。想用使用 Redlock,官方建议在不同机器上部署 5 个 Redis 主节点,节点都是完全独立,也不使用主从复制,使用多个节点是为容错。一个客户端要获取锁有 5 个步骤客户端获取当前时间T1(毫秒级别);使用相同的key和value顺序尝试从N个Redis实例上获取锁。

2023-07-18 17:16:45 355

原创 线程池中的线程异常了会怎么处理

当执行方式是execute时,可以看到堆栈异常的输出。当执行方式是submit时,堆栈异常没有输出。但是调用方法时,可以捕获到异常。不会影响线程池里面其他线程的正常执行。线程池会把这个线程移除掉,并创建一个新的线程放到线程池中。

2023-07-07 16:59:07 562

原创 Thread、Runnable、Callable、Future、FutureTask之间的关系

Thread 和 Runnable 是一个策略模式,FutureTask 和 Callable 又是一个策略模式,最后通过 Runnable 和 FutureTask 的继承关系,将这 2 个策略模式组合在一起。

2023-06-29 15:19:37 376

原创 Nacos-04-@RefreshScope自动刷新原理

综上所述,来总结下@RefreshScope 实现流程1.需要动态刷新的类标注@RefreshScope 注解2.@RefreshScope 注解标注了@Scope 注解,并默认了ScopedProxyMode.TARGET_CLASS;属性,此属性的功能就是在创建一个代理,在每次调用的时候都用它来调用GenericScope get 方法来获取对象。

2023-05-20 15:24:05 4045

原创 Nacos-03-Nacos与Eureka的区别

Eureka保护方式:当在短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。默认模式是:客户端心跳上报Nacos实例健康状态,默认间隔5秒,Nacos在15秒内未收到该实例的心跳,则会设置为不健康状态,超过30秒则将实例删除。对于永久实例的的监看检查,Nacos 采用的是注册中心探测机制,注册中心会在永久服务初始化时根据客户端选择的协议类型注册探活的定时任务。Eureka只支持AP方式。

2023-05-10 11:20:12 568

原创 Nacos-02-Nacos的临时与持久化实例区别

SDK 的注册方式实际是通过 RPC 与注册中心保持连接(Nacos 2.x 版本中,旧版的还是仍然通过OpenAPI 的方式),客户端会定时的通过 RPC 连接向 Nacos 注册中心发送心跳,保持连接的存活。默认模式是:客户端心跳上报Nacos实例健康状态,默认间隔5秒,Nacos在15秒内未收到该实例的心跳,则会设置为不健康状态,超过30秒则将实例删除。Nacos会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,请求失败,但这样也⽐造成雪崩要好。

2023-05-10 10:16:03 1643

原创 Nacos-01-Nacos基本介绍

​ Nacos 中的一组配置集,是组织配置的维度之一。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。:Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

2023-05-09 18:10:01 914

原创 为什么我在公司里访问不了家里的电脑?

IPV4地址有限,但通过NAT路由器,可以使得整个内网N多台机器,对外只使用一个公网IP,大大节省了IP资源。内网机子主动连接公网IP,中间的NAT会将内网机子的内网IP转换为公网IP,从而实现内网和外网的数据交互。普通的NAT技术,只会修改网络包中的发送端和接收端IP地址,当内网设备较多时,将有可能导致冲突。因此一般都会使用NAPT技术,同时修改发送端和接收端的IP地址和端口。由于NAT的存在,公网IP是无法访问内网服务的,但通过内网穿透技术,就可以让公网IP访问内网服务。

2022-12-13 11:28:47 594

原创 为什么我们家里的IP都是192.168开头的?

IP地址就像快递里填的送件和收件地址,是一串编号,用于在纷繁复杂的网络世界中标识你的位置。IPv4有32位,最多能表示42亿个IP地址。为了更好的管理它们,教科书上出现过ABC这样的分类方式,并且在ABC类里还分为私有地址和公有地址。但目前流行使用CIDR的方式进行分类。为了表示更多主机,我们可以将网络分为广域网和局域网,广域网用公有地址,局域网使用私有地址。将公有地址乘上私有地址,就能表示远大于42亿台的机子。家庭网络较小,往往小区内几幢楼构成一个局域网,这几幢楼共用一个公有IP地址。

2022-12-08 19:34:20 1441

原创 用了TCP协议,就一定不会丢包吗?

首先,我们两个手机的绿皮聊天软件客户端,要通信,中间会通过它们家服务器。大概长这样。但为了简化模型,我们把中间的服务器给省略掉,假设这是个端到端的通信。且为了保证消息的可靠性,我们盲猜它们之间用的是TCP协议进行通信。为了发送数据包,两端首先会通过三次握手,建立TCP连接。一个数据包,从聊天框里发出,消息会从聊天软件所在的用户空间拷贝到内核空间的发送缓冲区(send buffer) ,数据包就这样顺着传输层、网络层,进入到数据链路层,在这里数据包会经过流控(qdisc),再通过RingBuffer发到物理层

2022-12-08 11:33:28 1797 1

原创 既然IP层会分片,为什么TCP层还要分段

我们知道网络就像一根管子,而管子吧,就会有粗细。一个数据包想从管子的一端到另一端,得过这个管子。但数据包的量有大有小,想过管子,数据包不能大于这根管子的粗细。问题来了,数据包过大时怎么办?答案比较简单。会把数据包切分小块。这样数据就可以由大变小,顺利传输。回去看下网络分层协议,数据先过传输层,再到网络层。这个行为在传输层和网络层都有可能发生。在传输层(协议)里,叫分段。在网络层(层),叫分片。那么不管是分片还是分段,肯定需要按照一定的长度切分。在里,这个长度是。在层里,这个长度是。那MSS和MTU是什么关系

2022-12-07 16:41:56 683 1

原创 为什么TCP会粘包

还记得四层网络协议长什么样子吗?四层网络模型每层各司其职,消息在进入每一层时都会多加一个报头,每多一个报头可以理解为数据报多戴一顶帽子。这个报头上面记录着消息从哪来,到哪去,以及消息多长等信息。比如,记录的是硬件的唯一地址,记录的是从哪来和到哪去,传输层头记录到是到达目的主机后具体去哪个进程。可以把网络比喻为一个水管,是有一定的粗细的,这个粗细由**网络接口层(数据链路层)*提供给*网络层,一般认为是的(1500),直接传入整个消息,会超过水管的最大承受范围,那么,就需要进行切片,成为一个个数据包,这样消息

2022-12-07 15:20:38 170

原创 路由器,集线器,交换机,网桥,光猫有啥区别?

网线替代了上面的灰色部分,实现物理层互联。如果想要两台电脑互联成功,还需要确保每一层所需要的步骤都要做到位,这样数据才能确保正确投送并返回。从数据链路层到物理层,数据会被转为01比特流。此时需要把比特流传到另一台电脑。通过一根网线,两段水晶头插入网口,把两台电脑连起来。A电脑和B电脑完成连接之后,可以尝试从A电脑中ping一下B,再从B电脑中ping一下A。如无意外,都能ping通。A给B发个消息,从应用层到数据链路层,会分别加上A和B的各种’'身份信息"。比如在传输层会加上A和B的应用端口号,在网络层加上

2022-12-06 16:53:50 939 1

原创 Spring-Cloud-Gateway-09-动态路由与自动刷新

大体的意思就是说,事件的发布者发布事件,事件的监听这对对应的事件进行监听,当监听到对应的事件时,就会触发调用相关的方法。因此,在事件处理中,事件是核心,是事件发布者和事件监听者的桥梁。回顾前几节的内容,我们的路由配置是在服务启动之后通过各个渠道(配置文件、注册中心、缓存等)加载进来的,那么如果我们想要改变路由的配置,不得不重启服务,这样一来就十分麻烦,所以就引申出了。两种不同的方法,有兴趣的同学可以去实现下,这里写的很粗糙,只是提供大致的方向,还有很多细节没有涉及。方法就是在事件发布的时候触发。

2022-10-26 17:34:49 5671

原创 Spring-Cloud-Gateway-08-路由的自动装配与加载流程

可以发现,RouteDefinitionLocator的作用是汇聚不同源的路由信息RouteDefinition,RouteLocator可以直接自定义路由,还可以通过RouteDefinitionLocator获取所有的配置的RouteDefinition,最终转换成Route供调用方RoutePredicateHandlerMapping获取。

2022-10-25 19:32:49 1092

原创 Spring-Cloud-Gateway-07-GatewayFilterChain的执行过程

的排序是在很前面的,按道理这种响应处理的类应该是在靠后才对,这里的设计比较巧妙。大家可以看到chain.filter(exchange).then(),意思就是执行到我的时候直接跳过下一个,等后面的过滤器都执行完后才执行这段逻辑。:从请求中获取body缓存到网关上下文,这样就可以直接从网关上下文中拿到请求参数,而不会出现从request中拿到之后还要回填到请求体的问题。:根据 lb:// 前缀过滤处理,做负载均衡,选择最终要调用的服务地址。:根据匹配的 Route ,计算请求的地址。:转发路由网关过滤器。

2022-10-20 15:44:13 1504 1

原创 Spring-Cloud-Gateway-06-DispatcherHandler调用解析

DispatcherHandler的注入在自动装配那一节已经说过了,忘记的同学可以重新会看一下。接口,则调用重写的getOrder方法,否则返回null,最后会返回。接口或者都没有实现,那么通过getOrder方法得到的值来排序。接下来我们来看下最核心的handle方法是如何具体处理请求的。接着回到前面的handle方法中,其中有一步就是用来排序的。就是我们需要的,通过名字可以猜到就是用来处理路由转发的。可以看到,这里初始化了核心的三部分内容,具体是。中,通过handle方法来处理具体的请求。

2022-10-20 10:09:39 901

原创 Spring-Cloud-Gateway-05-请求到HttpWebHandlerAdapter的调用链路

通过这些类的名字,我们可以发现,HttpHandler 往下就是具体的 Web 容器了,也就是说有具体的 Web 容器来接受请求,然后通过调用 HttpWebHandlerAdapter#handler 来进行后续的处理。这样我们也就明白了 为什么 HttpHandler 的具体实现是一个适配器,因为它要适配不同的底层容器,Spring webFLux 不仅仅可以使用 NettyReactiveWebServer 作为底层Web 容器,也可以使用 tomcat、jetty等 servlet 的容器。

2022-10-19 15:32:23 1040

原创 Spring-Cloud-Gateway-04-HttpWebHandlerAdapter到DispatcherHandler调用流程

具体实现类是ExceptionHandlingWebHandler,那么是怎么调用到DispatcherHandler中的?更加底层的一个 API,也就是说很可能是由 HttpHandler 来调用 WebHandler (请求由下往上),但是。通过调试可知,当存在后续filter时,会继续调用filter方法,否则直接调用this.handler.handle方法。类的handle方法会调用父类WebHandlerDecorator的handle方法。对象,通过分析得到持有的。

2022-10-18 16:46:30 1237

原创 Spring-Cloud-Gateway-03-网关自动装配

找到gateway的依赖,spring-cloud-starter-gateway点进去之后找到它的依赖从名称上可以判断spring-cloud-gateway-server是gateway的核心依赖,找到依赖包,看到如下结构spring.factories是一些自动装配的类,如下可以看到其中比较重要的是GatewayAutoConfiguration,负责很多bean的初始化,类声明如下:和分别是在之前和之后加载其中和算是比较重要的装配类先看WebFluxAutoConfiguration,类声明

2022-10-17 16:33:09 978 1

原创 Spring-Cloud-Gateway-02-请求调用基本流程

之后,会通过一些匹配条件,定位到真正的服务节点,并且在这个转发过程前后,进行一些细粒度的控制,其中。:GateWayFilter的实例,使用过滤器,可以在请求被路由之前或者之后对请求进行修改。:开发人员可以匹配HTTP请求中的内容(请求头和请求参数),如果请求断言匹配则进行路由。:构建网关的基础模块,由ID、目标URL、过滤器等组成。spring cloud gateway 官网的流程图。

2022-10-17 16:29:52 2625

原创 Spring-Cloud-Gateway-01-网关基本概念

的概念,网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。如果没有其他更优方法,我们只能记录每个微服务对应的地址,分别去调用,但是这样会有很多的问题和潜在因素。认证复杂,每个微服务可能存在不同的认证方式,客户端去调用,要去适配不同的认证,存在跨域的请求,调用链有一定的相对复杂性(防火墙 / 浏览器不友好的协议)。

2022-10-17 16:27:04 788

原创 Vector源码解析

Vector源码解析Vector结构类图Vector成员属性//数组元素protected Object[] elementData;//数组元素个数protected int elementCount;//增长系数protected int capacityIncrement;//序列号private static final long serialVersionUID = -2767605614048989439L;Vector构造方法//指定数组初始容量大小和增长系数

2021-03-11 15:30:31 730

原创 LinkedList源码分析

LinkedList源码分析LinkedList结构图LinkedList内部是一个链表的实现,相比使用数组作为底层数据结构的ArrayList来说,会更加耗费空间。但也正因为这个特性,它删除,插入节点很快,它额外实现了双端队列接口Deque,这个接口主要是声明了队头,队尾的一系列方法。LinkedList属性成员//元素个数transient int size = 0;/** * Pointer to first node. * Invariant: (first == null

2021-03-09 23:37:01 145

原创 ArrayList源码分析

ArrayList源码分析ArrayList继承结构extends AbstractList :继承了AbstractList。为什么要先继承AbstractList,而让AbstractList先实现List?而不是让ArrayList直接实现List?这里是有一个思想,接口中全都是抽象的方法,而抽象类中可以有抽象方法,还可以有具体的实现方法,正是利用了这一点,让AbstractList实现接口中一些通用的方法,而具体的类, 如ArrayList就继承这个AbstractList类,拿到一些通

2021-03-08 22:54:58 100

原创 SpringBoot源码最全解析

SpringBoot源码自动配置原理SpringBoot的核心注解@SpringBootApplication@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUS

2021-02-27 23:42:01 988

原创 HashMap底层源码透彻解析

HashMap源码解析HashMap简介HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据因为在查询上使用散列码(通过键生成一个数字作为数组下标,这个数字就是hashcode)所以在查询上的访问速度比较快,HashMap最多允许一对键值对的Key为Null,允许多对键值对的value为Null。它的线程不是安全的,在排序上面是无序的。HashMap继承关系HashMap主要成员变量 //Node可以看做就是一个节点,多个Node节点构成链表,当链表

2020-07-26 00:48:45 266

原创 GOF的23种设计模式(8)—代理模式

代理模式静态代理角色分析:抽象角色:一般会使用接口或者抽象类来解决真实角色:被代理的角色代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作客户:访问代理对象的人代理模式的好处可以使真实角色的操作更加纯粹,不用关注一些公共的业务公共也就是交给代理角色,实现了业务的分工公共业务发生扩展的时候,方便集中管理缺点:一个真实角色就会产生一个代理角...

2020-04-15 01:52:18 238

原创 GOF的23种设计模式(7)—桥接模式

桥接模式定义将抽象部分和它的实现部分分离,使它们都可以独立的变化。处理多层继承结构、处理多维变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。优点比多继承的方案更好,极大的减少了子类的个数,从而降低管理和维护的成本。提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合开闭原则。缺点增加...

2020-04-15 00:28:34 199

原创 GOF的23种设计模式(6)—适配器模式

适配器模式核心角色目标接口(Target):客户所期望的接口(接口、抽象类或具体类)。适配的类(Adaptee)。适配器(Adapter):通过包装适配的类,把原接口转换成目标接口。分类使用继承实现:Adapter继承Adaptee。使用关联实现:Adapter持有Adaptee的引用,Adapter可以继承其他类,更灵活。适用场景系统需要使用一些现有的类...

2020-04-14 23:51:11 188

原创 GOF的23种设计模式(5)—原型模式

原型模式定义通过new创建对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。就是Java中的克隆技术,以某个对象为原型,复制出新的对象。优势:效率高,避免重新执行构建过程。克隆类似于new,但不同于new。new创建新的对象属性采用默认值。克隆出的对象属性完全与原型对象相同,并且克隆出的新对象改变不会影响原型对象,然后再修改克隆对象的值。核心Clonable接...

2020-04-14 22:32:49 208

原创 GOF的23种设计模式(4)—建造者模式

建造者模式定义构建一个复杂的产品时,需要解决“如何装配子组件”的问题。分离了对象子组件的单独构建(Builder)和装配(Director),从而构造出复杂对象。由于实现了构建和装配的解耦。不同的构建器、相同的装配,或者相同的构建器、不同的装配,都可以创建不同的对象。建造者模式一般与工厂模式搭配,由工厂模式创建子组件,再有建造者模式装配。优点产品的建造...

2020-04-14 21:50:04 547

空空如也

空空如也

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

TA关注的人

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