- 博客(335)
- 收藏
- 关注
原创 Kubernetes调度器源码学习(三):Preempt抢占机制、调度失败与重试处理
本文基于Kubernetes v1.22.4版本进行源码学习。
2023-04-09 16:22:13
419
2
原创 Kubernetes调度器源码学习(一):调度器工作原理、调度器启动流程、调度队列
本文基于Kubernetes v1.22.4版本进行源码学习。
2023-04-05 13:56:21
449
原创 controller-runtime源码学习
首先Controller会先向Informer注册特定资源的eventHandler;然后Cache会启动Informer,Informer向APIServer发出请求,建立连接;当Informer检测到有资源变动后,使用Controller注册进来的eventHandler判断是否推入队列中;当队列中有元素被推入时,Controller会将元素取出,并执行用户侧的Reconciler2022年最新k8s编程operator篇kubebuilder 进阶: 源码分析。
2023-02-11 16:39:53
848
原创 client-go源码学习(四):自定义Controller的工作原理、WorkQueue
Controller中主要使用到Informer和WorkQueue两个核心组件Controller可以有一个或多个Informer来跟踪某一个resource。Informer跟Kubernetes API Server保持通讯获取资源的最新状态并更新到本地的cache中,一旦跟踪的资源有变化,Informer就会调用callback把关心的变更的Object放到WorkQueue里面。
2023-01-17 20:17:25
650
原创 client-go源码学习(三):Indexer、SharedInformer
Indexer接口继承了一个Store接口(实现本地缓存),以及包含几个index索引相关的方法声明(实现索引功能)Store接口中定义了Add、Update、Delete、List、Get等一些资源对象增删改查的方法声明,用于操作Informer的本地缓存cache struct是Indexer接口的一个实现,所以自然也是Store接口的一个实现,cache struct包含一个ThreadSafeStore接口的实现,以及一个计算object key的函数KeyFunc。
2023-01-07 15:26:58
1005
原创 client-go源码学习(二):Reflector、DeltaFIFO
本文基于Kubernetes v1.22.4版本进行源码学习,对应的client-go版本为v0.22.4。
2022-12-31 15:42:53
1140
2
原创 client-go源码学习(一):client-go源码结构、Client客户端对象
本文基于Kubernetes v1.22.4版本进行源码学习,对应的client-go版本为v0.22.4。
2022-12-26 14:55:43
1009
原创 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊(四):The DAO、反思、美链、总结
理论上,没有什么是绝对不可篡改的,比如分叉攻击可以回滚交易。The DAO事件中,以太坊开发团队通过软件升级方式强行改变了某些账户的状态,所以不能迷信不可篡改的特性。毕竟代码是死的人是活的,没有什么是绝对改不了的,连宪法都可以修宪,比如美国的宪法修正案,修宪是很难的,但是有必要的时候还是可以改的。区块链上是一样的,想要篡改是比较难的,但是遇到重大事件,要是想改还是改的了的。
2022-09-03 10:03:13
2483
2
原创 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊原理(三):智能合约
智能合约的本质是运行在区块链上的一段代码,代码的逻辑定义了智能合约的内容智能合约的账户保存了合约当前的运行状态balance:当前余额nonce:交易次数code:合约代码storage:存储,数据结构是一棵MPTSolidity是智能合约最常用的语言,语法上与JavaScript很接近。...
2022-08-28 16:16:27
2842
1
原创 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊原理(一):以太坊概述、账户、状态树、交易树和收据树
比特币和以太坊是两种最主要的加密货币,比特币被称为区块链1.0,以太坊被称为区块链2.0出块时间,比特币的区块时间是10分钟,以太坊的出块时间大幅度降低到了十几秒,而且为了适应这种新的出块时间,以太坊还设计了一套基于GHOST的共识机制以太坊的另一个改进就是挖矿使用的mining puzzle。.........
2022-08-22 07:22:09
3540
原创 Go基础学习笔记(二):错误处理和资源管理、Goroutine、Channel、迷宫的广度优先搜索、http及其他标准库
1)defer调用2)何时使用defer调用3)、服务器统一出错处理项目根目录下有hello world.txt,访问http://localhost:8888/list/hello%20world.txt,返回hello world访问http://localhost:8888/list/,返回Not Found拷贝一个hello world2.txt文件,修改访问权限访问http://localhost:8888/list/hello%20world2.txt,返回Forbidden1)
2022-07-02 11:03:11
401
原创 Go基础学习笔记(一):基础语法、内建容器、面向对象、依赖管理、面向接口、函数式编程
1)使用var关键字可放在函数内,或直接放在包内使用var()集中定义让编辑器自动决定类型2)使用:=定义变量只能在函数内使用1)内建变量类型2)强制类型转换:类型转换是强制的,Go语言只有强制类型转换没有隐式类型转换3)、常量与枚举1)常量定义const数值可作为各种类型使用2)使用常量定义枚举类型3)变量定义要点回顾1)ifif的条件里不需要括号if的条件里可以赋值if的条件里赋值的变量作用域就在这个if语句里2)switchswitch会自动break,除非使用fall
2022-06-20 08:38:31
509
2
原创 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
1986
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
2529
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
1487
1
原创 Kubernetes容器网络(三):容器跨主机Overlay网络、路由模式实验
前言前三篇文章我们分别介绍了Docker网络原理、Flannel网络原理、Calico网络原理,本文将通过实验的方式带你进一步理解容器跨主机网络实现 两个容器docker1和docker2分别位于节点Node1和Node2,如何实现容器的跨主机通信呢?一般来说有两种实现方式:封包模式:利用Overlay网络协议在节点间建立隧道,容器之间的网络包被封装在外层的网络协议包中进行传输,例如:Flannel UDP、Flannel VXLAN、Calico IPIP路由模式:容器间的网络包传输全部用三层
2022-05-01 14:44:45
1762
原创 Kubernetes容器网络(二):Calico网络原理
1、前置网络知识1)、BGP自治系统AS:在单一的技术管理下的一组路由器,而这些路由器使用一种AS内部的路由选择协议和共同的度量以确定分组在该AS内的路由,同时还使用一种AS之间的路由协议以确定在AS之间的路由路由选择协议分为:内部网关协议IGP:一个AS内使用的,如RIP、OSPF外部网关协议EGP:AS之间使用的,如BGP边界网关协议(BGP)是不同自治系统的路由器之间交换路由信息的协议,是一种外部网关协议BGP的工作原理如下:每个自治系统的管理员要选择至少一个路由器(可以有多个)作
2022-04-16 16:36:42
4752
原创 Kubernetes容器网络(一):Flannel网络原理
前言本文主要分享Flannel如何解决跨主机容器之间通信问题的,如果你对主机内容器之间通信流程还不了解,建议先看下这篇文章:Docker网络原理1、前置网络知识1)、tun/tap设备tun/tap设备在虚拟机的组网过程中起到作用。tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装tun/tap设备到底是什么?从Linux文件系统的角度看,它是用户可以用文件句柄操作的字符设备;从网络虚拟化角度看,它是虚拟网卡,一端连着网络协议栈,另一端连着用户态程序t
2022-04-05 09:40:18
5678
3
原创 Docker网络原理
前言Docker有4种网络通信模型,分别是:bridge、host、none、container,默认使用的网络模型是bridge,本文中用到的也是bridge网络模型本文分享Docker网络原理,主要包含三部分内容:容器之间通信容器访问外网外部访问容器1、前置网络知识1)、veth pairveth是虚拟以太网卡(Virtual Ethernet)的缩写。veth设备总是成对的,因此称之为veth pair。veth pair一端发送的数据会在另外一端接收。根据这一特性,veth pa
2022-03-19 18:03:51
3273
2
原创 Kubernetes学习笔记(四):持久化存储与安全认证
一、持久化存储容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,Kubernetes引入了Volume的概念Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,Kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命容器不与Pod中单个容器的生命周期相关,当
2022-03-12 09:56:03
824
原创 Kubernetes学习笔记(三):Service与Ingress
一、Service详解1、Service介绍在Kubernetes中,Pod是应用程序的载体,我们可以通过Pod的IP来访问应用程序,但是Pod的IP地址不是固定的,这也就意味着不方便直接采用Pod的IP对服务进行访问为了解决这个问题,Kubernetes提供了Service资源,Service会对提供同一个服务的多个Pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的Pod服务Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服
2022-03-05 16:59:45
2466
原创 Kubernetes学习笔记(二):Pod控制器详解:资源元信息、ReplicaSet、Deployment、DaemonSet、Job、CronJob
1、资源元信息 Kubernetes的资源对象组成:主要包括了Spec、Status两部分。其中Spec部分用来描述期望的状态,Status部分用来描述观测到的状态Kubernetes的元数据部分。该部分主要包括了用来识别资源的标签:Label;用来描述资源的注解:Annotation;用来描述多个资源之间相互关系的OwnerReference1)、LabelLabel是Kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择Label的特点:一个La
2022-02-22 08:37:43
1462
原创 Kubernetes学习笔记(一):Pod详解:Pod配置、Pod生命周期、Pod调度、容器设计模式
1、Pod介绍Pod是Kubernetes进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器1)、Pod=进程组在Kubernetes里面,Pod实际上正是Kubernetes抽象出来的一个可以类比为进程组的概念由四个进程共同组成的一个应用Helloworld,在Kubernetes里面,实际上会被定义为一个拥有四个容器的Pod就是说现在有四个职责不同、相互协作的进程,需要放在容器里去运行,在Kubernet
2022-02-13 14:51:25
2868
1
原创 Kubernetes集群环境搭建&部署Dashboard
1、Kubernetes集群搭建本次环境搭建需要三台CentOS服务器(一主二从),然后在每台服务器中分别安装Docker(18.06.3)、kubeadm(1.18.0)、kubectl(1.18.0)和kubelet(1.18.0)三台主机配置信息如下:角色IP地址操作系统配置Master192.168.56.20CentOS7.5+2C2GNode1192.168.56.21CentOS7.5+2C2GNode2192.168.56.22Cen
2022-02-07 10:54:41
2313
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
1941
1
原创 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
1948
原创 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
8019
原创 synthetic关键字和NBAC机制
1、synthetic关键字根据Java语言规范,所有存在于字节码文件中,但是不存在于源代码文件中的构造,都应该被synthetic关键字标注这里的构造,原文是Constructs,实际上指的是字段、方法和构造器([构造] => Constructs => Field、Method、Constructor)由Java编译器在编译阶段自动生成的构造都要被synthetic关键字标注1)、isSynthetic()java.lang.reflect中的Field、Method、Const
2021-12-05 16:07:52
646
原创 《王道操作系统》:第二章 进程管理:进程的同步与互斥、死锁
2.3_进程的同步与互斥2.3.1_进程的同步与互斥1)、进程同步同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作进程具有异步性的特征。异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进2)、进程互斥两种资源共享方式:互斥共享方式(系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源)同时共享方式(系统中的某些资
2021-10-31 15:24:16
417
原创 Disruptor核心原理、源码解析
前言前两篇Disruptor学习笔记:基本使用、核心概念和原理和Netty整合Disruptor实战文章中,主要讲解了Disruptor的一些API的使用、概念等,本文会进一步来解析Disruptor的核心原理和相关源码1、Disruptor的性能为什么这么高?内存分配更加合理,使用RingBuffer数据结构,数组元素在初始化时一次性全部创建,提升缓存命中率;对象循环利用,避免频繁GC能够避免伪共享,提升缓存利用率采用无锁算法,避免频繁加锁、解锁的性能消耗(CAS操作代替锁)支持批量消费,消
2021-10-10 17:24:34
1326
原创 ClickHouse MergeTree原理解析
一、MergeTree原理解析1、MergeTree的创建方式与存储结构MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段不可修改。为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合并成一个新的片段。这种数据片段往复合并的特点,也正是合并树名称的由来1)、MergeTree的创建方式创建MergeTree数据表的完整语法如下所示:CREATE TABLE [IF NOT EXISTS] [db.]table_nam
2021-10-05 09:22:49
1057
原创 ClickHouse学习笔记(二):执行计划、建表优化、语法优化规则、查询优化、数据一致性
本文档基于目前较新稳定版21.7.3.14一、Explain查看执行计划在ClickHouse 20.6版本之前要查看SQL语句的执行计划需要设置日志级别为trace才能可以看到,并且只能真正执行sql,在执行日志里面查看。在20.6版本引入了原生的执行计划的语法。在20.6.3版本成为正式版本的功能1、基本语法EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting = value, ...] SELECT ... [FORMAT ...]1)PLAN
2021-09-25 16:04:36
2942
原创 Netty整合Disruptor实战
1、Netty实现服务端与客户端数据传输1)、依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.12.Final</version> </dependency>
2021-09-20 17:26:52
1021
原创 Disruptor学习笔记:基本使用、核心概念和原理
Disruptor是英国外汇交易公司LMAX开发的一个高性能队列(系统内部的内存队列),研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖1、快速入门1)、步骤创建一个工厂Event类,用于创建Event类实例对象需要有一个监听事件类,用于处
2021-09-20 09:29:48
1017
原创 ClickHouse学习笔记(一):ClickHouse安装、数据类型、表引擎、SQL操作
ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告一、ClickHouse的特点1、列式存储以下面的表为例:1)采用行式存储时,数据在磁盘上的组织结构为:好处是想查某个人所有的属性时,可以通过一次磁盘查找加顺序读取就可以。但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的2)采用列式存储时,数据在磁盘上的组织结构为:这时
2021-09-12 22:01:26
3097
原创 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
2845
原创 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
2238
原创 findLoadedClass详解
问题AClassLoader的parent为BClassLoader,BClassLoader的parent为CClassLoader,当AClassLoader调用loadClass()加载类,并最终由CClassLoader加载的类,到底算谁加载的?后续AClassLoader再加载相同类时,是否能直接从AClassLoader的findLoadedClass0()中找到该类并返回,还是说再走一次双亲委派最终从CClassLoader的findLoadedClass0()中找到该类并返回?Syste
2021-08-28 21:40:46
1143
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人