框架&中间件源码解析
文章平均质量分 96
常用中间件源码解析
邋遢的流浪剑客
成长中的基础架构攻城狮
展开
-
SkyWalking8.7源码解析(六):ExitSpan和LocalSpan、链路追踪上下文、上下文适配器ContextManager、DataCarrier、链路数据发送到OAP
27、ExitSpan和LocalSpan1)、ExitSpanExitSpan代表服务消费侧,比如Feign、Okhttp。ExitSpan是链路中一个退出的点或者离开的Span。在一个RPC调用中,会有多层退出的点,而ExitSpan永远表示第一个。比如,Dubbox中使用HttpComponent发起远程调用。ExitSpan表示Dubbox的Span,并忽略HttpComponent的Span信息EntrySpan和ExitSpan的区别就在于:EntrySpan记录的是更靠近服务这一侧的原创 2022-05-30 09:10:34 · 3616 阅读 · 1 评论 -
SkyWalking8.7源码解析(五):链路基本知识、链路ID生成、TraceSegment、Span基本概念、Span完整模型、StackBasedTracingSpan
21、链路基本知识 上图是一个下单接口的链路,在链路中首先要理解的概念是Segment,Segment表示一个JVM进程内的所有操作,上图中有6个Segment。Gateway Segment是Mall Segment的parent,通过parent关系就可以把多个Segment按顺序拼起来组装成一个链路 一个Segment里可能发生多个操作,如上图Segment中操作1是查Redis,操作2是查MySQL,这就是两个Span,Span表示一个具体的操作。Span之间也是基于parent的关系构建起原创 2022-05-15 09:40:21 · 4834 阅读 · 3 评论 -
SkyWalking8.7源码解析(四):服务GRPCChannelManager、ServiceManagementClient、CommandService、SamplingService
14、服务-GRPCChannelManagerorg.apache.skywalking.apm.agent.core.boot.BootService是SkyWalking Agent中所有服务的顶层接口,这个接口定义了一个服务的生命周期,分为prepare、boot、onComplete、shutdown四个阶段public interface BootService { /** * 准备阶段 * * @throws Throwable */原创 2022-05-03 09:44:31 · 2618 阅读 · 1 评论 -
SkyWalking8.7源码解析(三):静态方法插桩、构造器和实例方法插桩、插件拦截器加载流程、JDK类库插件工作原理
10、静态方法插桩Transform的transform()方法中调用每个插件的define()方法去做字节码增强,AbstractClassEnhancePluginDefine的define()方法中再调用自己的enhance()方法做字节码增强,enhance()方法源码如下:public abstract class AbstractClassEnhancePluginDefine { /** * Begin to define how to enhance class. A原创 2022-01-02 17:41:32 · 3301 阅读 · 6 评论 -
SkyWalking8.7源码解析(二):定制Agent、服务加载、witness组件版本识别、Transform工作流程
6、定制Agentpublic class SkyWalkingAgent { private static ILog LOGGER = LogManager.getLogger(SkyWalkingAgent.class); /** * Main entrance. Use byte-buddy transform to enhance all classes, which define in plugins. * -javaagent:/path/to/agent原创 2021-12-25 16:53:37 · 3125 阅读 · 1 评论 -
SkyWalking8.7源码解析(一):Agent启动流程、Agent配置加载流程、自定义类加载器AgentClassLoader、插件定义体系、插件加载
1、Agent启动流程找到入口方法SkyWalkingAgent的premain()方法,源码如下:public class SkyWalkingAgent { /** * Main entrance. Use byte-buddy transform to enhance all classes, which define in plugins. * -javaagent:/path/to/agent.jar=agentArgs * -javaagent:原创 2021-12-12 08:42:43 · 12061 阅读 · 0 评论 -
Disruptor核心原理、源码解析
前言前两篇Disruptor学习笔记:基本使用、核心概念和原理和Netty整合Disruptor实战文章中,主要讲解了Disruptor的一些API的使用、概念等,本文会进一步来解析Disruptor的核心原理和相关源码1、Disruptor的性能为什么这么高?内存分配更加合理,使用RingBuffer数据结构,数组元素在初始化时一次性全部创建,提升缓存命中率;对象循环利用,避免频繁GC能够避免伪共享,提升缓存利用率采用无锁算法,避免频繁加锁、解锁的性能消耗(CAS操作代替锁)支持批量消费,消原创 2021-10-10 17:24:34 · 2591 阅读 · 0 评论 -
Jedis源码解析(二):JedisCluster模块源码解析
三、JedisCluster模块源码解析1、JedisCluster类结构由于Jedis本身不是线程安全的,所以选择使用对象池JedisPool来保证线程安全在JedisClusterInfoCache中,保存了节点和槽位的一一对应关系,为每个节点建立一个对象JedisPool,并保存在map中。这个类主要用于保存集群的配置信息2、JedisCluster的初始化public class JedisCluster extends BinaryJedisCluster implements J原创 2021-09-05 15:57:13 · 3662 阅读 · 0 评论 -
Jedis源码解析(一):Jedis简介、Jedis模块源码解析
一、Jedis简介1、Jedis对应Redis的四种工作模式对应关系如下:Jedis主要模块Redis工作模式JedisRedis Standalone(单节点模式)JedisClusterRedis Cluster(集群模式)JedisSentinelRedis Sentinel(哨兵模式)ShardedJedisRedis Sharding(分片模式)2、Jedis三种请求模式Jedis实例有3种请求模式:Client、Pipeline和Tra原创 2021-09-04 20:21:26 · 3139 阅读 · 0 评论 -
JVM SandBox源码解析(二):增强目标类、模块刷新、模块卸载
JVM SandBox源码解析(一):启动时初始化、启动时加载模块、ModuleHttpServlet进行Http路由4、增强目标类自定义模块示例:@MetaInfServices(Module.class)@Information(id = "TestControllerInterceptor", isActiveOnLoad = false)public class TestControllerInterceptor extends ModuleLifecycleAdapter impleme原创 2021-05-03 14:41:44 · 1101 阅读 · 0 评论 -
JVM SandBox源码解析(一):启动时初始化、启动时加载模块、ModuleHttpServlet进行Http路由
前言上篇JVM SandBox实现原理详解文章中,主要解析了JVM SandBox的核心实现原理,并且对SandBoxClassLoader和ModuleClassLoader做了源码解析,也解释了在用户自定义模块中为何能使用部分sandbox-core中的类。本文主要对JVM SandBox的核心功能进行源码解析,主要包含以下几部分内容:启动时初始化启动时加载模块ModuleHttpServlet进行Http路由增强目标类模块刷新模块卸载1、启动时初始化1)、脚本分析Attach方原创 2021-05-03 14:40:19 · 1802 阅读 · 0 评论 -
JVM SandBox实现原理详解
1、什么是JVM SandBoxJVM SandBox(沙箱)实现了一种非侵入式运行期的AOP解决方案。JVM SandBox属于基于Instrumentation的动态编织类的AOP框架,可以在不重启应用的情况下,在运行时完成目标方法的增强和替换,同时沙箱以及沙箱的模块可以随时加载和卸载主要特性如下:无侵入:目标应用无需重启也无需感知沙箱的存在类隔离:沙箱以及沙箱的模块不会和目标应用的类相互干扰可插拔:沙箱以及沙箱的模块可以随时加载和卸载,不会在目标应用留下痕迹多租户:目标应用可以同时挂载不原创 2021-04-29 07:34:12 · 5600 阅读 · 4 评论 -
Apollo核心源码解析(二):Apollo Client轮询配置(ConfigRepository与RemoteConfigLongPollService)、配置中心通用设计模型
本文接上文Apollo核心源码解析(一):Portal发布配置、Admin Service发送ReleaseMessage、Config Service通知客户端3、Apollo Client上图简要描述了Apollo客户端的实现原理:客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送(通过Http Long Polling实现)客户端还会定时从Apollo配置中心服务端拉取应用的最新配置这是一个fallback机制,为了防止推送机制失效导致配置不更新客户端定时拉取会上报.原创 2021-03-14 10:36:57 · 1625 阅读 · 1 评论 -
Apollo核心源码解析(一):Portal发布配置、Admin Service发送ReleaseMessage、Config Service通知客户端
1、Apollo架构设计Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳在Eureka之上我们架了一层Meta Server用于封装Eureka的服务发现接口Client通过域名访问Meta Server获取Config Service原创 2021-03-13 15:02:53 · 1546 阅读 · 0 评论 -
Soul网关中的Http长轮询实现数据同步
前言Soul是一款异步的、高性能的、跨语言的、响应式的API网关,本文主要来解析Soul中基于Http长轮询同步数据的设计,下图展示了Soul数据同步的流程:Soul主要由soul-admin和soul-web两个核心模块组成,soul-admin是路由和其他信息配置的管理后台;soul-web是网关主体,用于实现路由转发等功能。soul-web实现了动态配置功能,会同步soul-admin中的路由和其他配置信息,为了提供更高的响应速度,soul-web所有的缓存配置都存在JVM的Concurrent原创 2021-02-22 07:39:55 · 477 阅读 · 0 评论 -
Zuul路由转发源码解析及动态路由实现
本文介绍Zuul路由的源码以及实现动态路由的几种方式,可以先阅读Zuul1.x核心源码解析了解路由源码流程本文基于spring-cloud-starter-zuul(SpringCloud版本为Edgware.SR3)1、源码解析1)、路由转发route类型的SimpleHostRoutingFilter、RibbonRoutingFilter负责实际的请求,核心代码如下:public class SimpleHostRoutingFilter extends ZuulFilter { @Ov原创 2021-01-31 18:05:20 · 1681 阅读 · 0 评论 -
Zuul1.x核心源码解析
1、Zuul架构图如上图,Zuul网关分为三个部分:过滤器管理模块(绿色模块)、过滤器加载模块(粉红色模块)、过滤器运行时模块(蓝色模块)1)过滤器管理模块:让开发人员管理过滤器,过滤器管理主要是上传的动作和激活的动作。过滤器上传完是保存到数据库中的,开发人员可以通过界面管理过滤器的状态2)过滤器加载模块:是过滤器加载模块。定期的扫描过滤器,看看过滤器有没有变更。过滤器管理器会先将变更的过滤器拉到本地的过滤器目录当中。如果变更了,就会执行Filter Loader进行加载,加载到网关运行时的Filt原创 2020-11-07 14:15:33 · 398 阅读 · 0 评论 -
Sentinel FlowSlot限流源码解析
本文主要来解析Sentinel限流核心源码,基于当前最新的release版本1.8.01、常见限流算法1)、计数器算法在指定周期内累加访问次数,当访问次数达到设定的阈值时,触发限流策略,当进入下一个时间周期清零访问次数如上图所示,限定了每一分钟能够处理的总请求数为100,在第一个一分钟内,一共请求了60次。接着到第二个一分钟,counter又从0开始计数,在一分半钟时,已经达到了最大限流的阈值,这个时候后续的所有请求都会被拒绝2)、滑动窗口算法滑动窗口算法的原理是在固定窗口中分割出多个小时间窗原创 2021-01-26 08:26:02 · 718 阅读 · 3 评论 -
Sentinel DegradeSlot熔断源码解析
本文主要来解析Sentinel熔断核心源码,基于当前最新的release版本1.8.01、Sentinel熔断机制的处理流程 达到熔断触发条件(假设触发条件为当接口每秒钟超过20%的处理产生异常,具体熔断规则由用户配置),便会开启熔断,在熔断状态下,X秒内所有该接口访问都会被Blocked快速失败(服务降级)X秒后,下一次请求接口,此时为半开状态如果请求接口成功,恢复到正常状态如果请求接口失败,回到熔断状态继续Blocked X秒2、源码解析Sentinel的熔断是由责任链中的最后一个D原创 2021-01-24 14:29:18 · 705 阅读 · 0 评论 -
Sentinel核心源码解析
本文主要来解析Sentinel的核心源码,当前最新的release版本1.8.0,如果你尚未了解Sentinel的核心功能,可以查看Sentinel的官方文档或者这篇文章Sentinel核心功能实战1、Sentinel案例解析 public UserOrder getUserOrderByUserId(Long userId) { ContextUtil.enter("UserService"); Entry entry = null; try {原创 2021-01-23 21:00:43 · 960 阅读 · 2 评论 -
Feign核心源码解析
注册BeanDefinition首先看一下Feign的开启注解@EnableFeignClients:@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(FeignClientsRegistrar.class)public @interface EnableFeignClients {@Import导入了FeignClientsRegistrar,该类实现了ImportBeanDefin原创 2020-11-21 22:04:20 · 608 阅读 · 0 评论 -
Eureka核心源码解析(二):Eureka Server自我保护机制、失效剔除、Eureka Server集群复制
本文主要来解析Eureka应用实例下线、自我保护机制、失效剔除核心源码,基于1.9.8版本一、应用实例下线1、Eureka Client发起下线应用实例关闭时,Eureka Client向Eureka Server发起下线应用实例。需要满足如下条件才可发起:配置eureka.registration.enabled=true,应用实例开启注册开关。默认为false配置eureka.shouldUnregisterOnShutdown=true,应用实例开启关闭时下线开关。默认为truepub原创 2021-07-25 17:22:05 · 984 阅读 · 0 评论 -
Eureka核心源码解析(一):应用实例注册、续约、下线
本文主要来解析Eureka应用实例注册、续约的核心源码,基于1.9.8版本一、应用实例注册1、Eureka Client发起注册Eureka Client向Eureka Server发起注册应用实例需要符合如下条件:配置eureka.registration.enabled=true,Eureka Client向Eureka Server发起注册应用实例的开关InstanceInfo在Eureka Client和Eureka Server数据不一致每次InstanceInfo发生属性变化时,原创 2021-07-25 11:15:34 · 690 阅读 · 2 评论