- 博客(62)
- 收藏
- 关注
转载 Nacos Config源码分析(四)- 客户端
Nacos Config服务的client也在nacos-client.jar包中,通过ConfigService接口来获取/监听/发布/删除配置项。 config client为了做到高可用,会在本地文件系统中缓存配置项。本地缓存的配置项又分为两大类: failover缓存 - 可...
2019-08-08 19:07:00
342
转载 Nacos Config源代码分析(三) - 配置监听
Nacos Config客户端通过http长轮询请求来订阅配置变更。Server支持两种形式的长轮训机制: 固定间隔轮训(Fixed Polling)- 每次长轮询的时间是固定的,在固定间隔轮询时间结束后,计算期间发生的配置变更,返回group keys。 非固定间隔轮训 - 长轮...
2019-08-08 19:05:00
993
转载 Nacos Config源代码分析(二) - 核心类结构
Nacos Config Server核心类如下图: PersistService - 数据库访问服务,封装了所有SQL操作 ConfigService - 本地文件 & 内存Cache 数据结构维护 DumpService - 通过PersistService & ...
2019-08-08 19:01:00
610
转载 Nacos Config源代码分析(一) - 存储模型
Nacos Config提供了配置管理的功能,它允许用户在nacos上配置key-value对,并在客户端订阅需要的配置。当配置发生变更时,订阅的客户端会获得通知,随后拉取最新的key-value对。 Config Server为了最大程度保证可用性采用了一种三层的存储架构设计,mysql ...
2019-08-08 18:58:00
675
转载 Nacos Naming源码分析(五)- 客户端
Nacos Naming客户端核心代码封装nacos-client包内,主要通过NamingService接口来实现服务的注册/发现等一系列操作。client会在内存中保存订阅的所有服务的信息,并通过UDP协议接受来自server的更新。client相关的核心类如下图: HostR...
2019-08-08 18:03:00
328
转载 Nacos Naming源码分析(四)- 活跃检测
临时服务实例在注册到naming server上之后,会周期性得发送心跳信息来保持节点的活跃。同时,naming server会周期性检测每个实例最后一次收到心跳信息的时间戳,摘除超时的节点并通知所有订阅的客户端。 实例活跃性检测的定时任务封装在Service类中,在init方法里启动: ...
2019-08-08 18:03:00
398
转载 Nacos Naming源码分析(三) - 服务管理
Nacos Naming节点会在内存中保存所有服务的Service/Cluster/Instance三层元信息以及用户订阅关系,通过ConsistencyService来持久化并在节点间保持数据一致。naming服务用来做元信息管理的核心类是ServiceManager,核心类关系图如下: ...
2019-08-08 17:51:00
460
转载 Nacos Naming源码分析(二) - 数据模型
Nacos Naming服务提供了Service - Cluster - Instance的一种数据模型。一个service可以包含多个cluster,一个cluster又包含多个instance,相互嵌套形成完整的服务定义。 Naming服务模型类结构如下图: Naming服务提供了...
2019-08-08 17:48:00
266
转载 Nacos Naming源码分析(一)- 持久化存储
Nacos主要包括两个核心服务 - config & naming。config主要用来托管应用配置,naming用作服务发现。Nacos Naming服务引入了一种Service - Cluster - Instance的数据结构模型,用来存储服务的元信息。在Naming服务中实际来...
2019-08-08 17:45:00
1889
转载 Sentinel源代码分析 - 2.主要slot实现
在CtSph.entryWithPriority方法中,会为每种资源分配一个ProcessorSlotChain实例。默认是通过DefaultSlotChainBuilder类来创建相应的slot chain,构造过程如下: public ProcessorSlotChain build()...
2019-07-31 17:50:00
209
转载 Sentinel源代码分析 - 1.流量控制主流程
Sentinel是阿里开源的一个轻量级流量控制框架,它可以从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。 Sentinel相关的介绍文档请参见:https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5 S...
2019-07-31 17:46:00
347
转载 Arthas源代码分析 - 3.cmd集合
Arthas(阿尔萨斯)采用command设计模式来封装核心的操作命令逻辑。用户通过telnet/http协议连接到ShellServerImpl之后,终端上执行的命令都会被解析成AnnotatedCommand子类,之后会被套进ProcessImpl/JobImpl结构中,在合适的环境中被执...
2019-07-31 17:43:00
298
转载 Arthas源代码分析 - 2.shell交互
Arthas(阿尔萨斯)在bootstrap过程中,会在目标java进程内部启动一个shell server。shell server将在特定端口监听telnet/http协议,解析并执行用户发送的命令。 shell相关主要类图如下: ShellServerImpl - shell s...
2019-07-31 17:42:00
469
转载 Arthas源代码分析 - 1. Bootstrap
Arthas(阿尔萨斯,https://github.com/alibaba/arthas)是Alibaba开源的一款Java诊断工具。它支持JDK 6+,以命令行的方式运行。借助Java Instrumentation的能力能够动态attach到一个运行中的java进程上,实时获取JVM信息...
2019-07-31 17:39:00
567
转载 K8S源码分析Scheduler - Scheduler简介
scheduler整体结构比较简单,基本一篇文章就解释清楚了。请参见 https://blog.youkuaiyun.com/waltonwang/article/details/54565638 ...
2019-07-31 17:33:00
260
转载 K8S源码分析Kubelet - 6、Pod驱逐
为了保证Node节点的稳定性,当资源(memory/storage)出现紧缺时,kubelet会主动选择驱逐一些Pods来释放资源。实现该功能的组件是Eviction Manager。 当驱逐一个Pod时,kubelet会将pod内的所有containers都kill掉,并把pod的状态设置...
2019-07-31 17:32:00
710
转载 K8S源码分析Kubelet - 5、Pod内部构造
Pod是K8S调度的基本单位,一个Pod中包含了一个Pause容器(根容器)和多个用户容器。Pause容器的状态代表了Pod的状态,同一个Pod中的容器共享相同的ip和数据卷。 因此,Pod的创建首先要构建一个Sandbox,包含pause容器并初始化网络/数据卷等一系列资源。 1.sa...
2019-07-31 17:28:00
212
转载 K8S源码分析Kubelet - 4、cgroups基础
Pod是k8s调度的基本单位。每个Pod拥有自己独立的命名空间、网络接口以及共享磁盘等资源。同一个pod内的containers相互可见,并可以直接通讯。 为了理解Pod如何做到资源的隔离,我们需要了解容器技术依赖的两个Linux内核级功能:namespace & cgroups。 ...
2019-07-31 17:24:00
190
转载 K8S源码分析Kubelet - 3、Pod同步细节
在上文中提到,Pod同步流程是kubelet进程的核心主流程,本文将分析该主流程中最关键的部分--Pod的创建和管理。这部分逻辑封装在kubeGenericRuntimeManager.SyncPod(kuberuntime_manager.go)方法中,主要执行以下步骤: 根据从AP...
2019-07-31 17:24:00
420
转载 K8S源码分析Kubelet - 2、Pod同步流程
1.核心流程 kubelet最核心的功能就是根据master的指示,在节点上创建并管理pod。目前对于kubelet而言,有三种途径来获取所管理的pod清单: 文件 - 通过启动参数–config指定配置目录,定期检查变更。 HTTP Endpoint - 通过--manife...
2019-07-31 17:21:00
461
转载 K8S源码分析Kubelet - 1、Kubelet关键模块
1.运行机制 在k8s集群中,每个node节点上都会运行一个kubelet进程。该进程会处理master下发的任务,定时同步自身的状态并管理Pod。总体来看,kubelet进程主要完成以下几部分工作: 节点管理 - 以固定的时间间隔同步本节点的状态信息到Api Server上。 ...
2019-07-31 17:19:00
240
转载 K8S源码分析Controller Manager - 4、Controller实现的一个例子-ReplicaSetController
Controller的实现基本上都是通过SharedInformer的结构去监听etcd上某种资源的变更,然后再执行对应的业务逻辑。 本文以ReplicaSetController为例,介绍一个controller如何与整个manager组合在一起。 controller启动 cont...
2019-07-31 17:16:00
243
转载 K8S源码分析Controller Manager - 3、Controller Manager启动
Controller Manager启动的过程比较简单,主要就是依次启动各个controllers。 启动的代码在/cmd/kube-controller-manager/app/controllermanager.go中,核心的是Run方法: // Run ru...
2019-07-29 20:40:00
282
转载 K8S源码分析Controller Manager - 2、SharedInformer结构
绝大多数Controller的实现都依赖一种特殊结构-SharedInformer,它主要负责订阅etcd上资源的变更并调用注册的Handlers。 SharedInformer相关的类结构如下图: SharedInformer是一个复杂的嵌套结构,自底向上总共包含四层 Queue ...
2019-07-29 20:38:00
281
转载 K8S源码分析Controller Manager - 1、Controller Manager简介
Controller Manger是K8S内部的控制中心,主要介绍可以参考这篇文档: https://blog.youkuaiyun.com/huwh_/article/details/75675761 在Manager内部会为不同的Controller创建不同的协程来监听各自的资源在etcd上的变动...
2019-07-29 20:36:00
362
转载 K8S源码分析API Server - 3、API Server构建
API Server利用GenericAPIServer框架依次创建了api_extension_server\api_server\aggregator_server来处理所有请求,server构建的核心逻辑如下: func CreateServerChain(r...
2019-07-29 20:35:00
291
转载 K8S源码分析API Server - 2、GenericAPIServer
API Server对外提供的是RESTful接口,GenericAPIServer结构主要解决的就是URI路由的问题,即把URI映射到对应的处理逻辑。可以把GenericAPIServer理解为一个微型的mvc框架,它是整个API Server的骨架。 GenericAPIServer相关...
2019-07-29 20:32:00
346
转载 K8S源码分析API Server - 1、API Server简介
关于API Server的整体介绍请参考以下两篇文章: https://blog.youkuaiyun.com/huwh_/article/details/75675706 https://blog.youkuaiyun.com/u010278923/article/details/79242791 特别摘录第...
2019-07-29 20:29:00
292
转载 ES源代码分析 - 2. ZenDiscovery集群组建
ES采用了自己实现的服务发现/选主机制,被称为ZenDiscovery。ZenDiscovery模块主要解决了三个问题: 选主 在集群刚启动时,所有节点都会向Seed Nodes发送Ping消息。Seed Nodes会保存接收到的所有节点的信息,并通过Ping Response的...
2019-07-27 16:49:00
364
转载 ES源代码分析 - 1. Es启动流程
Elasticsearch的bootstrap代码是我个人到目前为止见过的写得最好的server端启动代码(没有之一),当中包含了大量的自检和环境检测代码,甚至用到了JNA来做OS层面的参数获取和设置。这对于我们写server端代码有很大的参考价值。 ES的启动流程主要包含以下核心类: ...
2019-07-27 16:46:00
1742
转载 ES学习摘要 - 13. Mapping
Mapping定义了一个索引的doc中包含哪些fields,这些fields如何被存储/索引。 Field数据类型包括: 简单类型:text, keyword, date, long, double, boolean, ip 嵌套类型:object, nested 特殊类型:geo_p...
2019-07-27 16:44:00
270
转载 ES学习摘要 - 12. Query DSL
ES提供了一套基于JSON的查询语言,主要包含两种语句: 叶子查询语句 - 具体条件的查询 组合查询语句 - 用来组合不同查询 12.1 Query and filter context query语句可以存在于两种场景中: Query Context - query参数中,出了决...
2019-07-27 16:42:00
152
转载 ES学习摘要 - 7. Search APIs
7.1 Search search API提供两种模式传递查询条件:url参数,request body 所有search API都支持跨索引、跨索引类型进行查询 7.2 URI Search 可以通过url参数传递查询条件,一个例子: GET twitter/_search?q...
2019-07-27 16:41:00
150
转载 ES学习摘要 - 8. Aggregations
ES支持的aggregation操作可以分为四类 Bucketing 每个bucket关联了一个key以及一个条件,所有满足条件的doc都会落入对应的bucket中 Metric 对一组doc进行指标运算 Pipeline 将其他aggregations的结果作为输入再做aggre...
2019-07-27 16:41:00
800
转载 ES学习摘要 - 6. Document APIs
6.1 Reading and Writing documents 一个索引会被切分为多个分片,每个分片会有多个副本。一个分片的所有副本被称为replication group,彼此之间保持同步。 replication group中存在一个主分区(primary shard)。主分区承...
2019-07-27 16:40:00
138
转载 ES学习摘要 - 5. API Conventions
5.1 Multiple Indices 在REST接口需要指定index参数的地方,都可以同时指定多个索引,比如test1,test2,test3,_all,test*,te*t。还可以表达excluce语义,如test*,-test3。 所有索引类API都支持以下几个参数: ign...
2019-07-27 16:38:00
144
转载 ES学习摘要 - 2. Setup Elasticsearch
2.2 Configuring es包含三个配置文件: elasticsearch.yml - es配置项 jvm.options - jvm配置项 log4j2.properties - 日志配置项目 用压缩包安装的配置文件目录在$ES_HOME/config下 ...
2019-07-27 16:37:00
247
转载 ES学习摘要 - 1. Getting Started
1.1 Basic Concepts Cluster 每个集群都有一个唯一的名字,默认是“elasticsearch”。任意一个节点Node可以通过配置它的cluster name参数来指定它要加入的集群。 Node 一个elasticsearch node会参与集群的数据存储、索引...
2019-07-27 16:36:00
196
转载 10、包和工具
10.1 包简介 Go语言中,所有导入的包必须在每个文件的开头显式声明;禁止包的环状依赖;编译后包的目标文件不仅仅记录包本身的导出信息,目标文件同时还记录了包的依赖关系。 10.4 导入声明 过圆括号同时导入多个导入路径: import "fmt" import "os" im...
2019-07-27 16:33:00
75
转载 9、基于共享变量的并发
9.2 sync.Mutex互斥锁 sync包里的Mutex的Lock方法能够获取到token(这里叫锁),并且Unlock方法会释放这个token。 9.3 sync.RWMutex读写锁 RWMutex通过RLock和RUnlock方法来获取和释放一个读取或者共享锁;调用mu.L...
2019-07-27 16:32:00
113
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人