ServerPod – O BackEnd em Dart completo
O Serverpod é uma fantástica ferramenta de backend escrita em Dart. Isso permite que um desenvolvedor do Flutter inicie rapidamente o desenvolvimento de back-end e o inclua em sua pilha de tecnologia. Essa estrutura está atualmente em desenvolvimento e serve principalmente como um servidor de aplicativos escalável de código aberto. Como resultado, é possível se tornar um desenvolvedor Full Stack Dart utilizando o Flutter para a interface do usuário e o Serverpod para o backend.
Podemos usá-lo para criar EndPoints (APIs)
, Job Schedulers
, Authentication Systems
e muito mais. O código padrão que aparece quando você cria o projeto é um ótimo lugar para começar. O pacote também inclui scripts de implantação do AWS pré-criados.
Conteudo
Instalação e primeiros passos
Pré-requisito : Docker Desktop e Flutter
Para começar a usar o Serverpod
, execute o seguinte comando para ativar a CLI
:
dart pub global activate serverpod_cli
O comando acima habilita a CLI
do Serverpod
, e agora estamos prontos para criar nosso primeiro projeto.
serverpod create nome_do_projeto
Agora, três pastas serão criadas para nós.
project_name_flutter: Esse tem um aplicativo padrão do flutter gerado com o cliente serverpod para demonstrar como podemos chamar os pontos de extremidade criados diretamente no servidor sem usar nenhum cliente HTTP externo.
project_name_client: Esse é um cliente gerado automaticamente que permite que você se comunique com os pontos de extremidade do servidor. Esse cliente é usado para chamar os pontos de extremidade no aplicativo flutter.
project_name_server: Esse é o servidor backend criado pelo serverpod. Ele é composto de pontos de extremidade de exemplo e retornos de chamada futuros (réplica de trabalhos cron ou agendadores de tarefas).
Para executar o projeto criado, execute os seguintes comandos:
COPY
cd project_name/project_name_server docker-compose up --build --detach dart bin/main.dart
O Serverpod é equipado com várias ferramentas e funções. Vou examinar algumas delas:
1. Suporte a banco de dados: O Serverpod
incorpora a integração do PostgreSQL
e do Relic
. O Docker Desktop
é usado para pré-configurar o banco de dados. Podemos desativar o Relic DB
seguindo os métodos descritos abaixo. As consultas SQL
são produzidas automaticamente quando as classes de modelo são criadas usando ORM
. Como resultado, a criação de tabelas no banco de dados fica mais fácil.
2. ORM e serialização: Contém a funcionalidade do ORM
. Só precisamos produzir arquivos YAML
adequados que forneçam os nomes de tabelas e linhas, juntamente com um índice, se necessário. Ele cria o SQL
para a criação da tabela, que pode então ser executada manualmente no servidor pgSQL criado pelo Docker
. Todas as funcionalidades do banco de dados necessárias para realizar atividades CRUD estão incluídas na classe serializada gerada automaticamente. Também podemos criar classes modais sem usar um banco de dados; basta comentar a chave da tabela no arquivo YAML
. Como resultado, a classe resultante não terá nenhuma função SQL
.
Classe Products que representa a tabela de produtos no banco de dados
# Nome da class para ser gerado class: Products # adiciona a tabela key table: products fields: productName: String productImage: String productUnit: String inventoryAvailable: int mrpPrice: double sellingPrice: double
Exemplo de classe sem interação com o banco de dados
# Nome da classe pra ser gerado Class: Store fields: products: List<Products>
3. Cache: o Serverpod
também tem a capacidade de armazenar dados em cache. Às vezes, os dados estáticos são solicitados repetidamente pelo cliente e, portanto, precisamos mantê-los no cache para economizar consultas e carga do banco de dados. Como resultado, o serverpod
tem a funcionalidade de armazenar em cache o banco de dados usando uma abordagem de valor-chave
. Também podemos incluir a data de expiração. Há dois tipos de cache: Regular
e Priority
.
4. Autenticação: Essa funcionalidade destina-se principalmente ao uso em um aplicativo Flutter
. Por enquanto, ela é compatível com Google
, Apple
e Email SignIn
. O código do cliente pode transmitir a instância de login diretamente para o servidor, e o servidor pode acessar imediatamente as credenciais do usuário a partir daí.
5. Registro em log: Como isso envolve o registro de sessão, podemos registrar os dados usando a função session.log
. Os registros são imediatamente colocados no banco de dados serverpod
logs, que é gerado automaticamente quando um novo projeto é estabelecido. Na próxima versão, também teremos uma interface do usuário para verificar os registros, tornando-a mais rápida do que as formas antigas de procurar diretamente no banco de dados.
6. Chamadas futuras: O recurso mais surpreendente é a capacidade de agendar qualquer trabalho no futuro. As chamadas são salvas no banco de dados, portanto, permanecem mesmo que o servidor seja reiniciado. Por exemplo, se quisermos enviar uma mensagem push a todos os novos usuários sete dias após o registro, poderemos executar facilmente a função e programá-la.
7. Implementação: Obtemos o código padrão do AWS
. Os scripts de implantação são gerados automaticamente pelo projeto. O GitHub
com a configuração do Terraform
torna isso extremamente simples. Mais informações sobre a implantação podem ser encontradas aqui.
Como criar um novo endpoint e chamá-lo?
Siga as etapas para criar um novo EndPoint / API
:
- Crie um novo arquivo dart dentro de lib/src/endpoints/ . Tente seguir a convenção de nomenclatura como
name_endpoint.dart
. - Crie uma nova classe que estenda a classe EndPoint.
- Crie diferentes métodos que precisamos como endpoints. Os métodos devem retornar um
Future
. A lista de argumentos deve conter um argumento de sessão e você pode adicionar quantos argumentos quiser na API. Ainda não há suporte para parâmetros nomeados. - Execute o comando
serverpod generate
para gerar os protocolos e a classe do cliente. - Agora podemos acessar as
APIs
diretamente usando o cliente em aplicativos flutter. - Para acessar as
APIs
em qualquer outro aplicativo que não tenha sido criado no flutter, precisamos fazer uma solicitaçãoPOST
no formato fornecido abaixo:
POST Request para access ao endpoint
Samples Endpoint
import 'package:demopod server/src/generated/protocol.dart'; import 'package:serverpod/serverpod.dart; class ProductEndpoint extends Endpoint { @override bool get requirelogin => true; Future<bool> add( Session session, String? productiame, String? productInage, String? productUnit, int? inventory, double? mrpPrice, double? sellingPrice, ) async { try { await Products. insert( session, Products ( productName: productName ?? "", productInage: productInage ?? "", productUnit: productUnit ?? "", inventoryAvailable: inventory ?? 0, nmrpPrice: mrpPrice ?? 0, sellingPrice: sellingPrice ?? 0, ), ); return true; } catch (e) { print(e.toString()); return false; } } }
PS – Para verificar o nome do endpoint, que talvez precise ser acessado por meio de uma solicitação POST, verifique o arquivo project_name_server/lib/src/generated/endpoints.dart para obter o arquivo de endpoint gerado automaticamente.
Como criar um novo Future Event e chamá-lo?
Temos a capacidade de criar Cron Jobs
ou Schedule a task
para eventos futuros no Serverpod
.
Siga as etapas para criar uma Future call
:
- Crie um novo arquivo dart dentro de
lib/src/future_calls/
. Tente seguir a convenção de nomenclatura como name_future_call.dart. - Crie uma nova classe que estenda a classe
FutureCall
. - Substitua o método invocado com dois parâmetros:
- Session – Pode ser usado para acessar o banco de dados (obrigatório)
- Objeto serializável – Objeto de qualquer classe de modelo (opcional)
4. Escreva o corpo do método invoke e execute todas as ações necessárias.
Por exemplo, enviar e-mails, enviar notificações ou qualquer operação de banco de dados etc.
5. Agora, precisamos registrar essa chamada futura no arquivo server.dart, que está localizado dentro da pasta lib, usando a sintaxe fornecida:
pod.registerFutureCall(ExampleFutureCall(), 'exampleFutureCall');
6. Agora podemos chamar a chamada Future de volta em qualquer lugar, usando o parâmetro de sessão nos pontos de extremidade. A sintaxe para chamá-la é fornecida abaixo:
Sintaxe para chamar uma chamada futura
Future<Store> get( Session session, ) async { var products = await Products.find(session); final store = Store(products: products); await session.Serverpod .futureCallAlTime('exemploFutureCall', null, DateTime.now()); await session.Serverpod .futureCallWithDelay('exemploFutureCall', store, Duration(seconds: 1)); return store; }
É assim que podemos criar um Task Scheduler
no Serverpod
.
Como desativar o servidor Web da Relic?
Se você quiser executar apenas o servidor de endpoint e não o servidor Web, basta remover todas as rotas adicionadas ao servidor Web no arquivo server.dart.
Como desativar o serviço Redis Db?
De acordo com a documentação oficial, precisamos ter tanto o Redis
quanto o PostgreSQL
na imagem da janela de encaixe, mas há uma maneira de desativar o uso do Redis
se não for necessário. Só precisamos remover a parte da configuração do Redis
do arquivo docker-compose.yaml
e, em seguida, executar o comando.
Exemplo de docker-compose.yaml com o Redis removido
docker-compose up – build – detach dart bin/main.dart
Conclusão
É assim que podemos utilizar o ServerPod para aproveitar o Dart como suporte de backend. Ainda há certas restrições em relação aos tipos de argumentos e outros problemas menores nos quais as pessoas estão trabalhando