Kubernetes source code analyse - scheduler

this subject will analyse kubernetes core component source code, it include five parts: - kube-scheduler - kube-controller-manager - apiserver - kube-proxy - kubelet

we will show the architecture design, code structure, data flow of k8s, let’s start now, this is the first article of the subject, we will finished the article in order from top to bottom of the list, so let&rsq[...]

继续阅读 »

Tyk API Gateway反向代理设计

0x1 什么是反向代理? 上一篇介绍了Tyk的限流设计,这篇记录分析下它的反代设计,反代这个词相信做后端的同学基本都听说过(nginx的常用姿势),代理分为正向代理和反向代理,因为我们这里不是专门介绍代理的,我就简单说下他们的区别,记住一个区分他们的要点就是“正向代理就是访问要出去”, “反向代理就是访问要进来”,正向代理多用于一些需要做互联网访问跳板机的场景,这里就不多说了。而反向代理呢,微服务场景是用得比较多的,一个API Gateway支持反代是核心功能,Tyk作为这领域软件的翘楚当然也得支持。GW的反代可用于负载均衡、访问中间人处理、认证等功能的实现上

[...]

继续阅读 »

Tyk API Gateway限流设计

Tyk是一款出色的开源网关,它是由 Go 编写的,核心组件包括了API Gateway、Tyk Dashboard、 Tyk Pumpd和Tyk Identity BrokerTyk等,我们主要是分析下API Gateway这个组件的限流设计 0x1 流程分析

[...]

继续阅读 »

go和rust设计模式对比-工厂模式

定义 工厂模式可分为三类: 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 简单工厂模式 属于创建型模式,不属于23种GOF设计模式之一,由一个工厂对象决定创建出哪一种产品类实例,逻辑为定义一个工厂类,根据传入的参数不同返回不同的产品实例,被创建的实例具有共同的父类或接口。 工厂方法模式 跟简单工厂模式的区别就是,定义了一些工厂子类,每个工厂子类都可以创建相对应的产品类实例,而不用工厂父类去根据参数创建,一般在产品类比较多的情况下,不想太多复杂的逻辑封装在工厂父类里面,可以用这种模式。 抽象工厂模式 顾名思义,把工厂抽象出来,根据具体的业务需求组合工厂创建产品实例的逻辑,通常为创建多个产品实例类。抽象工厂一旦要增加创建产品实例的逻辑,就需要修改抽象工厂接口的具体产品组合逻辑,所以并不符合开闭原则,如果是需要频繁增加(修改)产品实例的话,要衡量是否采用这种模式

[...]

继续阅读 »

9人团本之基于HTTP2搬一个RPC的砖

手动实现RPC 协议格式 type Halokid struct { Header string // 协议头 Service string // 服务名称 Method string // 方法名称 Payload []byte // 数据实体 } 通信方式 HTTP2, 关于http2的特性请自行research 服务端 常规来说HTTP2需要使用TLS,需要生成证书,但是go有一个不需要TLS就可以使用HTTP2的实现,它就是H2C,它是一个基于TCP之上构建的HTTP2,拥有http2的一切特性,但是数据不加密,缺乏安全保证,我们服务端就采用H2C来实现

[...]

继续阅读 »

架构师39团本--可扩展性设计

可扩展性要达到的目的就是在扩展软件功能的时候,能尽量少的去改动原有的代码,架构等,基于这个目的,我们在架构设计的时候,需要做到下面的标准。 可扩展性设计标准 1. 代码功能模块之间耦合度尽量低,比如插件化设计 2. 源码结构性好,层次,目录分明 3. 用统一的风格去组织项目源码结构,每个功能模块风格要一致 ,比如目录组织,文件组织,类组织等风格 上面是标准,那可以用什么手段去达到上面的标准呢? 可扩展性设计的手段 1. 面向源码接口编程,每一个功能模块都有固定的调用接口,模块之间只要按照规范调用接口就可以了,不用关心实现。类似interface,implement的设计,如依赖注入,代理模式等设计模式

[...]

继续阅读 »

微服务网关白名单设计

场景 我们的微服务网关(go编写)需要增加具体的内网系统接入白名单认证,白名单有IP地址、系统名称两种数据,内网的系统部署方式各式各样, 微服务、单机、多机负载均衡、k8s、docker原生等等,数据总数约40W个。我们的目的是需要验证IP是否在我们的白名单列表中即可,存在则可访问服务,不存在则拒绝访问。 解决方案 方案1 IP白名单列表不适合放在数据库,数据库查询有耗时,选择放在nosql上,最终我们选择了redis。数据结构的选

[...]

继续阅读 »

基于go分析rpc服务从客户端到服务端的代码结构

以关键源代码流程的方式分析rpc服务端和客户端代码结构 服务端创建范例 1. 初始化服务端,通常是一个类或者结构体(init), 类似这样 myserver := server.NewServer() 2. 服务注册 // 建立服务实体 type Echo struct{} // 建立服务的方法 func (e Echo) Say(req string) { println(“Echo.Say…”, req) } // 赋值服务实体到变量和设置服务选型 echoService := new(Echo) opts := server.Options() / @p1: 服务名称 @p2: 服务对象 @p3: 服务选项参数 */ myserver.register(“Echo”, echoService,[...]

继续阅读 »

大端序、小端序以及基于go的示例

关于大端序、小端序的讲解文章其实不少,我这边以我的理解梳理一下。 内存高地址和地址 要了解大小端序的概念, 首先我们要了解下数据在内存的组成是怎样的。我们用16进制来模拟,16进制0x11,一个数值就占4个字节(bit),转为二进制就是 0001 0001 , 那么假如我有如下数据 0x11223344, 转为二进制就是 0001 0001 0010 0010 0011 0011 0100 0100,因为8bit就是1byte,所以 0x11223344一共就是4byte,每一个byte有一个对应的内存位,假设这四个内存地址是 0x0001, 0x0002, 0x0003, 0x0004,这4个内存地址是连续的, 按照内存高低地址规则, 0x0001是最低地址,从低到高顺序, 0x0004是最高地址。

[...]

继续阅读 »