当前位置: 首页 > 科技观察

如何使用Rust构建微服务?

时间:2023-03-17 12:23:01 科技观察

Rust是一门很棒的语言,也是我在2019年和2020年(到目前为止)学得最多的语言。Rust几乎可以与任何语言互操作,并且对容器和运行在Kubernetes上也非常友好。今天,我想展示如何在Rust中构建一个简单的微服务。在本文中,我们将使用Actix、Tokio-Postgress等一些库,使用Postgres作为唯一的数据源,并且为了开发的方便,我们将其运行在Docker容器中。另外,我也会使用自己开发的Barrel作为数据库迁移工具。代码将全部使用异步和非阻塞IO实现。1.整体架构这里我们采用多层架构,业务规则和REST请求定义在news-contract中实现。SOA契约在news-contract+news-service中定义,数据结构(News)在news-contract中定义。REST请求的端点和服务在新闻服务中定义。Postgres持久化相关的函数定义在news-dao中。2.代码结构我们有5个项目,顶层是一个globalworkspace作为第一个项目。其他项目包括:news-contract:SOA契约部分,定义其他项目使用的News结构。news-dao:包含响应式持久化代码,基于tokio-postgres实现对News资源的增删改查操作。news-migrations:我们使用桶和自定义逻辑来创建表结构和初始化测试数据。新闻服务:这里有端点、服务实现和入口代码,其中包含actix-web框架的配置。每个项目都有自己的依赖项,在其Cargo.toml文件中定义。同时,项目中有2个处理Docker容器的脚本,一个运行Postgres,一个运行psql。3.数据迁移现在,让我们看看如何实现数据迁移(在PostgresSQL中创建表和插入记录)。首先,我们需要连接到Docker容器中运行的Postgres数据库,创建一个vector,将所有需要运行的数据迁移逻辑添加进去。然后循环执行所有的数据迁移逻辑,检查结果是否正常。现在,我们来看下一段代码,数据迁移逻辑。我创建了一个名为NewsMigration的特征,其中包含一个新函数(用于创建结构)和一个运行函数(用于运行数据迁移)。如您所见,然后创建CreateTableNewsMigration结构,使用impl关键字实现此特征。这里我使用barrel创建表结构,barrel会生成PostgresSQLINSERT语句。最后,我们使用pg_client在Postres中运行生成的脚本。这段代码看起来比较绕:&news_table[..],这里我们传递了String类型的news_table的引用,将其变成一个slice之后,传递给pg_client的execute函数。4.SOAConventions让我们首先看一下契约的第一部分,News结构。我们定义了一个名为News的结构,并同时使用serde和serde_json来促进该结构的序列化和反序列化。该结构还实现了Display特性,用于打印结构的内容。最后,文件末尾有一个单元测试,用于测试结构的打印。5.端点和服务这里我定义了一个基于actix的HttpServer,然后定义了一系列的处理器:index、list_news、insert_news、get_news_by_id和delete_news_by_id。该服务将在本地端口8080上运行。所有消息都使用log和env_logger创建的记录。现在让我们看看定义REST请求的endpoint.rs。这里我们使用宏来定义REST操作,如PUT、DELETE和GET。每个功能处理器都被定义为公共的并且非常简单。它只是调用相应的服务,将返回结果序列化成json结构返回。这是服务的实现,没有任何REST或actix框架依赖性。这是实现验证、业务逻辑和代理请求daocrate的地方。所有函数的增删改查操作都是异步的。6.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