image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image
Franklyn Sancho
Franklyn Sancho13/07/2023 12:50
Compartilhe

Rust - uma máquina para desenvolvimento de API

  • #API Rest

Sumário

  1. Resumo
  2. O conceito de API
  3. Protocolo HTTP
  4. Formato de dados JSON
  5. Visão Geral do Rust no mercado
  6. As vantagens e Desvantagens do Rust
  7. Desenvolvimento de API com rust
  8. Conclusão
  9. Fontes

Resumo

Quando estamos desenvolvendo uma API, abreviação de application programming interface, responsável pela comunicação entre sistemas, é de suma importância que haja performance e segurança.

Nesse artigo falaremos sobre API REST, uma interface que faz essa comunicação por meio do protocolo HTTP e seus métodos (GET, POST, PUT E DELETE) e o rust, uma linguagem de programação que tem como objetivo oferecer segurança e alta performance.

O conceito de API 

Para explicar o que é uma API de forma didática, pense num aplicativo de streaming de música, onde você, o usuário, por meio de uma interface de aplicação (o sistema FrontEnd), tem acesso a um catálogo imenso de músicas. 

Quando você escolhe a música e clica nela, o FrontEnd envia uma requisição para o BackEnd (um outro sistema) e aguarda uma resposta.

Essa comunicação entre as camadas do serviço é feita pela API, onde ela interpreta a requisição do FrontEnd e traduz para uma “linguagem” que o BackEnd entende, que, por sua vez, envia uma resposta para o FrontEnd — essa resposta pode ser a música ou um status de erro (que veremos mais para frente)

Existem diversas ferramentas e linguagens que são excelentes para a construção de API’s:

  1. JavaScript com NodeJS;
  2. Java com Spring Boot;
  3. C# com ASP.NET;
  4. Ruby com Ruby on Reals;
  5. Rust com Actix, Rocket e etc;

Nesse artigo nós vamos falar sobre o desenvolvimento de API’s com Rust, uma excelente ferramenta para desenvolver APIs que requerem alta performance e baixa latência.

Uma curiosidade que talvez muitos não saibam, é que podemos desenvolve recursos em Rust para aplicações em outras tecnologias. Por exemplo, vamos supor que estejamos desenvolvendo uma aplicação em NodeJS, onde um determinado recurso requer alta performance. Nós podemos desenvolver essa funcionalidade em rust usando uma ferramenta chamada Node-rs e depois importar para o código NodeJS por meio do require

Protocolo HTTP 

Antes da gente entrar de cabeça e entender como funciona uma API em rust, vamos entender o que é o protocolo HTTP

“HTTP é um protocolo (protocol) que permite a obtenção de recursos, como documentos HTML. É a base de qualquer troca de dados na Web e um protocolo cliente-servidor, o que significa que as requisições são iniciadas pelo destinatário, geralmente um navegador da Web”

Como falamos no resumo, o HTTP possui um conjunto de métodos de requisição: 

  • GET: É o método de leitura, responsável por recuperar os dados do servidor. Por exemplo, você está lendo esse artigo por meio de um método GET que retorna ele do servidor para o navegador
  • POST: É o método de escrita, responsável por enviar e criar novos dados no servidor. Por exemplo, quando você envia seus dados para se registrar numa rede social, está fazendo um post desses dados para o servidor
  • PUT: É o método de atualização, responsável por editar, atualizar e modificar dados no servidor. Por exemplo, quando você atualiza uma postagem numa rede social, está fazendo um put no servidor
  • DELETE: É o método de remoção, responsável por deletar os dados do servidor. Por exemplo, quando você deleta uma postagem, uma foto ou exclui uma conta. 

Além dos métodos, o protocolo HTTP também dispõe de um conjunto de códigos de status, que indicam o resultado da requisição. Lembra do que falamos no inicio desse artigo? A requisição sempre retorna um código de status, seja ele de sucesso ou não: 

  • 1xx: respostas de informação
  • 2xx: respostas de sucesso
  • 3xx: redirecionamento
  • 4xx: erro do cliente
  • 5xx: erro do servidor

Sabe quando você tenta acessar uma página e retorna um erro 404? Então, vejamos outros exemplos de status code para ficar mais claro esse assunto:

  • 201 Created: A requisição foi bem sucedida e o recurso foi criado no servidor. 
  • 401 Unauthorized: Esse código indica que a requisição requer autenticação de usuário 
  • 500 Internal Server Error: Este código indica que o servidor encontrou uma condição inesperada que o impediu de responder à requisição.

Formato de dados JSON 

Ainda sobre protocolo HTTP e servidor web, precisamos falar sobre o queridinho da comunidade de desenvolvimento, o formato de dados JSON. Acrônimo de JavaScript Object Notation, este é um dos formatos mais populares para trocar dados na web, pois é leve e simples. 

Ele é representado por valores e objetos em texto legível e, apesar de ter o nome JavaScript, é independente da linguagem. Vejamos um exemplo da estrutura JSON 

image

Um uso simples do formato JSON é quando estamos desenvolvendo uma API e queremos recuperar alguns dados numa determinada rota. 

Visão Geral do Rust no mercado

O rust tem como objetivo oferecer segurança e performance, o que lhe dá muitas vantagens na hora de desenvolver sistemas e aplicações que requerem alta performance. Estes são alguns exemplos de grandes aplicações que usam rust em seus serviços 

https://discord.com/blog/why-discord-is-switching-from-go-to-rust

https://www.wired.com/2016/03/epic-story-dropboxs-exodus-amazon-cloud-empire/

https://deno.land/

Sobre as Vantagens e Desvantagens do Rust

São muitas as vantagens de construir uma api com rust. Vejamos abaixo cada um dos tópicos e seus pontos principais: 

Segurança

O rust possui muitas garantias de segurança que são verificadas em tempo de compilação, ou seja, antes de executar o programa. Infelizmente, não poderei abordar sobre todas as garantias de segurança que o rust nos oferece, mas essas são as principais: 

  • Ownership: sistema que permite um gerenciamento de memória seguro e eficiente, sem necessitar de um garbage collector ou alocamento explícito. A sua abordagem é feita por um sistema de posse que verifica algumas regras: cada valor em rust possui uma variável que é dita seu dono, pode haver apenas um dono por vez, quando o dono estiver fora do escopo seu valor é destruído. 
  • Empréstimo: O rust possui um sistema de empréstimo que permite compartilhar valores sem violar as regras de propriedade. Este empréstimo é feito por meio de referências, ou seja, o valor não é movido, mas emprestado por um determinado tempo, conhecido como lifetime. 

Além dessas duas abordagens, também temos o trait, o lifetime, os macros, o modo unsafe e etc. Todas essas garantias de segurança previnem muitos erros comuns como acesso inválido a memória, vazamento de recursos, inconsistências e etc. 

Performance

O rust foi projetado para lidar com sistemas que requerem alta performance e complexidade. Vejamos alguns pontos principais: 

  • Integração com códigos externos: O rust possui uma palavra-chave extern, que nos permite interagir com códigos externos, geralmente em C. Excelente para integração com hardware, códigos legados e etc;
  • Instruções de baixo nível: Somado a integração com códigos externos, o rust nos permite trabalhar com instruções de baixo nível, aquelas que estão muito próximas da linguagem de máquina. Excelente para integração com hardware, desenvolvimento de driver, sistemas operacionais, api de comunicação entre sistema e serviços e etc
  • Programação assíncrona: o rust permite executar muitas tarefas sem bloquear a thread principal. 
  • Alta performance e baixa latência: o rust é excelente para lidar com aplicações que requerem baixa latência como cotações de ações em tempo real, ordens de compra e venda, chat, histórico de transações e etc

Produtividade

O rust é uma linguagem moderna, concisa e com diversos recursos que permitem uma alta produtividade. 

  • Cargo: é uma ferramenta integrada que facilita a instalação de bibliotecas, compilação, teste e distribuição dos projetos
  • Documentação: A documentação do rust é excelente, possuindo muitos exemplos, suporte e tutoriais
  • Crates: O Rust também tem uma ampla biblioteca padrão e um rico ecossistema de crates.

 

Apesar das vantagens, o rust também possui algumas desvantagens consideráveis, como por exemplo

  • A curva de aprendizado: Apesar de moderna, o rust é uma linguagem muito complexa; 
  • É uma linguagem relativamente nova: Lançada em 2010, o rust ainda não é uma linguagem tão consolidada quanto as outras

Desenvolvimento de API com rust

Para que o artigo não fique muito longo, ao invés de desenvolver uma API completa do zero, veremos algumas estruturas desenvolvidas com o Actix_Web, uma extensão do framework Actix. 

image

  • O parâmetro da função assíncrona recebe como tipo o web::json, ou seja, os dados de requisição serão enviados no formato json
  • Essa função terá dois possíveis resultados, um HttpResponse ou um Error. É importante mencionar que o resultado HttpResponse também pode retornar um erro (já falamos sobre status code)

image

  • O handlers é o arquivo que possui a função resize_image;
  • Nós temos uma função publica chamada init_routes que possui as rotas da nossa aplicação;
  • A primeira rota é o “/resize” do tipo post, ou seja, os dados serão enviados para o servidor;
  • A segunda rota é o “/download/{filename}” do tipo get, ou seja, vamos recuperar a imagem redimensionada para download;

image

  • Na função acima nós instanciamos um novo servidor e configuramos para receber as rotas da função init_routes

Podemos construir os recursos da nossa página web com um script em javascript também, deixando a responsabilidade das requisições que requerem alta performance com o rust. Sim, podemos somar o poder de duas tecnologias numa mesma aplicação

É óbvio que os exemplos cima não representam a estrutura completa de uma api em rust, apenas algumas partes. Mas por esses exemplos, já podemos perceber a presença do protocolo http, formato json, resultados, arquivos estáticos como html e css.

Conclusão

O rust é uma linguagem muito poderosa para a construção de APIs e pode ser usada em conjunto com outras linguagens para o desenvolvimento de recursos que requerem alta performance e baixa latência. Hoje, com a tecnologia se tornando cada vez mais complexa, onde as aplicações requerem cada vez mais performance e segurança, é fundamental ter conhecimento numa tecnologia que foi construída com esse propósito.

Existem outras ferramentas para construir api com rust além do Actix, como o Rocket, muito consolidada no mercado e o warp, um framework minimalista, muito poderoso e moderno

Fontes

https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Overview

https://franklyn-sanc.medium.com/rust-unsafe-uma-introdu%C3%A7%C3%A3o-%C3%A0-parte-da-linguagem-que-nos-d%C3%A1-super-poderes-24f54bf8cca2

https://franklyn-sanc.medium.com/entendendo-os-pilares-da-seguran%C3%A7a-em-rust-ownership-empr%C3%A9stimo-trait-lifetime-e-borrow-check-3b5898653c77?source=your_stories_page-------------------------------------

Compartilhe
Comentários (0)