Introdução

No mundo atual do desenvolvimento de software, a arquitetura de microserviços está se tornando cada vez mais popular devido à sua flexibilidade e escalabilidade. Este tutorial irá guiá-lo na implementação de microserviços utilizando a linguagem Haskell e a biblioteca Servant. Aprenderemos desde a configuração do ambiente de desenvolvimento com Stack, passando pela construção de serviços RESTful, até a realização de testes unitários. Este é um guia prático ideal para desenvolvedores iniciantes que desejam explorar o potencial de Haskell e a eficácia de Servant na criação de APIs robustas e seguras.

Etapas

  1. Configuração do Ambiente de Desenvolvimento

    Começaremos configurando nosso ambiente de desenvolvimento. Certifique-se de que você tenha o Haskell e o Stack instalados em sua máquina. Você pode instalar o Stack seguindo as instruções no site oficial. Após a instalação, verifique se tudo está funcionando corretamente usando os comandos `stack –version` e `ghc –version`.

    commands
    # Verificar versões instaladas
    stack --version
    ghc --version

  2. Criação do Projeto com Stack

    Depois de ter o ambiente configurado, criaremos um novo projeto com Stack. Para isso, utilize o comando `stack new` e escolha o template `simple`. Isso irá configurar uma estrutura básica para seu projeto. Navegue até o diretório do seu projeto após a criação.

    commands
    # Criar um novo projeto
    stack new my-microservice simple
    # Navegar até o diretório do projeto
    cd my-microservice

  3. Adicionando Dependências ao Servant

    Precisamos adicionar a biblioteca Servant ao nosso projeto. Abra o arquivo `package.yaml` e adicione ‘servant’ e ‘servant-server’ às dependências. Depois disso, execute o comando `stack build` para instalar as novas bibliotecas.

    package.yaml
    dependencies: 
      - base >= 4.7 && < 5 
      - servant 
      - servant-server

  4. Definindo a API com Servant

    Vamos criar um módulo para definir nossa API. Crie um arquivo chamado `Api.hs` no diretório `src`. Neste arquivo, vamos definir um tipo de API que expõe um endpoint para obter uma lista de produtos.

    Api.hs
    module Api where
    
    import Servant
    
    type API = "products" :> Get '[JSON] [String]

  5. Implementando o Servidor

    Agora vamos implementar um servidor que atende às definições da API que criamos. Abra o arquivo `Main.hs` e importe o módulo `Api`. Em seguida, crie uma implementação básica da API que retorna uma lista de produtos fixos.

    Main.hs
    module Main where
    
    import Network.Wai
    import Network.Wai.Handler.Warp
    import Servant
    import Api
    
    server :: Server API
    server = return ["Produto1", "Produto2"]
    
    api :: Proxy API
    api = Proxy
    
    main :: IO ()
    main = run 8080 (serve api server)

  6. Executando o Servidor

    Agora que implementamos nosso servidor, vamos executá-lo. Use o comando `stack run` e acesse `http://localhost:8080/products` em seu navegador ou ferramenta de API como Postman para ver a lista de produtos.

    commands
    # Executar o servidor
    stack run

  7. Adicionando Testes Unitários

    Para garantir que nossa API esteja funcionando corretamente, vamos adicionar testes unitários. Crie um arquivo chamado `ApiSpec.hs` no diretório `test` e defina testes para verificar a lista de produtos que a API retorna.

    ApiSpec.hs
    module ApiSpec where
    
    import Test.Hspec
    import Network.Wai
    import Network.Wai.Test
    import Servant
    import Api
    
    main :: IO ()
    main = hspec $ do
      describe "API" $ do
        it "retorna lista de produtos" $ do
          let request = setMethod "GET" "http://localhost:8080/products"
          response <- runSession (get "/products") app
          response `shouldRespondWith` "[{\"Produto1\",\"Produto2\"}]"

  8. Executando os Testes

    Por fim, para rodar seus testes, utilize o comando `stack test`. Isso irá compilar o projeto e executar todos os testes definidos. Verifique os resultados no terminal.

    commands
    # Executar os testes
    stack test

Conclusão

Neste tutorial, exploramos a implementação de microserviços em Haskell usando a biblioteca Servant e o Stack. Desde a configuração do ambiente até a criação da API e a execução de testes, cobrimos todo o ciclo de desenvolvimento. Com esse conhecimento, você pode expandir seus projetos, explorando funcionalidades adicionais do Servant e aprofundando-se na linguagem Haskell. O uso de microserviços permite que você construa aplicações mais escaláveis e manuteníveis, e Haskell oferece uma perspectiva única e poderosa para essa abordagem.

Hashtags

#Haskell #Servant #Microserviços #DesenvolvimentoDeSoftware #APIs