自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(139)
  • 问答 (1)
  • 收藏
  • 关注

原创 Master主定理求递归算法的时间复杂度

其中a,b >= 1并且是常数。a是递归的子问题的数量n / b是每个子问题的规模f(n)为递归进行计算工作现在来看一个例子,归并排序总共有n个元素每次把一个数组拆成两个小数组(a=2),每个大小约为原来的一半(n / 2, 故b=2)我们会对当前得到的,已经被排序过的两个n/2的数组拿回来,所以要对n/2 * 2也就是n个元素进行处理。

2023-12-26 23:45:23 585

原创 Go工程大坑,空切片和nil切片

nil是为pointer、channel、func、interface、map或slice类型预定义的标识符,代表这些类型的零值。可见,在Go中,nil代表的是上述类型的零值。切片类型的默认零值是nil,所以在上述的代码中s是nil切片。同时s的长度是0,可见nil切片也是空切片。既然都是空切片,那么nil切片和非nil的空切片的区别是什么呢?我们知道,slice的底层结构体中是由3个字段构成的:长度,容量和指向底层数组的指针字段。如下图:而nil切片除了长度和容量都是0之外,还有就是。

2023-12-18 19:19:40 1162 2

原创 自研分布式IM RFC草案

HubuIM协议对于传输层使用TCP,安全层使用TLS,应用层使用自研二进制协议+开源序列化协议。既然使用了TCP协议,那么我们面临的一个问题就是TCP的粘包,拆包问题。具体解决方法我们在后面讲解。对于IM来说,消息的可靠与一致就是:可达有序,不重不漏。有人会问:TCP已经保证一致性了,那么为什么IM还有保证一致。其实答案很简单:TCP只能保证到内核传输层为止的可靠性,但是应用层的可靠性你是没有办法保证的。设计IM必须有端到端的设计思维:底层可靠不等于上层可靠,底层一致不等于上层一致。

2023-11-27 23:57:43 1659

原创 Kafka系列 - 生产者客户端架构以及3个重要参数

整个生产者客户端由两个县城协调运行,这两个线程分别为主线程和Sender线程(发送线程)。主线程中由KafkaProducer创建消息,然后通过可能的拦截器,序列化器和分区器之后缓存到。Sender线程负责从RecordAccumulator中获取消息并将其发送到kafka中。RecordAccumulator 主要用来缓存消息以便 Sender 线程可以批量发送,进而减少网络传输的资源消耗以提升性能。RecordAccumulator 缓存的大小可以通过生产者客户端参数。

2023-11-25 17:07:13 1596

原创 Kafka系列 - Kafka一篇入门

Kafka是一个分布式流式处理平台。很多分布式处理系统,例如Spark,Flink等都支持与Kafka集成。

2023-11-25 14:41:06 1382

原创 Git精讲

index: 暂存区, git add 后会更新该内容。HEAD: 默认指向 master 分⽀的⼀个指针。refs/heads/master: ⽂件⾥保存当前 master 分⽀的最新 commit id。objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。

2023-11-19 22:42:31 414

原创 bff层解决了什么痛点

Backend For Frontend(服务于前端的后端),也就是服务器设计API的时候会考虑前端的使用,并在服务端直接进行业务逻辑的处理,又称为用户体验适配器。BFF只是一种逻辑分层,不是一种技术。

2023-11-06 01:09:55 623

原创 ServiceAccount深度解析

这里在default名称空间创建了一个serviceaccount为admin,可以看到已经自动生成了一个Tokens:admin-token-j7n8j,下面展示如何使用自定义的serviceaccount在K8S集群当中,每一个用户对资源的访问都是需要通过apiserver进行通信认证才能进行访问的,那么在此机制当中,对资源的访问可以是token,也可以是通过配置文件的方式进行保存和使用认证信息,kubectl命令行工具使用kubeconfig文件来查找选择群集并与群集的APIserver进行通信。

2023-08-07 15:37:43 739

原创 Istioctl原理剖析

为了方便用户安装istio和操作相应的manifest,社区将原本的纯helm安装模式演变成如今的cli和operator模式(同时为了保证后向兼容和良好的代码复用,cli复用operator提供的命令行api,operator命令行基于helm的chart渲染进行实现。

2023-08-06 14:35:15 217

原创 profile和manifest概念解析

在实际使用中,根据您的需求和熟悉程度,您可以选择使用清单文件来自定义每个方面的配置,或者使用预定义的配置文件(profile)来轻松地配置 Istio 功能。清单文件中包含了您想要在Istio中配置的各种资源,比如自定义资源定义(CRDs),部署,服务,虚拟服务,目标规则等。配置文件的目的是让用户无需手动编写复杂的清单文件,而是选择适合自己需求的配置文件,从而快速配置和启用Istio的功能。清单是指一组Kubernets配置文件,用于定义Istio的各种组件,服务和配置。

2023-08-05 17:53:02 964

原创 高阶k8s二次开发教程 -- 通过阅读Istio源码习得

Kubernetes API(在本例中为Project和ProjectList)提供的每种类型都需要实现该k8s.io/apimachinery/pkg/runtime.Object接口。该接口定义了两种方法GetObjectKind()和DeepCopyObject()。第一种方法已经由嵌入式metav1.TypeMeta结构提供;第二个你必须自己实现。如果你不实现DeepCopy方法,那么资源是无法注册进入后续的资源列表中的。该DeepCopyObject方法旨在生成对象的深层副本。

2023-07-24 01:45:32 932 2

原创 xDS解决的是什么样子的痛点

xDS是一类发现服务的总称,包含LDS, RDS, CDS, EDS以及SDS。Envoy通过xDS API可以动态获取Listener(监听器),Route(路由), Cluster(集群), Endpoint(集群成员)以及Secret(证书)配置。

2023-07-23 14:37:00 201

原创 xDS协议

在 Pilot 和 Envoy 通信的场景中,xDS 协议是基于 gRPC 实现的传输协议,即 Envoy 通过 gRPC streaming 订阅 Pilot 的资源配置。Pilot 借助 ADS 对 API 更新推送排序的能力,按照 CDS-EDS-LDS-RDS 的顺序串行分发配置。这个图里面有一个名字叫做MCP,这里我来介绍一下MCP这个东西是什么:MCP是Istio中的一个组件,它代码网格配置协议,用于在Istio控制平面中传递和同步配置信息,包括路由规则,策略配置和其他网络配置。

2023-07-06 01:01:46 884

原创 Kuma代码组织方式分析

(管理器):在 Kuma 中,Manager 是一个接口,用于管理和控制组件的生命周期。它定义了添加组件、启动组件和停止组件的方法。它是 Kuma 控制平面的核心组件之一,为其他组件提供必要的基础功能。组件提供了服务网格控制平面的具体功能,例如流量路由、服务发现和安全管理等。每个组件负责一项具体的任务,并根据其定义的接口进行启动、停止和配置。通过这些概念和组件的使用,Kuma 实现了一个可扩展和灵活的服务网格控制平面,使开发人员能够轻松管理和配置服务网格的各个方面。

2023-07-03 23:45:14 156

原创 容器生态系统概念讲解

这张图显示了 Docker、Kubernetes、CRI、OCI、containerd 和 runc 在这个生态系统中是如何结合的。

2023-07-01 13:58:42 334

原创 Docker的Entrypoint和CMD的区别

Entrypoint是指定容器启动时要执行的可执行文件或脚本,并且该命令在运行容器时不能被覆盖。如果在运行容器时指定了其他命令,则这些命令将作为Entrypoint命令的参数传递给容器。总结来说,Entrypoint是指定容器启动时要执行的默认命令,它在运行容器时不能被覆盖。它可以被覆盖,如果在运行容器时指定了其他命令,则这些命令将替换掉Cmd命令。Docker中的Entrypoint和Cmd都是用于指定容器启动时要运行的命令,它们的区别在于它们的作用和使用方式。

2023-06-27 17:02:06 994

原创 数据库系统理论 -- 关系查询处理和查询优化

本篇文章会先介绍数据库的查询处理,然后介绍数据库的查询优化。其中查询优化分为和。代数优化是指关系表达式的优化,物理优化是指通过存取路径和底层操作算法的选择进行优化。

2023-06-11 16:50:10 938 1

原创 etcd的Watch原理

在 Kubernetes 中,各种各样的控制器实现了 Deployment、StatefulSet、Job 等功能强大的 Workload。控制器的核心思想是监听、比较资源实际状态与期望状态是否一致,若不一致则进行协调工作,使其最终一致。那么当你修改一个 Deployment 的镜像时,Deployment 控制器是如何高效的感知到期望状态发生了变化呢?要回答这个问题,我们需要从etcd的Watch特性说起,他是Kubernetes控制器的工作基础。

2023-05-01 22:06:43 2157 3

原创 etcd原理剖析一

你可以理解一旦一个值更新成功,随后任何通过线性读的 client 都能及时访问到。虽然集群中有多个节点,但 client 通过线性读就如访问一个节点一样。etcd 默认读模式是线性读,因为它需要经过 Raft 协议模块,反应的是集群共识,因此在延时和吞吐量上相比串行读略差一点,适用于对数据一致性要求高的场景。如果你的 etcd 读请求显示指定了是串行读,就不会经过架构图流程中的流程三、四。默认是线性读,因此接下来我们看看读请求进入线性读模块,它是如何工作的。

2023-05-01 20:14:52 2282

原创 Kubernetes Controller原理讲解

通过之前的讲解,我们了解到了 如何编写一个Controller来监控和处理Kubernetes中内置的Pod资源对象。采用同样的方法我们也可以编写一个Controller来处理自定义的CRD资源对象。我们首先使用下面的 yaml 片段来在 Kubernetes 中创建一个自定义 CRD。

2023-04-28 18:50:49 1420

原创 dubbogo如何实现路由规则功能

路由规则( routing rule )是为了改变网络流量所经过的途径而修改路由信息的技术,主要通过改变路由属性(包括可达性)来实现。在发起一次 RPC 调用前起到过滤目标服务器地址的作用,过滤后的地址列表,将作为消费端最终发起 RPC 调用的备选地址。

2023-04-26 18:09:17 781

原创 Go语言设计模式 -- 责任链模式

在阅读dubbogo流量管控的源码过程中,遇到了这个设计模式,所以做一下记录。

2023-04-26 17:24:56 162

原创 dubbogo如何实现远程配置管理 -- 阅读官方文档

之前在 Apache/dubbo-go(以下简称 dubbo-go )社区中,有同学希望配置文件不仅可以放于本地,还可以放于配置管理中心里。那么,放在本地和配置管理中心究竟有哪些不一样呢?放在本地,每次更新需要重启,配置文件管理困难,无法做到实时更新即刻生效。此外,本地文件还依赖人工版本控制,在微服务的场景下,大大的增加了运维的成本与难度。而配置管理中心提供了统一的配置文件管理,支持文件更新、实时同步、统一版本控制、权限管理等功能。

2023-04-26 16:08:56 480

原创 dubbogo中将kubernetes作为注册中心 -- 阅读官方文档

为了明确 K8s 在服务接入管理提供的解决方案,我们以 kube-apiserver 提供的 API(HTTPS) 服务为例。K8s 集群为该服务分配了一个集群内有效的 ClusterIP ,并通过 CoreDNS 为其分配了唯一的域名 kubernetes。如果集群内的 Pod 需要访问该服务时直接通过 https://kubernetes:443 即可完成。由此可⻅,Kubernetes 提供的服务发现为域名解析级别。

2023-04-26 14:40:16 813

原创 微服务生态 -- dubbo -- dubbo3应用级别服务发现(阅读官方文档)

从 Internet 刚开始兴起,如何动态感知后端服务的地址变化就是一个必须要面对的问题,为此人们定义了 DNS 协议,基于此协议,调用方只需要记住由固定字符串组成的域名,就能轻松完成对后端服务的访问,而不用担心流量最终会访问到哪些机器 IP,因为有代理组件会基于 DNS 地址解析后的地址列表,将流量透明的、均匀的分发到不同的后端机器上。在使用微服务构建复杂的分布式系统时,如何感知 backend 服务实例的动态上下线,也是微服务框架最需要关心并解决的问题之一。

2023-04-26 13:36:34 656

原创 配置中心基本原理

传统的静态配置方式想要修改某个配置时,必须重新启动一次应用,如果是数据库连接串的变更,那可能还容易接受一些,但如果变更的是一些运行时实时感知的配置,如某个功能项的开关,重启应用就显得有点大动干戈了。配置中心正是为了解决此类问题应运而生的,特别是在微服务架构体系中,更倾向于使用配置中心来统一管理配置。配置中心最核心的能力就是配置的动态推送,常见的配置中心如 Nacos、Apollo 等都实现了这样的能力。目前比较流行的配置中心恰恰没有使用长连接,而是使用长轮询。

2023-04-26 02:13:34 750

原创 Go的IO -- Go语言设计与实现

协程是Go的很大的一个优势。Go天然支持高并发,那么我们来研究一下这个高并发的秘诀在哪里?。CPU 不停的在不同的执行体( Goroutine )之间反复横跳!CPU 一直在装填和运行不同执行体的指令,G1(Goroutine 1 的缩写) 不行就搞 G2 ,一刻不能停,这样才能使得大量的执行体( Goroutine )齐头并进,系统才能完成如此高的吞吐(注意关键字:并发哦)。思考一个问题,程序可以分成CPU密集型合IO密集型,Go适合哪一种?很明显IO密集型,CPU密集型只能买核,买CPU,别无他法。

2023-04-10 17:25:01 869 1

原创 工作中遇到的问题 -- 你见过哪些写的特别好的代码

这段代码涉及到了 Go 语言中的指针、类型转换和内存布局等概念,比较复杂。是 Go 语言中的一个无符号整数类型,它可以表示指针类型的值。,但是这样做可能会导致一些未定义的行为,需要谨慎使用。这是一段 Go 代码,它的作用是获取一个字符串变量。是一个特殊的指针类型,可以将任意类型的指针转换为。的底层指针,即字符串数据的起始地址。类型的值不能直接进行数学运算,但是。类型,可以方便地进行后续的指针运算。字段,即字符串数据的起始地址。指向字符串数据的起始地址。运算符获取了该结构体中的。的地址转换为一个指向。

2023-03-25 19:13:29 515

原创 协议端口和服务端口的区分

由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问之。不通的传输层在操作系统里面不同的软件系统,这也是TCP/UDP端口号可以重复的原因。协议端口是区分网络层交付给哪个传输层的。例如我交付给了TCP协议,然后再通过服务的端口号交付给某一个应用。

2023-03-24 11:06:43 250

原创 Go单元测试

单元测试(Unit Tests, UT) 是一个优秀项目不可或缺的一部分,特别是在一些频繁变动和多人合作开发的项目中尤为重要。你或多或少都会有因为自己的提交,导致应用挂掉或服务宕机的经历。如果这个时候你的修改导致测试用例失败,你再重新审视自己的修改,发现之前的修改还有一些特殊场景没有包含,恭喜你减少了一次上库失误。也会有这样的情况,项目很大,启动环境很复杂,你优化了一个函数的性能,或是添加了某个新的特性,如果部署在正式环境上之后再进行测试,成本太高。

2023-03-19 17:51:47 507 1

原创 ACM模式笔试相关Java API熟悉

计算a+b打开以下链接可以查看正确的代码数据范围: 数据组数 1≤t≤100 1 \le t \le 100 \ 1≤t≤100 , 数据大小满足 1≤n≤1000 1 \le n \le 1000 \ 1≤n≤1000。

2023-03-13 12:28:26 226

原创 工作中遇到的问题 -- Go避免内存拷贝的强制类型转换

name :=(string)("我真的很喜欢你")由于第一个括号里面是一个指针类型,那么第二个括号里面肯定是指针的值。而通过就可以将&msg指针的内存地址取出来。两个括号合起来就是,声明并定义了一个类型的指针变量,对应的指针值还是原来 msg1 的内存地址。那最前面的的那个那个,大家应该都知道,是从类型的指针变量中取出值。然后我们来看一下同样的,则是切片的底层数据结构对咯,只要把里的 Data 塞给里的 Data,再把里的 Len 塞给。

2023-03-08 17:54:12 393

原创 Go语言设计与实现 -- http服务器编程

http 是典型的 C/S 架构,客户端向服务端发送请求(request),服务端做出应答(response)。golang 的标准库net/http提供了 http 编程有关的接口,封装了内部TCP连接和报文解析的复杂琐碎的细节,使用者只需要和和两个对象交互就行。也就是说,我们只要写一个 handler,请求会通过参数传递进来,而它要做的就是根据请求的数据做处理,把结果写到 Response 中。废话不多说,来看看 hello world 程序有多简单吧!我们先把注意力聚焦到/way2上,先暂时不看。

2023-03-07 22:30:54 548 1

原创 安全开发基础 -- DAST,SAST,IAST简单介绍

通过爬虫发现整个 Web 应用结构,爬虫会发现被测Web程序有多少个目录,多少个页面,页面中有哪些参数;根据爬虫的分析结果,对发现的页面和参数发送修改的 HTTP Request 进行攻击尝试(扫描规则库);通过对于 Response 的分析验证是否存在安全漏洞。

2023-03-06 15:42:15 1351

原创 工作中遇到的问题 -- Go暴力拦截函数库gohook

运行时替换函数对Golang这类静态语言来说并不是一件容易的事情,语言层面的不支持导致只能机器码层面做些奇怪hack,往往艰难,但如能成功,那挣脱牢笼带来的成就感,想想就让人兴奋。gohook实现了对函数的暴力拦截,无论是普通函数,还是成员函数都可以强行拦截替换,并支持回调原来的旧函数。trampoline。

2023-03-06 14:34:44 584

原创 Docker -- Docker底层原理深度剖析

谈到Docker原理,我们先来三板斧。然后我们心中要明白一件事情:其中Namespace技术是用来修改进程视图的主要方法。Cgroups技术是用来制造约束的主要手段。Linux 的命名空间机制提供了以下8种不同的命名空间,包括 :clone() 用于创建新进程,通过传入一个或多个系统调用参数( flags 参数)可以创建出不同类型的 NameSpace ,并且子进程也将会成为这些 NameSpace 的成员。setns() 用于将进程加入到一个现有的 Namespace 中。其中 fd 为文件描述符,引

2023-02-27 20:22:29 534 2

原创 Prometheus -- 浅谈Exporter

官方给出了example可以给我们参考:现在我们来解析一下:定义指标for {暴露接口观察监控指标。

2023-02-25 15:12:20 5419

原创 Kubernetes -- no route to host的BUG解决

我推测是因为我们使用的是虚拟机,我们经常挂起虚拟机,然后使用的时候再次打开,这样会有一定的影响。因此我的想法是只需要把网络相关的东西刷新一下就可以了。如果你们用云服务搭建k8s的话是应该不会出现这个问题的。这个是用虚拟机搭建的时候的坑。就是网络插件这里突然Running不了了。那么我们今天来分析一下这个问题。首先我们查看这个Pod的日志信息。的地方,提取出关键的信息。可以发现很快就成功了。这说明是网络的问题。

2023-02-20 18:56:31 2003 1

原创 Go语言设计与实现 -- 反射

尽管 i,j 的底层类型都是 int,但我们知道,他们是不同的静态类型,除非进行类型转换,否则,i 和 j 不能同时出现在等号两侧。接着,使用反射,获取x,y 的反射对象,并且立即比较两者的类型,根据前面的内容,这里实际上是动态类型,如果类型不同,直接返回 false。赋一个 int 类型的值时,它的静态类型还是 interface{},这是不会变的,但是它的动态类型此时变成了 int 类型。先明白一点,如果是不同的类型,即使是底层类型相同,相应的值也相同,那么两者也不是“深度”相等。

2023-02-18 16:57:29 771

原创 云原生 -- Docker进阶(Docker-compose,Docker网络简单介绍)

而之所以被称之为host模型,是因为该模式下的Docker容器会和host宿主机共享同一个网络namespace,故Docker Container的IP地址即为宿主机eth0的IP地址。处于这个模式下的Docker容器共享其他容器的网络环境,因此至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外的其他的容器存在网络隔离。绑定的端口冲突了,因为我们运行的都是tomcat容器,所以绑定的端口是一样的。我们先启动一个my-nginx2的容器,网络在默认的bridge网桥上。

2023-02-15 21:12:14 670 1

空空如也

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

TA关注的人

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