自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MyBatis源码解析之加载 mybatis-config

在 MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息(包括属性配置、别名配置、拦截器配置、环境(数据源和事 务管理器)、Mapper配置等),解析后的配置信息会形成相应的对象并保存到 Configuration 对象中。

2023-06-30 12:57:37 277

原创 spring源码 IoC 之xml配置bean注册解析的 BeanDefinitions

IoC 容器的初始化过程分为三步骤:Resource 定位、BeanDefinition 的载入和解析,BeanDefinition 注册1、Resource 定位。我们一般用外部资源来描述 Bean 对象,所以在初始化 IoC 容器的第一步就是需要定位这个外部资源2、BeanDefinition 的装载和解析。装载就是 BeanDefinition 的载入。

2023-06-07 23:01:19 630 1

原创 springboot启动源码分析

1、初始化SpringApplication 从spring.factories 读取 listener ApplicationContextInitializer。2.运行run方法3.读取 环境变量 配置信息等4. 创建springApplication上下文:ServletWebServerApplicationContext5. . 预初始化上下文6.调用refresh 加载ioc容器 加载所有的自动配置类7、创建servlet容器。

2023-06-06 22:29:48 512

原创 springboot自动配置源码解析

使用springboog的时候引入starter就自动为我们加载,例如我们引入 spring-boot-starter-web 之后,就自动引入了 Spring MVC 相关的 jar 包,从而自动配置 Spring MVC。

2023-06-06 21:49:59 540

原创 springboot源码分析-jar启动

Spring Boot 提供了 Maven 插件 spring-boot-maven-plugin,可以方便的将 Spring Boot 项目打成 jar 包或者 war 包。springboot通过mvn打包插件打包后,执行java -jar命令后会执行MANIFEST.MF文件的mainclass并加载lib目录下嵌套的jar包和calss目录下的文件,最后找打springboot项目的真正启动类,也就是startcalss对应的启动类。

2023-06-06 20:56:48 629

原创 SpringMvc源码分析

这四个方法,都是直接调用 #processRequest(HttpServletRequest request, HttpServletResponse response) 方法,处理请求。从图中可以看到请求首先是被 DispatcherServlet 所处理,但是实际上,FrameworkServlet 先被触发。最终这些方法都会调用processRequest(request, response)方法。用户的请求,是如何被 DispatcherServlet 处理的。

2023-05-29 12:41:52 985 1

原创 TreeSet源码分析

TreeSet 是基于 TreeMap 的 Set 实现类。

2023-05-18 08:06:59 375

原创 nacos服务端源码集群同步源码分析

ServerStatusReporter 是 ServerListManager的内部类通过@Component注解被解析到spring容器中再通过@PostConstruct初始化执行init方法上边代码启动了一个延时2秒的线程上边代码其实就是获取当前服务的所有实例然后排出当前节点的实例同步集群其他节点状态最后在finally中重新注册延时任务线程进行状态同步。

2023-05-17 16:09:49 760

原创 nacos注册中心源码分析二之服务发现

服务发现是客户端发起负载均衡(feign)调用接口的时候内部第一次调用nacos服务端接口的时候去调用的后续调用基本上都是从客户端的缓存列表里边去取,拿不到才会向服务端发起调用如果想看这一块代码可以看下ribbion源码分析。

2023-05-17 13:37:37 527

原创 nacos注册中心源码分析一之服务注册、服务心跳

Nacos的客户端是基于SpringBoot的自动装配实现的看下依赖包下边的spring.factories文件。

2023-05-17 10:14:28 1001

翻译 TreeMap源码分析

TreeMap 基于红黑树实现,这为 TreeMap 保持键的有序性打下了基础。总的来说,TreeMap 的核心是红黑树,TreeMap因为是通过红黑树实现,红黑树结构天然支持排序,默认情况下通过Key值的自然顺序进行排序。

2023-05-16 08:13:48 577

原创 深入了解ribbon源码

RibbonApplicationContextInitializer实现了 ApplicationListener 所以springboot启动的时候会去调用onApplicationEvent 方法。

2023-05-15 17:02:39 1275

原创 ribbon的使用

Ribbon是Netflix公司提供的一个基于HTTP和TCP的客户端负载均衡工具。Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。集中式负载均衡集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载。

2023-05-15 09:52:10 1381

原创 Spring Cloud LoadBalancer是什么?

Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器, 用来替代 Ribbon。

2023-05-15 08:51:33 1307

原创 openfeign源码解析

我们先看下添加的依赖可以看到starter?看到这个第一反应就是和springboot的自动装配联系在一起,我们去看下fascories文件FeignAutoConfiguration 自动装配 FeignContext 和 Targeter,以及 Client 配置。FeignRibbonClientAutoConfiguration 实现负载均衡,负载均衡是在 Client 这一层实现的。org.springframework.cloud.openfeign.encoding.FeignAccept

2023-05-13 13:49:12 1836

原创 gateway与zuul的区别与联系

本质上就是一个同步 Servlet,每来一个请求,zuul会专门分配一个线程去处理,然后转发到后端服务,后端再启线程处理请求,后端处理时网关的线程会阻塞,当请求数量比较大时,很容易造成线程池被沾满而无法接受新的请求,Netflix 为此还专门研发了Hystrix熔断组件来解决慢服务耗尽资源问题。zuul是netflix公司的项目,本质上是web servlet,基于JavaEE Servlet技术栈,使用阻塞API,处理的是http请求,没有提供异步支持,不支持任何长连接,比如websocket。

2023-05-13 08:40:37 2109

原创 zuul源码分析

/</</我们去到zuul的包下下边的spring.factories文件中可以看到文件内容这两个类的区别是生效条件点进去看看只干了又1件事就是为我们导入mark使启动来生效上边代码就是初始化过滤器其中会把所有继承了ZuulFilter 并被spring管理的过滤器全部加在进来,这是spring 实现的接下来问题来了,当我用postman请求zuul,会被哪个类处理呢?

2023-05-13 00:45:00 1656

原创 HashSet源码解析

HashSet 是基于 HashMap 的 Set 实现类。

2023-05-12 14:12:21 1553

原创 网关zuul的使用

网关配置方式有多种,默认、URL、服务名称、排除|忽略、前缀。网关配置没有优劣好坏,应该在不同的情况下选择合适的配置方案。zuul网关其底层使用ribbon来实现请求的路由,并内置Hystrix,可选择性提供网关fallback逻辑。使用zuul的时候,并不推荐使用Feign作为application client端的开发实现。毕竟Feign技术是对ribbon的再封装,使用Feign本身会提高通讯消耗,降低通讯效率,只在服务相互调用的时候使用Feign来简化代码开发就够了。

2023-05-12 09:32:36 1821

原创 gateway的使用

网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul。相比 Zuul 来说,Spring Cloud Gateway 提供更优秀的性能,更强大的有功能。SpringCloud Gateway 是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关。

2023-05-12 00:30:00 646

原创 GateWay源码解析

springboot 在引入一个新的组件时,一般都会有对应的XxxAutoConfiguration类来对该组件进行配置,GateWay也不例外,在引入了以下配置后,就会生成对应的GatewayAutoConfiguration自动配置类从配置类上的注解,可以了解到spring.cloud.gateway.enabled配置项必须为true,自动配置才生效,默认为true在使用Gataway之前,必须存在WebFlux 和 HttpHandler 组件。

2023-05-11 15:23:09 1191

转载 webFlux替代RestTemplate远程调用

应用场景:开放平台接入A项目接口,提供给B项目调用,先在平台创建A接口接口,项目信息,应用信息,生成url(包含签名),再把URL给B平台调用。流程:A-平台-B-平台-A提供方:A,注册到开放平台调用方:B,发请求到平台(平台提供接口)平台过滤器主要是:校验B调用的接口是平台注册的A接口(验签),系统参数校验,获取调用方传入参数。平台是如何调A接口的呢?通过参数:服务地址,接口地址,业务参数参数介绍:WebClient是一个响应式客户端,它提供了RestTemplate的替代方法。

2023-05-11 08:17:14 769

原创 关于为什么gateway网关用webflux

Spring Framework 中包含的原始 Web 框架 Spring Web MVC 是专门为 Servlet API 和 Servlet 容器构建的。反应式堆栈 Web 框架 Spring WebFlux 是在 5.0 版的后期添加的。它是完全非阻塞的,支持反应式流(Reactive Stream)背压,并在Netty,Undertow和Servlet 3.1 +容器等服务器上运行。Spring WebFlux 是一个异步非阻塞式 IO 模型,通过少量的容器线程就可以支撑大量的并发访问。

2023-05-11 05:40:12 3101

原创 LinkedHashMap源码解析

LinkedHashMap 是 HashMap 的子类,增加了顺序访问的特性。【默认】当 accessOrder = false 时,按照 key-value 的插入顺序进行访问。当 accessOrder = true 时,按照 key-value 的读取顺序进行访问。LinkedHashMap 的顺序特性,通过内部的双向链表实现,所以我们把它看成是 LinkedList + LinkedHashMap 的组合。

2023-05-10 09:27:59 2350

原创 linkindList源码分析

LinkedList 基于节点实现的双向链表的 List ,每个节点都指向前一个和后一个节点从而形成链表。LinkedList 提供队列、双端队列、栈的功能。因为 first 节点,所以提供了队列的功能的实现的功能。因为 last 节点,所以提供了栈的功能的实现的功能。因为同时具有 first + last 节点,所以提供了双端队列的功能。LinkedList 随机访问平均时间复杂度是 O(n) ,查找指定元素的平均时间复杂度是 O(n)。

2023-05-09 23:30:00 2140

原创 深入HashMap源码

在初次看到 HashMap 时,都惊奇于其 O(1) 的 get 操作的时间复杂度。当时在我们已知的数据结构中,只有基于下标访问数组时,才能提供 O(1) get 操作的时间复杂度。实际上,HashMap 所提供的 O(1) 是平均时间复杂度,大多数情况下保证 O(1)。其实极端情况下,有可能退化为 O(N) 的时间复杂度噢,这又是为什么呢?

2023-05-08 16:32:59 1995

原创 为什么使用ConcurrentHashMap

JDK1.7是在调用size()方法才去计算,其实在并发集合中去计算size是没有多大的意义的,因为size是实时在变的,只能计算某一刻的大小,但是某一刻太快了,人的感知是一个时间段,所以并不是很精确。计算ConcurrentHashMap的元素大小是一个有趣的问题,因为他是并发操作的,就是在你计算size的时候,他还在并发的插入数据,可能会导致你计算出来的size和你实际的size有相差(在你return size的时候,插入了多个数据),要解决这个问题,JDK1.7版本用两种方案。

2023-05-08 13:02:10 2568

原创 ArrayList底层源码分析

下面,我们来对 ArrayList 做一个简单的小结:ArrayList 是基于 [] 数组实现的 List 实现类,支持在数组容量不够时,一般按照 1.5 倍自动扩容。同时,它支持手动扩容、手动缩容。ArrayList 随机访问时间复杂度是 O(1) ,查找指定元素的平均时间复杂度是 O(n)。ArrayList 移除指定位置的元素的最好时间复杂度是 O(1) ,最坏时间复杂度是 O(n) ,平均时间复杂度是 O(n)。最好时间复杂度发生在末尾移除的情况。因为移除头部或者中间的元素要位移。

2023-05-07 00:15:00 1743

转载 Mysql前奏

点击上方关注 “设为“星标”,和你一起掌握更多数据库知识。

2023-05-06 00:15:00 1743

原创 openfeign的使用

Feign集成了Ribbon、RestTemplate实现了负载均衡的执行Http调用,只不过对原有的方式(Ribbon+RestTemplate)进行了封装,开发者不必手动使用RestTemplate调服务,而是定义一个接口,在这个接口中标注一个注解即可完成服务调用,这样更加符合面向接口编程的宗旨,简化了开发。网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处是GZIP与搜索引擎的抓取工具有着更好的关系。为什么要添加上面的依赖呢?那么上面配置的全局超时时间能不能通过呢?

2023-05-05 09:16:14 1577

原创 如果线上遇到了OOM,该如何解决?

OOM 意味着程序存在着漏洞,可能是代码或者 JVM 参数配置引起的。这篇文章和读者聊聊,Java 进程触发了 OOM 后如何排查常说对生产环境保持敬畏之心,快速解决问题也是一种敬畏的表现。

2023-05-04 23:30:00 2096

原创 一次完整的JVM内存泄漏故障排查记录

记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配的原理分析以及常用的JVM问题排查手段和工具分享。

2023-05-04 22:30:00 1108

原创 RocketMQ 消息幂等(去重)通用解决方案

消息中间件是分布式系统常用的组件,无论是异步化、解耦、削峰等都有广泛的应用价值。我们通常会认为,消息中间件是一个可靠的组件——这里所谓的可靠是指,只要我把消息成功投递到了消息中间件,消息就不会丢失,即消息肯定会至少保证消息能被消费者成功消费一次,这是消息中间件最基本的特性之一,也就是我们常说的“AT LEAST ONCE”,即消息至少会被“成功消费一遍”。

2023-05-04 14:21:33 2343

原创 mysql索引下推

如果你去网上搜很多人举例子这样建索引,然后告诉你这就是索引下推的时候,你可以尽情的喷他了,我们说索引下推一定是在联合索引的情况下,根据联合索引本身就有的数据直接做一次过滤,而不用再进行多次无用的回表再到Server层进行过滤,这一点你要很明确才行。对比这两个流程就会很明显的发现,使用ICP之后我们就是简单的通过联合索引中本来就有的数据直接过滤了,不需要再查到一堆无用的数据去Server层进行过滤,这样的话减少了回表的次数和返回的数据,IO次数减少了,对性能有很好的提升。你会发现,我靠,怎么还有索引下推?

2023-05-01 01:00:00 1739

原创 java是值传递还是引用传递

从上述的结果可以看出在 paramTest 方法中修改了参数之后,在 main 方法中再打印参数时,发现参数的值也跟着发生了改变,那么似乎我们可以得出结论,Java 中貌似也有“引用传递”,然而实事并如此,我们接着看。所以我们在调用 new Object()之后,可以看出 对象有了新地址,而原内容并未被修改,如果按照引用传递的思路来看的话,不管执行任何方式的修改都会改变原内容,因此我们可以更加确认 Java 语言中只有值传递。说到值传递和引用传递我们不得不提到两个概念:值类型和引用类型。

2023-04-30 00:45:00 1679

原创 cas底层实现

CAS大家都知道,这是一项乐观锁技术,是Compare And Swap的简称,顾名思义就是先比较再替换。虽然他叫乐观锁,但是我们都知道它是不需要加锁的,在JDK1.5 中的JUC就是建立在CAS之上的。相对于synchronized这种阻塞算法,CAS是非阻塞算法的一种常见实现。所以J.U.C在性能上有了很大的提升。我们以java.util.concurrent中的AtomicInteger为例,看一下在不使用锁的情况下是如何保证线程安全的。

2023-04-29 00:30:00 1730

原创 常见限流算法(计数器算法,滑动时间窗口算法,令牌桶算法,漏桶限流算法)

固定窗口限流算法(Fixed Window Rate Limiting Algorithm)是一种最简单的限流算法也叫计数器法,其原理是在固定时间窗口(单位时间)内限制请求的数量。该算法将时间分成固定的窗口,并在每个窗口内限制请求的数量。具体来说,算法将请求按照时间顺序放入时间窗口中,并计算该时间窗口内的请求数量,如果请求数量超出了限制,则拒绝该请求。假设单位时间(固定时间窗口)是1秒,限流阀值为3。在单位时间1秒内,每来一个请求,计数器就加1,如果计数器累加的次数超过限流阀值3,后续的请求全部拒绝。

2023-04-28 10:03:06 2491

原创 Mysql中Nested-Loop Join原理

join 主要有 Nested Loop、Hash Join、Merge Join 这三种方式,我们这里只讲最普遍的,也是最好的理解的 Nested Loop,Nested Loop 翻译过来就是嵌套循环的意思,那什么又是嵌套循环呢?嵌套大家应该都能理解,就是一层套一层;那循环呢,你可以理解成是 for 循环。

2023-04-27 13:19:54 1359

原创 sql查询是否存在从count改为limit

多次REVIEW代码时,发现如现现象:业务代码中,需要根据一个或多个条件,查询是否存在记录,不关心有多少条记录。普遍的SQL及代码写法如下。SQL不再使用count,而是改用LIMIT 1,让数据库查询时遇到一条就返回,不要再继续查找还有多少条了 业务代码中直接判断是否非空即可。

2023-04-27 08:55:13 1730

原创 服务端挂了,客户端的 TCP 连接会发生什么?

如果「服务端挂掉」指的是「服务端进程崩溃」,那么这个读者猜的想法是对的,服务端的进程在发生崩溃的时候,内核会发送 FIN 报文,与客户端进行四次挥手。但是,如果「服务端挂掉」指的是「服务端主机宕机」,那么是不会发生四次挥手的,具体后续会发生什么?还要看客户端会不会发送数据?如果客户端会发送数据,由于服务端已经不存在,客户端的数据报文会超时重传,当重传次数达到一定阈值后,会断开 TCP 连接;如果客户端一直不会发送数据,再看客户端有没有开启 TCP keepalive 机制?

2023-04-26 18:05:52 2195

空空如也

空空如也

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

TA关注的人

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