自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

白鸽

个人博客:www.xiaoxuya.top

  • 博客(265)
  • 资源 (2)
  • 收藏
  • 关注

转载 Sentinel源码剖析之滑动窗口

咱们就拿 60个窗口,这个60个窗口放在数组中,窗口长度是1s 来计算,看看当前时间戳的一个时间窗口是是在数组中哪个位置。比如说当前时间戳是1609085401454 ms算出秒 = 1609085401454 /1000(窗口长度)在数组的位置 = 算出秒 %数组长度。

2022-11-18 16:44:33 894

原创 Sentinel源码剖析之常用限流算法原理实现

限流顾名思义,就是对请求或并发数进行限制;通过对一个时间窗口内的请求量进行限制来保障系统的正常运行。如果我们的服务资源有限、处理能力有限,就需要对调用我们服务的上游请求进行限制,以防止自身服务由于资源耗尽而停止服务。在限流中有两个概念需要了解。阈值:在一个单位时间内允许的请求量。如 QPS 限制为10,说明 1 秒内最多接受 10 次请求。拒绝策略:超过阈值的请求的拒绝策略,常见的拒绝策略有直接拒绝、排队等待等。限流的手段通常有计数器、漏桶、令牌桶。

2022-11-17 19:05:30 1470 2

原创 Sentinel源码剖析之执行流程

上述讲了SCG Sentinel执行流程,这里给一个SpringBoot集成Sentinel的执行流程,两则本质上执行流程一致StatisticSlot计数,底层通过LongAdder实现,why?1、LongAdder底层通过cas保证高并发情况下的线程安全2、LongAdder底层通过add,decrement,sum这些现成的API可以使用熔断器在哪计数?下篇写为什么要用滑动窗口算法?原理是什么?怎么实现?下篇写。

2022-11-17 16:15:18 988 1

原创 Sentinel源码剖析之初始化

Sentinel初始化,有个几个核心对象SphU sentinel基本APIEnv 组件初始化CommandCenterInitFunc 命令中心,负责接收命令CommandHandler,接收的命令,最终的处理器HeartBeatSenderInitFunc 心跳发送器,维护与dashboard的心跳,10s一次简单吧嘿嘿!!!

2022-11-09 20:53:00 829

原创 Java-SPI源码剖析

SPI机制是java提供的扩展机制,主要用来为第三方应用进行扩展用的,自身服务只需要提供SPI接口,第三方应用自己实现SPI接口即可。SPI原理无非是内部通过LazyInterator进行处理,先找到SPI配置文件地址,逐一读取配置项,进行类加载获取class。当然内部维护一套缓存机制provider,不需要每次都读取SPi配置文件,Class.ForName,优化性能。

2022-11-08 20:29:04 389

原创 Sentinel源码剖析之核心组件作用和介绍

Sentinel 是分布式系统的防御系统。以流量为切入点,通过动态设置的流量控制、服务熔断降级、系统负载保护等多个维度保护服务的稳定性,通过服务降级增强服务被拒后用户的体验。官网:https://github.com/alibaba/Sentinel/wiki/

2022-11-02 21:12:17 464

原创 Java线程池使用详解及原理

线程池其实是一种池化的技术的实现,池化技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务。通过上面分析提到,通过Executors这个工具类来创建的线程池其实都无法满足实际的使用场景,那么在实际的项目中,到底该如何构造线程池呢,该如何合理的设置参数?1)线程数线程数的设置主要取决于业务是IO密集型还是CPU密集型。

2022-10-13 20:41:07 1116

原创 Netty 粘包拆包 编解码器简介与使用

在protobuf中,每个byte的最高位是一个判断位,如果这个位被置位1,则表示后面一个byte和该byte是一起的,表示同一个数,如果这个位被置位0,则表示后面一个byte和该byte没有关系,数据到这个byte就结束了。就是序列化整数的时候,占用的空间大小是不一样的,小的整数占用的空间小,大的整数占用的空间大,这样不用固定一个具体的长度,可以减少数据的长度,但是会带来解析的复杂度。xml也是一个非常常用的格式,但是它的体积会比较大,现在应该用的比较少了。

2022-10-11 20:14:34 1065

原创 Netty源码剖析之内存池和对象池设计流程

根据谁最后使用谁负责释放的原则,每个Handler对消息可能有三种处理方式对原消息不做处理,调用ctx.fireChannelRead(msg)把原消息往下传,那不用做什么释放。将原消息转化为新的消息并调用 ctx.fireChannelRead(newMsg)往下传,

2022-09-28 21:08:15 921

转载 Netty源码剖析之IO多路复用模型

select缺点是:1、 单个进程可监视的fd数量被限制,即能监听端口的大小有限。一般来说这个数目和系统内存关系很大,具体数目可以cat /proc/sys/fs/file-max察看。32位机默认是1024个。64位机默认是2048.当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。

2022-09-27 16:50:41 1060

原创 Netty源码剖析之核心组件

AbstractChannel抽象类包含以下几个重要属性。EventLoop:每个Channel对应一条EventLoop线程。DefaultChannelPipeline:一个Handler的容器,也可以将其理解为一个Handler链。Handler主要处理数据的编/解码和业务逻辑。Unsafe:实现具体的连接与读/写数据,如网络的读/写、链路 关闭、发起连接等。命名为Unsafe表示不对外提供使用,并非不安全。

2022-09-27 14:52:52 405

原创 Netty源码剖析之数据通信流程

我的理解是不会!只有当客户端与服务端建立连接的时候,ServerSocketChannel所在NioEventLoop将 接收到的SocketChannel通过 ServerBootAcceptor 交由 WorkerGroup NioEventLoop注册通道的时候,才会拿到这个WorkerNioEventLoop 创建线程,进行Selector监听。

2022-09-16 10:51:47 559

原创 Netty源码剖析之Netty启动流程

1、NettyServer2、NettyServerHandler3、NettyClient4、NettyClientHandlerNetty启动流程1、绑定端口,封装程SocketAddress2、创建初始化Channel,将NioServerSocketChannel绑定到BossNioEventLoopGroup中的EventLoop中的Selector上,指定Selector监听事件为accept2.1 反射创建NioServerSocketChannel给ServerSoc

2022-09-15 15:20:50 578

原创 Netty源码剖析之NIOEventLoopGroup创建流程

NioEventLoopGroup内部结构执行图。

2022-09-13 18:02:29 1396

原创 Netty源码剖析之线程模型

Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。Netty 是一个基于 NIO 的网络编程框架,使用Netty 可以帮助你快速、简单的开发出一 个网络应用,相当于简化和流程化了 NIO 的开发过程。

2022-09-13 15:39:42 258

原创 Netty源码分析之NIO

Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的议。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO(即 New IO),是同步非阻塞的。,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。

2022-09-13 14:37:22 310

原创 SpringBoot集成Flowable实践

2、flowable核心概念解释flowable核心概念和表解释由于flowable-starter 内置集成了repositoryService,historyService,runtimeService等等因此直接注入到业务类上即可前端上传的是xml文件字符串,转io流涉及以下几张表act_re_deployment:会有一条部署记录,记录此次部署的基本信息act_ge_bytearray:有两条记录,记录的是本次上传的bpmn文件和对应的图片文件,每条记录都有act_re_deployment

2022-06-15 20:57:44 3446

原创 Flowable基本使用介绍和Flowable数据库表解释

Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。简单来说:Flowable将审批节点抽象出来,那么作为使用者而言只需要通过流程设计器定义流程模板,定义动态表单,挂载表单数据,通过流程定义和流程变量启动流程实例即可。使用者不需要知道整个流程具体如何执行,只需要记住审批人是谁,审批通过没有即可。因此:flowable流程引擎非

2022-06-15 19:05:03 22020 5

原创 SpringBoot源码剖析之SpringBoot执行流程

SpringApplication.run()方法到底是如何做到启动Spring Boot项目的呢?执行流程剖析public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) { return run(new Class[]{primarySource}, args);}public static ConfigurableApplicationContext run(Cl

2022-01-20 17:05:39 694

原创 Mybatis源码剖析之插件interceptor执行原理

预读mybatis通过插件 对(Executor、StatementHandler、ParameterHandler、ResultSetHandler) 这四个 核心对象创建代理进行拦截对mybatis来说插件就是拦截器,用来增强核心对象的功能,增强功能本质上是借助于底层的 动态代理实现的,换句话说,MyBatis中的四大对象都是代理对象Mybatis核心对象介绍MyBatis的主要的核心部件有以下几个:Configuration 初始化基础配置,比如MyBatis的别名等,一些重要的类型对象

2022-01-17 17:24:18 988

原创 Mybatis源码剖析之二级缓存

序言mybatis默认开启一级缓存,一级缓存存在于Executor中,而executor存在于sqlSession中,因此一级缓存可以当作在sqlSession生命周期中。与一级缓存不同,二级缓存和具体的命名空间绑定,一个Mapper中有一个Cache,相同Mapper中的MappedStatement共用一个Cache,一级缓存则是和 SqlSession 绑定。准备启用二级缓存1、开启全局二级缓存配置:<settings><setting name="cacheEnabl

2022-01-15 16:10:01 402

原创 Mybatis源码剖析之Mybatis执行流程(proxy 代理)

预读Mybatis在设计上,分为三层:接口层,数据处理层,框架支持层在接口层中,分为传统模式:通过sqlSession + statementId。接口代理模式:sqlSession+mapper接口准备<configuration> <!--加载外部的properties文件--> <properties resource="jdbc.properties"></properties> <!--开启全局的二级

2022-01-15 14:48:09 505

原创 mybatis源码剖析之typeAlias类型别名

mybatis默认定义了许多的类型别名,用来简化mapper.xml的编写从mybatis执行流程分析可知,typeAlias是mybatis解析核心配置文件的时候封装的过程分析1、通过classLoader 读取核心配置文件 为输入流注意:只要是流,底层就是数组,那么就存在两个指针 一个position指向数组存储元素的后一个节点,一个limit指向尾节点2、解析配置文件,封装Configuration对象 创建DefaultSqlSessionFactory对象通过XMLCon

2022-01-15 13:56:00 357

原创 Mybatis源码剖析之Mybatis执行流程(传统方式)

预读Mybatis在设计上,分为三层:接口层,数据处理层,框架支持层在接口层中,分为传统模式:通过sqlSession + statementId。接口代理模式:sqlSession+mapper接口准备userMapper.xmlmybatis核心配置文件<configuration> <!--加载外部的properties文件--> <properties resource="jdbc.properties"></prop

2022-01-15 11:59:25 323

原创 Mybatis源码剖析之Mybatis架构设计以及核心组件作用

架构设计核心组件作用

2022-01-14 10:40:04 113

原创 SpringMVC源码剖析之自动注入Request,为什么可行?

问题:我们知道在SpringMVC中controller层可以通过Autowire自动注入Request到当前类来使用如果看过Spring源码,IOC容器进行实例化bean的时候,一级缓存中存放的都是单例Bean。那么是否意味着Request,也是单例Bean,会不会出现线程安全?如果使用过request,发现其并不会出现线程安全问题,那为什么单例Bean Request不会出现线程安全问题?解决概述request实际上是一个代理对象,因此依赖注入request是一个代理对象,当通过reques

2022-01-13 11:48:49 793

原创 SpringMVC源码剖析之参数解析器处理handler参数流程

准备我们之前分析过通过handlerMapping获取到了handler以及对应的所有拦截器,在通过handlerAdapter找到匹配的handlerAdapter处理handler方法1、通过handlerAdapter 调用 handler方法,最终返回modelAndVIew,如果返回json对象给前端,那么MAV为null1.1、获取dataBinder工厂 ,通过获取handler所在类上的initBinder创建dataBinder工厂private WebDataBinder

2022-01-12 22:02:33 561 2

原创 SpringMVC源码剖析之SpringMVC工作流程

SpringMVC九大组件HandlerMapping(处理器映射器)HandlerMapping 是⽤来查找 Handler 的,也就是处理器,具体的表现形式可以是类,也可以是⽅法。⽐如,标注了@RequestMapping的每个⽅法都可以看成是⼀个Handler。Handler负责具 体实际的请求处理,在请求到达后,HandlerMapping 的作⽤便是找到请求相应的处理器Handler 和 Interceptor.HandlerAdapter(处理器适配器)Handler

2022-01-12 21:48:49 344

原创 Spring源码剖析之@Transactional

准备我们知道使用@Transactional,要满足以下条件1、配置数据源 DataSource2、配置事务管理器 PlatformTransactionManager3、配置类上标识 @EnableTransactionManagement@Configuration@PropertySource(value = {"classpath:jdbc.properties"},encoding = "UTF-8")public class TransactionalConfig {

2022-01-10 12:30:05 433

原创 Spring源码分析之AOP拦截器调用流程

Spring AOP 拦截器调用流程1、代理对象调用invoke方法@Override @Nullable public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object oldProxy = null; boolean setProxyContext = false; /** * 【1】获取代理工厂 */ TargetSource targetSour

2022-01-07 17:32:12 683

原创 Spring源码剖析之AOP代理对象创建

准备我们通过AOP实现日志记录来剖析AOP/** * 日志切面 * * 实现日志记录 */@Aspect@Componentpublic class LogAspect { public LogAspect(){ System.out.println("LogAspect 构造方法"); } /** * 将指定注解作为切入点 */ @Pointcut("@annotation(com.xiaoxu.annotatio

2022-01-07 17:30:59 562

原创 Spring源码剖析之循环依赖

什么是循环依赖循环依赖其实就是循环引用,两个或两个以上的Bean相互依赖,相互引用,例如A依赖B,B依赖于A,如果不加以处理,Bean A,Bean B 都无法创建成功。因为创建A的时候发现依赖B,于是去创建B,创建B的时候依赖A,这样整个SpringBean创建周期无法完成。Spring中循环依赖的场景依赖注入方式构造器注入导致循环依赖set注入注解注入构造器注入导致的循环依赖,无法被解决,因为创建A需要对象B,B又需要A,连基本的反射创建对象都创建不了。实际上就是Bean B ,Bea

2022-01-06 20:27:22 532

原创 Spring源码剖析之Bean创建流程

准备注意: spring中,Bean分为两种,一种Bean,一种FactoryBean。本质上没什么区别都是往IOC容器中注册Bean。但是形式上有区别,前者往IOC容器中注册了一个对象,后者为两个且后者FactoryBean主要用户创建复杂对象,例如SqlSessionFactoryBean,创建之前需要进行大量的XML解析而Bean由于创建的流程,又分为SpringBean和普通Bean。IOC容器一级缓存池中存放的是SpringBean,只是简单通过反射创建的称之为普通Beanrefresh方

2022-01-05 16:43:28 573

原创 Spring源码剖析之@Configuration核心配置类解析

ConfigurationClassPostProcessor 解析 @Configuration

2022-01-05 10:05:52 358

原创 Spring源码剖析之IOC容器创建流程

ApplicationContextConfiguration为核心配置类 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationContextConfiguration.class);1、this(), 实例化IOC容器,定义BeanDefinition读取器,读取注解定义的Bean。定义类路径下的BeanDefinition扫描器,扫描定义的

2022-01-04 16:50:30 1614

原创 LLM应用开发框架LangChain

假如我们想要用 openai api 对一个段文本进行总结,我们通常的做法就是直接发给 api 让他总结。但是如果文本超过了 api 最大的 token 限制就会报错。这时,我们一般会进行对文章进行分段,比如通过 tiktoken 计算并分割,然后将各段发送给 api 进行总结,最后将各段的总结再进行一个全部的总结。LangChain 很好的帮我们处理了这个过程,使得我们编写代码变的非常简单。# 导入os,设置环境变量。导入文本加载器、总结链、文本分割器及OpenAI模型import os。

2024-04-12 11:16:43 713

原创 Kafka详细教程(一)

官网:「http://kafka.apache.org/」 kafka 是最初由 linkedin 公司开发的,使用 scala 语言编写, kafka 是一个分布式,分区的,多副本的,多订阅者的日 志系统(分布式MQ 系统),可以用于搜索日志,监控日志,访问日志等 Kafka is a distributed,partitioned,replicated commit logservice。它提供了类似于 JMS 的特性,但是在设计实现上完全不同,此外它并不是JMS 规范的完整实现。

2024-03-27 19:55:12 1081

原创 Hadoop之Yarn 详细教程

YARN 是 Hadoop2 引入的通用的资源管理和任务调度的平台,可以在 YARN 上运行MapReduce、Tez、Spark 等多种计算框架,只要计算框架实现了 YARN 所定义的接口,都可以运行在这套通用的 Hadoop 资源管理和任务调度平台上。支持多种计算框架YARN 是通用的资源管理和任务调度平台,只要实现了 YARN 的接口的计算框架都可以运行在 YARN 上。资源利用率高多种计算框架可以共用一套集群资源,让资源充分利用起来,提高了利用率。运维成本低。

2023-12-29 11:55:55 1483

原创 Hadoop之MapReduce 详细教程

为了开发我们的 MapReduce 程序,一共可以分为以上八个步骤,其中每个步骤都是一个 class 类,我们通过 job 对象将我们的程序组装成一个任务提交即可。为了简化我们的 MapReduce 程序的开发,每一个步骤的 class 类,都有一个既定的父类,让我们直接继承即可,因此可以大大简化我们的 MapReduce 程序的开发难度,也可以让我们快速的实现功能开发。MapReduce 编程当中,其中最重要的两个步骤就是我们的 Mapper 类和 Reducer类Mapper 抽象类的基本介绍。

2023-12-28 16:57:21 1505

原创 Hadoop之HDFS 详细教程

Hadoop 分布式系统框架中,首要的基础功能就是文件系统,在 Hadoop 中使用FileSystem 这个抽象类来表示我们的文件系统,这个抽象类下面有很多子实现类,究竟使用哪一种,需要看我们具体的实现类,在我们实际工作中,用到的最多的就是 HDFS(分布式文件系统)以及 LocalFileSystem(本地文件系统)了。在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储。HDFS(Hadoop Distributed File System)是 Hadoop 项目的一个子项目。

2023-12-27 18:13:41 2637

awdawdawdawdawdawd

awdawdawdawdawdawd

2024-03-27

C32Asm 工具 解决 Xshell,Xftp强制更新

C32Asm

2021-08-26

enterprise企业网站源码

企业门户网站源码

2021-08-04

空空如也

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

TA关注的人

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