时隔16年Jeff Barr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

如何使用 Rust 来构建微服务?

  • 2020-02-16
  • 本文字数:1739 字

    阅读完需:约 6 分钟

如何使用Rust来构建微服务?

Rust是一门很棒的语言,也是我在 2019 年和 2020 年(截止当前)学的最多的语言。Rust 几乎可以和任何语言互操作,同时对于容器和在 Kubernetes 上运行也非常友好。


今天,我想展示下如何使用 Rust 构建一个简单的微服务。本文中,我们将使用ActixTokio-Postgress和其他一些库,使用 Postgres 作为唯一数据源,同时为了便于开发,我们会将其运行在 Docker 容器中。另外,我还会使用自己开发的Barrel作为数据库迁移工具。代码将全部使用异步和非阻塞 IO 实现。

总体架构


这里我们采用多层架构,业务规则和 REST 请求定义在 news-contract 中实现。SOA 约定定义在 news-contract + news-service,数据结构(News)定义在 news-contract。REST 请求的 endpoint 和服务定义在 news-service 中。Postgres 持久化相关功能定义在 news-dao 中。

代码结构


我们一个有 5 个工程,最顶层是一个全局工作空间,作为第一个工程。其余工程有:


  • news-contract:SOA 约定部分,这里定义了其他工程使用的 News 结构体。

  • news-dao:包含响应式持久化代码,基于 tokio-postgres 实现对 News 资源的增删改查操作。

  • news-migrations:我们使用 barrel 和自定义逻辑来创建表结构和初始化测试数据。

  • news-service:这里我们有 endpoint、服务实现和包含 actix-web 框架配置的入口代码。


每个工程都有自己的依赖,定义在其 Cargo.toml 文件中。


同时,工程中还有 2 个处理 Docker 容器的脚本,一个用于运行 Postgres,另一个用于运行 psql。

数据迁移

现在,让我们来看看如何实现数据迁移(在 Postgres SQL 中创建表和插入记录)。



首先,我们需要连接运行在 Docker 容器中的 Postgres 数据库,创建一个向量,向其中添加所有需要运行的数据迁移逻辑。然后循环执行其中的所有数据迁移逻辑,并检查结果是否正常。


现在,让我们看下一段代码,数据迁移逻辑。



我创建了一个名为 NewsMigration 的 trait,其中包含 new 函数(用于创建结构体)和 run 函数(用于运行数据迁移)。如你所见,然后创建了 CreateTableNewsMigration 结构体,使用 impl 关键字实现了这个 trait。这里我使用了 barrel 来创建表结构,barrel 将会生成 Postgres SQL 的 INSERT 语句。最后,我们使用 pg_client 在 Postres 中运行生成的脚本。这段代码看上去很绕:&news_table[…],这里我们在传递 String 类型 news_table 的引用,将其变成 slice 之后,传给 pg_client 的 execute 函数。

SOA 约定

首先让我们来看下约定的第一部分,News 结构体。



我们定义了一个名为 News 的结构体,同时使用了 serde 和 serde_json,以便于该结构体的序列化和反序列化。这个结构体还实现了 Display trait,用于打印结构体内容。最后在文件的末尾有一个单元测试,用于测试结构体的打印。

Endpoint 和服务


这里我定义了一个基于 actix 的 HttpServer,然后定义了一系列处理器:index、list_news、insert_news、get_news_by_id 和 delete_news_by_id。服务将会运行在本地的 8080 端口上。所有的信息都使用 log 和 env_logger creates 进行日志记录。


现在让我们来看下 endpoint.rs,这里有 REST 请求的定义。



这里我们使用宏来定义 REST 操作,例如 PUT、DELETE 和 GET。每个函数处理器都定义成公有且非常简单,仅仅调用对应的服务,将返回结果序列化成 json 结构返回。



这是服务的实现,这里没有任何 REST 或者 actix 框架的依赖。这里是实现校验、业务逻辑和代理请求 dao crate 的地方。所有函数的增删改查操作都是异步的。

DAO

这里是魔法发生的地方,我们使用了 tokio-postgress 库。先来看下代码。



这是 DAO 层的实现。这里有一个名为 connect()的函数用于连接 Postgres 数据库,它使用异步非阻塞的方式实现。然后展示的是如何实现 find_by_id 功能。在 Postgres 中 ID 使用 UUID 来生成,因此需要将其转成字符串类型,这就是为什么代码中会看见 id::text=$1。同样在这一行中,我将从入参获取到的 ID 转换成了 &[&id]传入。DAO 层还有很多函数,有兴趣的话可以在我的 GitHub 上查看完整代码


视频:代码走读和功能演示


https://vimeo.com/384505355


完整代码:


https://github.com/diegopacheco/rust-playground/tree/master/rust-microservice


原文链接:


http://diego-pacheco.blogspot.com/2020/01/building-microservice-with-rust.html


2020-02-16 16:359891

评论

发布
暂无评论
发现更多内容

3个月夯实基建,鲜丰水果这样实现研发数字化

阿里云云效

云计算 阿里云 云原生 持续交付 研发运维

常见问题(FAQ)页面的搭建步骤

小炮

向工程腐化开炮|动态链接库so治理

阿里巴巴终端技术

android 动态链接库

昇腾CANN论文上榜CVPR,全景图像生成算法交互性再增强!

Geek_32c4d0

昇腾

Flutter 图片库高燃新登场

阿里巴巴终端技术

flutter

龙蜥开发者说:从入坑到入门 | 第 2 期

OpenAnolis小助手

开源 龙蜥社区 开发者说 技术的力量

nginx5种负载策略的设置方法,看完直接怼产品经理

程序媛可鸥

Python 程序员 面试

python DataFrame数据合并 merge()、concat()方法,拿下我人生中第7个Offer

程序媛可鸥

Python 程序员 面试

社区活动 | Apache Pulsar SIG(特别兴趣小组开放)!欢迎大家加入

Apache Pulsar

开源 架构 云原生 Apache Pulsar pulsar 社区

飞桨助力动车3C车载智能识别,为动车组运行保驾护航

百度大脑

从硬件到软件,教你从零搭建智慧农业大脑

华为云开发者联盟

物联网 智慧农业 华为云IoT 小熊开发板 STM32L431芯片

Python 开发编码规范,阿里面试100%会问到的JVM

程序媛可鸥

Python 程序员 面试

python3 基础小练习: 判断闰年,2021最新Python算法相关面试大

程序媛可鸥

Python 程序员 面试

Python“鉴黄”小程序,我离职后面试收割小米等大厂offer

程序媛可鸥

Python 程序员 面试

移动平台WorkPlus助力医院智慧信息化建设

BeeWorks

阿里巴巴副总裁陈丽娟:我对阿里云产品生态的思考 | 云原生加速器观点

阿里巴巴云原生

Kafka 常用命令总结,高级Python面试题

程序媛可鸥

Python 程序员 面试

使用MASA.Blazor写一个标准的查询表格页

MASA技术团队

2021年【大学生Python学习】社区&&小博主,2021最新大厂高频微服务面试总结

程序媛可鸥

Python 程序员 面试

2022年中小企业数据安全如何保障?对比华为云与其他云计算大厂,15分钟的字节跳动视频面试

程序媛可鸥

Python 程序员 面试

大疆被制裁,请马上卸载postman!

Liam

程序员 Postman 开发工具 API swagger

2022年中国在线音乐市场年度综合分析

易观分析

CVE-2021-3129:Laravel远程代码漏洞复现分析

华为云开发者联盟

安全 漏洞 代码复现 CVE-2021-3129 base64 标准

jQuery入门到精通学习教程,收藏我这篇就够了,Alibaba高并发业务实战文档

程序媛可鸥

Python 程序员 面试

Python 实现二叉树前序,中序,后序,零基础也能看得懂

程序媛可鸥

Python 程序员 面试

Python中return和yield的区别,2021年Python笔试题总结

程序媛可鸥

Python 程序员 面试

如何基于 OpenKruise 打破原生 Kubernetes 中的容器运行时操作局限?

阿里巴巴云原生

python3的变量作用域规则和nonlocal关键字,Python面试及答案

程序媛可鸥

Python 程序员 面试

python 同时迭代多个序列,还没吃透内存缓存LruCache实现原理的看这篇文章

程序媛可鸥

Python 程序员 面试

浅谈NIO和Epoll实现原理

Linux服务器开发

网络编程 epoll Linux服务器开发 Linux后台开发 网络io

Python GUI编程:关于 tkinter 怎么才能写出更好看的界面,华为架构师深入讲解Python开发

程序媛可鸥

程序员

如何使用Rust来构建微服务?_编程语言_Diego Pacheco_InfoQ精选文章