Mybatis图解执行器
一张图了解Mybatis执行器
SqlSession内部维护了一个Executor类,这里是CachingExecutor,所以SqlSession内部会调用CachingExecutor的query()方法执行查询流程
CachingExecutor内部有一个被声明为Executor类的delegate属性,在完成内部的二级缓存操作后,它会调用BaseExecutor的query()方法
BaseExecutor会做一些公共的事情,比如一级缓存的处理,获取链接等等,它也不会真的执行查询数据的操作,而是调用子类的doQuery()、doUpdate()去执行数据库查询操作
子类执行数据库查询逻辑,子类有SimpleExecutor、ReuseExecutor、BatchExecutor,还有一个ClosedExecutor,由于它和前面三个做的事情完全不同,所以不再解释它。
SqlSession默认情况下是DefaultSqlSession,操作数据动作是调用的CachingExecutor.query()方法。
123456789101112131415161718192021p ...
Mybatis阅读源码的前置准备工作
版本信息
Spring Boot 3.3.0
Mybatis 3.5.16
JDK 17
Demo搭建搭建一个简单的Spring Boot项目,方便调试Mybatis源码。
首先创建一个Spring Boot的项目,我这里将项目命名为Mybatis_Reader,并引入相关依赖。
设置依赖12345678910111213141516171819202122232425262728293031323334353637383940414243<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId ...
SpringCloud之Resilience4j的断路器机制详解
前言断路器是一种服务保护机制,断路器通过有限状态机实现,有三个普通状态:关闭、开启、半开,还有两个特殊状态:禁用、强制开启。断路器默认是关闭状态,当满足条件时断路器会处于打开状态,此时不会再继续请求下游服务而是直接返回熔断逻辑。在一定时间后断路器会变成半开状态,这种状态下允许部分请求通过,然后依据这部分请求的结果判定断路器是转换为关闭还是打开。
状态的流转如下图所示:
断路器使用滑动窗口来存储和统计调用的结果。你可以选择基于调用数量的滑动窗口或者基于时间的滑动窗口。
基于访问数量的滑动窗口基于访问数量的滑动窗口是通过一个有N个元素的循环数组实现。
如果滑动窗口的大小等于10,那么循环数组总是有10个统计值。滑动窗口增量更新总的统计值,随着新的调用结果被记录在环形数组中,总的统计值也随之进行更新。当环形数组满了,时间最久的元素将被驱逐,将从总的统计值中减去该元素的统计值,并该元素所在的桶进行重置。
基于时间的滑动窗口基于时间的滑动窗口是通过有N个桶的环形数组实现。
如果滑动窗口的大小为10秒,这个环形数组总是有10个桶,每个桶统计了在这一秒发生的所有调用的结果(部分统计结果),数组中的 ...
SpringCloud中如何进行接口调用?
小Demo提供者在新版本的SpringCloud中进行接口暴露是很简单的,只需要引入open feign的依赖,然后接口就可以被其它服务引用了。
1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
消费者使用这个接口的系统也要引入open feign,同时启动类中加上@EnableFeignClients注解,再写一个简单的接口就可以在其它类中注入这个类了。
12345@FeignClient("CloudClientB")public interface ClientProviderB { @GetMapping(value = "/hello") String hello();}
可以直接注入Bean进行调用:
123 ...
SpringCloud中EurekaServer的故障感知与实例摘除
前言Spring Cloud Eureka作为服务注册中心,可以实时感知服务实例的上线和下线。当服务实例发生故障时,Eureka会将其从服务列表中移除,防止请求被发送到已经故障的服务实例。
故障感知与实例摘除EurekaServer启动时会初始化一个定时任务,它每分钟执行一次EvictionTask。
12345678910protected void postInit() { renewsLastMin.start(); if (evictionTaskRef.get() != null) { evictionTaskRef.get().cancel(); } evictionTaskRef.set(new EvictionTask()); evictionTimer.schedule(evictionTaskRef.get(), serverConfig.getEvictionIntervalTimerInMs(), // 默认是1分钟 serverConfig.g ...
SpringCloud中心跳与Server的自我保护机制
EurekaClient与EurekaServer的心跳机制Spring Cloud的心跳机制主要是通过Eureka客户端定期向Eureka服务器发送心跳包来实现的。这个机制用于维护服务实例的健康状态,并保证服务注册表的准确性。
具体来说,每个Eureka客户端会每隔一段时间(默认为30秒)向Eureka服务器发送一个心跳包,告诉服务器它还活着。Eureka服务器在收到心跳包后,会更新服务实例的租约信息,延长其在服务注册表中的存活时间。
如果Eureka服务器在一段时间内(默认为90秒 + 补偿时间)没有收到某个服务实例的心跳包,那么它会认为这个服务实例已经出现故障,将其从服务注册表中移除。
Client端Client在启动时初始化了一个默认30秒被执行一次的任务:HeartbeatThread,在它内部的run()方法中,它会发起一次对Server端的续约请求,并更新自己的lastSuccessfulHeartbeatTimestamp。
123456789private class HeartbeatThread implements Runnable { publ ...
SpringCloud中的服务注册与服务发现机制
服务注册在以下几种情况中,Client会将自己注册到Server中:
启动时:当客户端应用启动并初始化Spring应用上下文后,如果它包含一个DiscoveryClient实例(例如EurekaDiscoveryClient),那么它会自动将自己注册到服务端。这是通过DiscoveryClient的@PostConstruct注解标记的方法完成的。
服务状态变化时:如果客户端应用的服务状态发生变化(例如,从DOWN状态变为UP状态),并且这个状态变化被一个StatusChangeListener监听到,那么客户端可能会重新将自己注册到服务端。这是通过StatusChangeListener的notify()方法完成的。
定期心跳失败后:客户端应用会定期向服务端发送心跳以维持其在服务端的注册状态。如果心跳失败(例如,因为网络问题或服务端故障),那么客户端可能会尝试重新将自己注册到服务端。
我们以服务启动时触发的注册行为为例,然后从Client和Server两段看下它的注册流程。
Client端在Client启动的过程中,Spring Boot通过自动装配机制将EurekaClient ...
SpringCloud是如何启动EurekaServer的
小Demo还是先建一个Demo工程,方便我们阅读源码。
新建一个Spring Boot项目,pom中添加以下信息:
123456789101112131415161718192021222324252627<properties> <java.version>17</java.version> <spring-cloud.version>2023.0.1</spring-cloud.version></properties><dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> ...
SpringCloud概述
前言本次代码阅读,依旧是阅读最新版本源码。版本信息如下
JDK 17
Spring Boot 3.2.5
SpringCloud 2023.0.1
什么是SpringCloudSpring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、短寿命微服务和契约测试)。分布式系统的协调导致了锅板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们可以在任何分布式环境中很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和托管平台(如Cloud Foundry)
SpringCloud与Spring Boot的关系Spring Cloud是一个用于构建分布式系统的开发工具集合,它提供了一系列的组件和模块,用于解决分布式系统中的常见问题,例如服务注册与发现、负载均衡、服务调用、配置管理等。而Spring Boot是一个用于简化Spring应用程序开发的框架,它提供了自动配置、快速启动等特性,使得开发者可以更加便捷地构建和部署Spring应用程序。
SpringCloud的特性 ...
Spring源码之一张图了解Bean的创建过程
前言上一章我们已经对IOC容器有了大致的了解,本章我们再用一张图了解下Spring中是如何创建一个普通Bean的。注意,这张图只表达了一个普通注解类作为被Spring创建Bean的过程,比如一个普通的Action类。
一张图了解Bean的创建过程推荐通过链接访问,可以看到更多的内容。
链接:https://www.processon.com/view/link/6649b73b42522905d011ec1a