跳转到主要内容
Chinese, Simplified

Rust是一门很棒的语言,目前是我2019年和2020年(到目前为止)学习最多的语言。Rust几乎可以与任何语言进行互操作。Rust对容器和K8s也很好。今天我要展示如何构建一个简单的微服务。我们将使用Actix、Tokio Postgress和其他库。我们将使用postgres作为事实的来源,并在docker中运行它(为了开发)。我们还将使用Barrel +一些我创建的自定义移植结构。代码将全部是异步和非阻塞IO。希望你玩得开心,我们开始吧。

架构

Image for post

这里我们有一个多层架构,其中业务规则和rest定义在news-contract中定义。SOA契约在news-contract + news-service中定义,结构(news)在news-contract中定义。rest endpoint definitions+服务是在news-service上定义的。postgress持久性在news dao中定义。

代码结构

Image for post

我们有5个项目,有一个全局工作区,这是一个项目,顶层的。我们有news-contract:这是SOA契约的一部分,我们在代码中使用了新闻结构。

news-dao:我们有使用tokio postgres的反应式持久性代码和新闻资源的所有CRUD操作。

News-migrations:为了测试,我们使用barrel+自定义逻辑来创建表和添加数据。

News-service:这里有端点、服务实现和配置了actixweb框架的主类。

每个项目都有自己的依赖项,由Cargo.toml文件。

我们还有两个脚本处理Docker容器。一个运行Postgres,另一个运行psql。

迁移

现在让我们看看如何进行迁移(创建表并将记录添加到Postgres SQL中)。

Image for post

我们连接在docker上运行的Postgres数据库,创建一个包含所有迁移的向量,我们正在运行这个迁移。然后我们将进行一个for all迁移,逐个检查它们是否运行良好。

现在让我们看看下一个rust代码,什么是迁移。

Image for post

我创建了一个名为NewsMigration的结构,其中有一个新的(用于创建结构的函数)和运行迁移的方法(run)。如您所见,我创建了第二个名为CreateTableNewsMigration的结构,以及一个使用(impl)的trait实现,在我使用的barrel代码中创建了一个表结构,barrel将生成Postgres SQL INSERT语法。最后,我们在Postress中使用pg\u客户机运行生成的脚本。在这里您可能会看到有点奇怪的代码:&news_table[..],在这里我们传递String news_表的引用,并传递一个片段([..]),复制字符串并传递方法。

SOA契约

让我们来看看Soa合同的一部分,Struct新闻。

Image for post

我们正在定义一个名为News的结构,我使用serde和serde_json来序列化和反序列化这个结构。我还实现了一个称为Display的特性,以便能够打印结构。最后,在文件的末尾有一个单元测试,我正在测试是否可以打印这个结构。

端点/服务

Image for post

这里我定义了HttpServer actix,并定义了几个处理程序,比如:index、list、insert、get、delete等。所有信息都使用日志和env_logger创建来记录。

现在让我们看看端点.rs把剩下的定义归档。

Image for post

这里有一些宏使用REST操作,比如PUT、DELETE和GET。每个函数处理程序都是公共的,基本上,这里我调用服务并从服务中获取结果并序列化为json结果。

Image for post

这是服务实现,我们这里没有任何REST或actix依赖关系。这里是实现验证、业务逻辑和委托给dao机箱的正确位置。CRUD上的所有函数都是异步的。

DAO

这是魔术发生的地方,我们有tokio-postgress编码。我们来看看。

Image for post

这是DAO实现。有一种方法可以在名为connect()的postgres数据库上进行连接,该方法以异步和非阻塞的方式进行。在这里,我演示了如何通过id进行查找。使用tokio postgress客户端,我执行一个查询,通过SELECT查询执行WHERE by id。在postgress id中,handle作为一个UUDI,所以我需要转换为string,这就是为什么您看到id::text=$1,在同一行中,我用&[&id]传递从参数获得的id。DAO有更多的函数,您可以在mine GitHub中查看完整的代码。

视频:代码演练+死亡演示

让我们看看我用代码演练和死亡演示制作的视频。

 

 

原文:https://medium.com/@ilegra/building-a-microservice-with-rust-ef9641cf2331

本文:http://jiagoushi.pro/node/1412

讨论:请加入知识星球【全栈和低代码开发】或者小号【it_training】或者QQ群【11107767】

Tags
 
Article
知识星球
 
微信公众号
 
视频号