Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

跬步 On Coding

从Pingora到API网关:总结

前言

https://github.com/zhu327/pingisx

经过一个多月的开发,终于完成了使用Rust实现一个API网关的目标,通过这个项目,我基本上把Pingora的核心功能都摸透了,然后也再次加深了对APISIX的理解。总的来说PingSIX基于Pingora实现了APISIX的核心功能,是APISIX功能的一个子集。

开发这个项目本身也是为了学习Rust的使用,在开发的过程中确实也遇到了很多的问题,在ChatGPT的帮助下,这些问题得到了解决,也让我对Rust有了更深刻的理解。下面我通过4个方面来总结一下在这个项目中我的收获。

从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重写一遍。然后最近我也自己发掘了一些生活上的场景,这些场景很多时候都是重复的,手动的,如果能改成自动化能够节省很多时间。想起了不知道哪里看过的一个说法:懒惰是程序员的第一生产力,因为懒,我们会把各种重复手动的工作自动化。

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