跬步 On Coding

从Pingora到API网关:Rust实战

前言

在学习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网关需求。

k8s云原生程序实现CRD的搜索查询分页

前言

来新公司还是在做云原生平台的开发,基本的业务逻辑就是通过一系列的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的查询压力。

以Vaultwarden为例使用SQLite Litestream实现无数据库服务

前言

Vaultwarden是一个非官方实现的Bitwarden Server,用于密码管理,支持Web端、桌面端和移动端。它支持多种数据来存储数据,包括SQLite、PostgreSQL和MySQL等。当我们想把它部署在一个容器服务平台时,如果容器服务本身没有提供持久挂载的卷,那我们就只能使用PostgreSQL或者MySQL外部数据来存储数据。

但是我们并不想额外再买资源来运行一个数据库,那我们就可以使用SQLite来存储数据,并且使用Litestream来实现容灾备份。这样虽然容器服务没有持久存储,但是数据还是安全的。下面以Vaultwarden为例,使用SQLite和Litestream来实现无数据库服务。其它可以使用SQLite的程序也可以使用这种方式来实现无数据库服务。

自动化自己的生活:创造自己的小工具

前言

作为一位程序员,我写的大部分当然都是用来赚钱生活的代码,赚钱的代码都是非常规范的,一般都是复杂业务逻辑在程序上映射,很多时候都只有在解决了复杂的业务问题,才能获得打怪升级的成就感。

但是我也会在业余时间学习一些工作无关的技术,比如最近半年我学习了Rust,每当我学习一门新的技术,我总是希望把之前实现的一些程序改用新技术来实现,这样就可以更快的上手。平常生活中也没什么用到Rust的场景,那就只能先把之前用Bash,Python写的小工具用Rust重写一遍。然后最近我也自己发掘了一些生活上的场景,这些场景很多时候都是重复的,手动的,如果能改成自动化能够节省很多时间。想起了不知道哪里看过的一个说法:懒惰是程序员的第一生产力,因为懒,我们会把各种重复手动的工作自动化。

下面的内容就是我在今年自动化生活的一部分,通过自己创造的这些小工具,我解决了自己生活中的一些小痛点。

ChromeOS Flex使用体验

前言

由于MacBook带到新公司作为办公本使用,又因为不喜欢带电脑上下班,所以在家里就只好启用6年前在前公司领用的第一台笔记本ThinkPad X1 Carbon (6th Gen),这是一台 i5 8250u/8G Ram/256G SSD/2K14‘ 配置的笔记本,默认使用Windows 10操作系统。这台电脑已经很老了,肉眼可见的在浏览网页时会卡,所以想看看有什么可以拯救一下老电脑的方法,要么直接上Linux,然后各种折腾配置,各种可能面对的问题,高分屏之类的。然后另外一个选择就是Chrome OS Flex,Google官方支持,与其说这是个操作系统,还不如说除了浏览器,这个系统就啥也没有了,当然还可以跑一个lxc容器的Debian。

Google认证设备列表

可以看到这台ThinkPad X1 Carbon (6th Gen)可以官方支持到2028年,非常不错,所以就可以开始折腾了。