Dec 31 2024
今天是2024年的最后一天,我有这一下午的空闲时间,所以就让我来絮絮叨叨的写写我这神奇的2024年吧。
我是龙年出生的,所以2024年是我的本命年,年初的时候,老婆还有姐姐就给我准备了红内裤,红袜子。由于红袜子太过显眼了,所以这一年我的内裤都是红色的,哈哈。本命年,犯太岁,这一年工作上,心态上,都有一些变化,就让我在本命年的最后一天瞎写写吧。
我自己
我是80年代末生人,出生在一个小镇,是标准的小镇做题家。从高中开始基本就不怎么回家了,然后上大学,跑去了云南,双非一本,学的是热能与动力工程。我的同学大都找到了水电厂,火电厂的工作。工作好的去了三峡,一般就去了云南一些比较偏僻的电厂。而我呢毕业就失业了,后来找到一个海南的小电厂。工作2年后,我就来到了深圳,在躺了好几个月后,经一个亲戚的介绍到一个华为的软件外包公司学习做软件测试。
Dec 19 2024
前言
https://github.com/zhu327/pingisx
经过一个多月的开发,终于完成了使用Rust实现一个API网关的目标,通过这个项目,我基本上把Pingora的核心功能都摸透了,然后也再次加深了对APISIX的理解。总的来说PingSIX基于Pingora实现了APISIX的核心功能,是APISIX功能的一个子集。
开发这个项目本身也是为了学习Rust的使用,在开发的过程中确实也遇到了很多的问题,在ChatGPT的帮助下,这些问题得到了解决,也让我对Rust有了更深刻的理解。下面我通过4个方面来总结一下在这个项目中我的收获。
Nov 15 2024
前言
在学习Rust的过程中,我主要进行了一些小工具的练习,对Rust的内存安全性和性能优势有了初步的体会,但始终没有实现过一个完整的大型项目。最近随着Rust在高性能计算领域的应用不断拓展,尤其是Pingora等项目的发布,让我看到了Rust在网络通信领域中的潜力,也激发了我用Rust来实现一个API网关的兴趣。
在加入腾讯之前,我曾使用OpenResty和Kong进行API网关的开发工作,后来在腾讯进一步深入参与了APISix的云原生网关项目,逐步积累了关于API网关设计、实现以及性能调优方面的经验。API网关是一个兼具架构复杂度与性能要求的系统,涉及请求路由、流量控制、身份验证等多个关键模块,恰好可以充分发挥Rust的优势。因此,我决定以Rust为基础开发一个API网关,这不仅是为了提升自己的Rust技术,更希望通过此项目进一步巩固和提升在API网关方面的知识。
在具体实现中,我计划基于Pingora的设计思路,打造一个APISix网关的子集功能。我已在GitHub上发布了该项目的初始版本 https://github.com/zhu327/pingsix,目前实现了基础的standalone模式,包括基本的路由与反向代理功能。接下来,我将扩展插件定义,逐步实现一些典型的功能插件,最终目标是支持基于etcd的动态配置加载,以便适应多场景的API网关需求。
Oct 22 2024
前言
来新公司还是在做云原生平台的开发,基本的业务逻辑就是通过一系列的CRD资源,走Operator的模式来实现平台的各种业务部署。但是CRD在apiserver中是以key-value的形式存储在etcd中,虽然labels可以实现简单的查询,但是并不能满足复杂的查询条件。在我来之前CRD资源的列表查询都是直接全量返回由前端自行筛选,随着业务量的增加,查询的效率越来越低。
本来这个项目的前任开发者决策使用MySQL来双写CRD资源,来实现辅助查询,代码也写了很多了,双写带来了一些代码结构上的耦合,但是其实也不是个问题。更恶心的问题是有一个客户由于信创方面的政治问题,要求我们不能引入MySQL!虽然客户有建议用他们自己的数据库,但是从我们的角度来说,我们不希望自己的服务依赖外部客户组件,所以就必须考虑下其它的方案了,比如不用数据库服务。
基于以往在SQLite上的学习经验,以当前CRD资源的体量完全可以使用SQLite来实现CRD资源的辅助查询,那么是不是要引入持久存储呢?其实还是不用,因为CRD本身已经存储在etcd中了,我们只需要在程序启动时通过k8s的List-Watch的方式将CRD资源同步到SQLite中,这样就可以实现CRD资源的辅助查询了。具体到实现上完全可以使用k8s client中的informer来实现CRD资源的同步,这样可以使用到informer的缓存机制减少apiserver的查询压力。
Sep 3 2024
前言
Vaultwarden是一个非官方实现的Bitwarden Server,用于密码管理,支持Web端、桌面端和移动端。它支持多种数据来存储数据,包括SQLite、PostgreSQL和MySQL等。当我们想把它部署在一个容器服务平台时,如果容器服务本身没有提供持久挂载的卷,那我们就只能使用PostgreSQL或者MySQL外部数据来存储数据。
但是我们并不想额外再买资源来运行一个数据库,那我们就可以使用SQLite来存储数据,并且使用Litestream来实现容灾备份。这样虽然容器服务没有持久存储,但是数据还是安全的。下面以Vaultwarden为例,使用SQLite和Litestream来实现无数据库服务。其它可以使用SQLite的程序也可以使用这种方式来实现无数据库服务。