Começando com Go - parte 1 - 시작

11112 단어
Salve, meu povo, tudo certo? Espero que sim.

Bom, eu resolvi começar aprender Golang, a linguagem para backend criada pelo Google. Não vou entrar em detalhes do que é a linguagem ou do porquê de eu decidir começar a aprendê-la. Tem materiais por aí muito melhor escritos do que qualquer coisa que eu pudesse colocar aqui. A intenção desta érie é ir acompanhando e documentando meu desenvolvimento e descobertas e quem sabe, servir para alguém que estiver nessa mesma jornada.

해석할 수 있습니까?



Uma plataforma SaaS multitenancy que se integra a varias formas de envio de mensagem(E-mail, SMS, Voz, qualquer jeito que exista de se comunicar com um cliente) e, de forma escalável centralize estes envios, através de um api. Também teremos um portal em que seja possível administrar os meus envios, clientes, aplicações que poderão utilizar a api da ferramenta 등.

Tenho algumas premissas para esta construção:
  • Implementação de uma base de dados(Postgres) com migrações
  • API 환경에 대한 요청으로 gerenciar를 위한 Rabbitmq(Rabbitmq)를 구현합니다.
  • Arquitetura 에스칼라벨 (microsserviços)
  • 도커
  • API Rest documentada com Swagger
  • 클린 아키텍처
  • 모노레포
  • 80%의 고환 단위 커버리지

  • O resto, vamos ajustando durante essa jornada. 보라라?

    Antes: 설치 또는 이동



    Não é o propósito desta postagem explicar a instalação, tampouco como iniciar um projeto (dependencias, etc). A documentação é bem completa, da uma passada lá:D (btw, o link é: https://golang.org/ )

    아니오, uma coisa que está me ajudando muito é utilizar as extensões de golang do vscode. Poupei bastante tempo com a questão das dependsências do projeto.

    설명: estruturação



    Semper tive uma ótima experiência com clean architecture quando o assunto é organização do projeto. O 소프트웨어 cresce de forma orgânica, fácil de ler e documentada. Como não vou inventar a roda, vou basear toda a minha estrutura do projeto no repositório https://github.com/eminetto/clean-architecture-go-v2 (Obrigado, eminetto). Achei a estrutura simples yet completa, me parece ser um bom início.

    Então, comecando:



    A primeira coisa que fiz foi criar um diretório chamado communication-engine , que vai ser a raiz do meu projeto e dentro dele, um diretório management_api , que vai ser o diretório que vai guardar a minha api responsável por servir, futuramente, a 응용 프로그램 프런트 엔드.

    mkdir -p communication-engine/management_api
    


    Dentro da 파스타management_api , eu criei dos diretórios, oapi , que vai guardar todos os meus arquivos relacionados a api (핸들러, 미들웨어, modelos de apresentação 등) e também a 파스타config , cujo propósito é autodescritivo .

    cd communication-engine/management_api
    mkdir api
    mkdir config
    


    Na 파스타 config , eu criei o arquivo config_dev.go , com o seguinte conteúdo

    package config
    
    const (
        DB_USER     = "communication_engine"
        DB_PASSWORD = "communication_engine"
        DB_DATABASE = "communication_engine"
        DB_HOST     = "127.0.0.1"
        API_PORT    = 8080
    )
    
    


    Já na 파스타 api , o primeiro arquivo que criei foi o main.go , que vai ser o arquivo de entrada da nossa api. A implementação dele, por enquanto, é bem simples:

    package main
    
    import (
        "io"
        "log"
        "net/http"
        "os"
        "strconv"
        "time"
    
        "github.com/gorilla/context"
        "github.com/gorilla/mux"
        "github.com/marcelocpinheiro/communication-engine/management_api/config"
    )
    
    func main() {
        //Instância um novo roteador MUX, um roteador http para go
        r := mux.NewRouter()
    
        // Repassa as rotas para o roteador
        http.Handle("/", r)
    
        // Cria um handler para a url "/ping", escreve "running" na tela e retorna o status 200
        r.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
            io.WriteString(w, "Running")
            w.WriteHeader(http.StatusOK)
        })
    
        // Cria um logger para a aplicação
        logger := log.New(os.Stderr, "logger: ", log.Lshortfile)
    
        // Instancia um novo servidor com configurações específicas de timeout, endereço, log e handler
        srv := &http.Server{
            ReadTimeout:  5 * time.Second,
            WriteTimeout: 10 * time.Second,
            Addr:         ":" + strconv.Itoa(config.API_PORT),
            Handler:      context.ClearHandler(http.DefaultServeMux),
            ErrorLog:     logger,
        }
    
        //Printa na tela a porta que a aplicação está ouvindo
        log.Printf("Listening on port %d", config.API_PORT)
    
       //inicia o servidor e, se houver erro, mata a aplicação e printa o erro
        err := srv.ListenAndServe()
        if err != nil {
            log.Fatal(err.Error())
        }
    }
    


    중요: A importação da config se você estiver replicando esse projeto vai ser de acordo com o endereço de repositório que você especificou para o seu projeto, o que obviamente vai ser diferente do meu(espero).

    Vamos ver se isso está funcionando?

    go run management_api/api/main.go
    


    Se tudo está certo, você deve estar vendo o seguinte output na sua tela:

    2021/03/16 09:55:57 Listening on port 8080
    


    E aí, o que resta é abrir o seu 브라우저 e bater na url http://localhost:8080/ping . 지금은 "Running"이라는 단어가 있습니다. É isso, criamos o primeiro endpoint.



    Fique ligado para acompanhar a série, e siga @devmediano no instagram, devo estar postando mais sobre essa série por lá.

    No próximo post vamos criar o primeiro endpoint dentro da estrutura do router, e já responder requisições post dentro da estrutura do clean architecture que está sendo utilizada. 아테 라!

    좋은 웹페이지 즐겨찾기