50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

如何使用 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:359884

评论

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

6大奖项揭晓!40+优秀白帽齐聚百度安全BSRC年度盛典

百度安全

漏洞 SRC

观测云产品更新|数据存储策略变更优化;新增支持创建重名的仪表板、笔记、自定义查看器;DQL 参数生效优先级调整等

观测云

数据存储 可观测 产品更新 观测云 可观测性用观测云

软件测试/测试开发 | 电商业务的性能测试(一): 必备基础知识

测试人

软件测试 自动化测试 测试开发

精心整理SpringBoot学习笔记,从Web入门到系统架构

Java你猿哥

Java 面试 面经 校招 春招 java

卓越工作的4个特征

凌晞

项目管理 技术管理 构架

IDO代币合约质押流动性挖矿分红系统开发(开发逻辑及源码)

系统开发咨询1357O98O718

2023我的前端面试小结

loveX001

JavaScript 前端

NFT数字藏品系统开发(开发及流程)丨数字藏品NFT系统开发(源码及功能)

系统开发咨询1357O98O718

美团面试全流程详解:一面 + 二面

Java你猿哥

ssm Java 面试 面经 java

为什么00后都不知道什么是报销?

用友BIP

差旅报销

代币质押流动性挖矿分红开发案例丨代币质押流动性质押挖矿分红系统开发(案例及详细)

系统开发咨询1357O98O718

昇腾 AI 机器人发布,12 家企业、5 家高校签约,昇腾 AI 开发者创享日全国巡展沈阳首站成功举办

科技热闻

如何建设私有云原生 Serverless 平台

北京好雨科技有限公司

Serverless 云原生 #Kubernetes#

【新版】使用 go-cqhttp 扫码登录,一键接入 ChatGPT 机器人到 QQ 群 | 社区征文

江户川码农

人工智能 聊天机器人 科技革命 openai ChatGPT

好家伙!阿里最新版高并发系统设计涵盖了“三高”所有骚操作

Java你猿哥

java面试 面经 春招 java 八股文

两会共议北斗发展,华大北斗芯片领衔

江湖老铁

一场HttpClient调用未关闭流引发的问题

石臻臻的杂货铺

HttpClient

企业软件开发成本高,该如何解决?

飞算JavaAI开发助手

JS模块化—CJS&AMD&CMD&ES6-前端面试知识点查漏补缺

loveX001

JavaScript 前端

腾讯前端一面常考面试题

loveX001

JavaScript 前端

flutter系列之:创建一个内嵌的navigation

程序那些事

flutter 架构 大前端 程序那些事

企业数字化转型的核心——工作流

力软低代码开发平台

问:你是如何进行react状态管理方案选择的?

beifeng1996

前端 React

接近8000字的Spring/Spring常用注解总结!安排!

Java你猿哥

spring Spring Boot ssm java

一文带你深度探析:软硬科技协同创新正当时

加入高科技仿生人

人工智能 科技 科技创新 ChatGPT

什么大模型?我是时尚产业“大模王”!

白洞计划

AI AI制衣

从智能合约到机器学习:NFT 与 AI 技术的结合

NFT Research

大数据 AI NFT

80%的前端开发都答不上来的js异步面试题

loveX001

JavaScript 前端

加速数据要素价值释放,用友打造高性能时序数据库

用友BIP

数据分析

​在行 | AI赋能,为行业发展创造全新可能

用友BIP

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