Introdução

Neste tutorial, abordaremos como implementar microserviços em Haskell utilizando o framework Servant, que facilita o desenvolvimento de APIs RESTful de forma eficiente e segura. Também exploraremos o uso do Docker para a contêinerização da aplicação, garantindo que ela seja escalável e portátil. O objetivo é guiar desenvolvedores, iniciantes ou experientes, por meio de um processo prático e passo a passo, para criar uma API que possa ser facilmente testada e implantada. Durante o artigo, discutiremos os conceitos fundamentais de Haskell, as principais funcionalidades do Servant, e como orquestrar tudo isso com Docker, criando um ambiente de desenvolvimento ágil e moderno.

Etapas

  1. Configuração do Ambiente de Desenvolvimento

    Certifique-se de que você tenha o GHC (Glasgow Haskell Compiler) e o Stack instalados em sua máquina. O GHC é o compilador de Haskell, enquanto o Stack facilita a criação de projetos. Para instalar o Stack, siga as instruções na página oficial do Stack.

    commands
    # Verificar se o GHC e Stack estão instalados
    ghc --version
    stack --version

  2. Criação do Projeto Haskell com Stack

    Utilize o Stack para criar um novo projeto Haskell. Execute o comando abaixo para inicializar um novo projeto. Escolha o nome do seu projeto e aguarde a criação do ambiente.

    commands
    stack new my-microservice simple
    cd my-microservice

  3. Adicionando Dependências no `stack.yaml`

    Abra o arquivo `stack.yaml` e adicione as dependências do Servant e outras bibliotecas que deseja utilizar. Aqui está um exemplo básico de como você poderia configurar as dependências.

    stack.yaml
    resolver: lts-18.0
    packages:
    - .
    extra-deps:
    - servant-0.18
    - servant-server-0.18
    - aeson-2.0.0.0
    

  4. Criação de um Módulo para a API

    Crie um novo arquivo chamado `Api.hs` na pasta `src`. Neste arquivo, você definirá a sua API, utilizando o Servant para descrever os endpoints e os tipos de dados.

    Api.hs
    module Api where
    
    import Servant
    
    -- Definindo a API
    type API = "hello" :> Get '[PlainText] String
    
    -- Implementando a API
    server :: Server API
    server = return "Hello, World!"

  5. Implementação do Servidor

    Crie um arquivo `Main.hs` na pasta `src` para implementar o servidor que irá expor a API definida no arquivo `Api.hs`. A seguir, você verá como iniciar o servidor ao executar o projeto.

    Main.hs
    module Main where
    
    import Servant
    import Network.Wai.Handler.Warp
    import Api
    
    main :: IO () {
      putStrLn "Iniciando o servidor..."
      run 8080 app
    }
    
    app :: Application
    app = serve (Proxy :: Proxy API) server

  6. Executando a Aplicação

    Use o Stack para compilar e rodar sua aplicação. Após o servidor estar em execução, você pode testar o endpoint utilizando o navegador ou ferramentas como cURL.

    commands
    # Compilar e executar a aplicação
    stack run
    # Testar o endpoint
    curl -X GET http://localhost:8080/hello

  7. Contenerização da Aplicação com Docker

    Crie um arquivo `Dockerfile` na raiz do seu projeto para configurar a contêinerização da aplicação. Este arquivo indicará como construir a imagem do Docker.

    Dockerfile
    FROM haskell:8.10.4
    
    WORKDIR /app
    
    COPY . .
    
    RUN stack setup && stack build
    
    CMD ["stack", "exec", "my-microservice-exe"]

  8. Construindo e Executando o Contêiner

    Construa a imagem do Docker e execute o contêiner. Isso irá permitir que você execute sua aplicação em um ambiente isolado e consistente.

    commands
    # Construir a imagem
    docker build -t my-microservice .
    # Executar o contêiner
    docker run -p 8080:8080 my-microservice

  9. Testando a API dentro do Contêiner

    Após o contêiner estar em execução, teste o endpoint novamente para garantir que a aplicação está funcionando corretamente dentro do Docker.

    commands
    # Testar o endpoint
    curl -X GET http://localhost:8080/hello

Conclusão

Neste tutorial, você aprendeu como implementar microserviços em Haskell utilizando o framework Servant junto com Docker. Através de um processo prático, abordamos como configurar o ambiente de desenvolvimento, definir uma API básica, implementar o servidor e contêinerizar a aplicação. Agora você tem uma base para criar APIs mais complexas e seguras em Haskell, aproveitando o poder do Servant e a portabilidade do Docker. Com essas habilidades, você pode expandir suas aplicações e explorar novas funcionalidades fornecidas pelo ecossistema Haskell.

Hashtags

#Haskell #Servant #Docker #Microservices #APIDevelopment #SoftwareDevelopment