Go로 자신 있는 GraphQL 서버 만들기 - 1부

22527 단어 gogingqlgengraphql
다음을 사용하여 자신 있는 GraphQL 서버를 만들어 보겠습니다.

  • Gin-gonic 웹 프레임워크

  • OAuth2 연결용Goth

  • GORM DB ORM으로
  • Gomigrate


  • 번거로움 없이 GraphQL 서버를 구축하기 위한 GQLGen

  • 이것은 다음을 가지고 있다고 가정합니다.
  • 최소한 Go 기본 지식이 있고 go 1.12+가 설치되어 있습니다.
  • VSCode(선호) 또는 유사한 IDE

  • 프로젝트 설정



    우리는 Go 표준 프로젝트 레이아웃을 따를 것입니다. 이 서비스에 대해서는 다음을 살펴보십시오.
    사양, 그것은 독단적이지만 좋은 기반으로 작용하며 우리는
    그것의 지침에서 약간의 가닥.

    원하는 위치에 디렉토리를 생성하여 시작합니다.

    $ mkdir go-gql-server
    $ cd go-gql-server
    /go-gql-server $
    


    다음을 사용하여 전체 프로젝트 레이아웃을 생성해 보겠습니다.

    $ mkdir -p {build,cmd/gql-server,internal/gql-server,pkg,scripts}
    # directories are created
    


  • internal/gql-server는 gql 서버에 대한 모든 관련 파일을 보유합니다
  • .
  • cmd/gql-server는 진입점인 서버에 대한 main.go 파일을 보관합니다.
    그것은 모두 함께 접착됩니다.

  • 외부에서 원하는 디렉토리를 사용할 수 있는 go 1.12+를 사용하고 있기 때문에$GOPATH/src 경로, go modules를 사용하여 프로젝트를 초기화하려고 합니다.
    그것으로 우리는 실행해야합니다 :

    $ go mod init github.com/cmelgarejo/go-gql-server # Replace w/your user handle
    go: creating new go.mod: module github.com/cmelgarejo/go-gql-server
    


    웹 서버 코딩



    1. 웹 프레임워크: 진



    이제 프로젝트에 패키지를 추가할 수 있습니다! 우리의 것을 얻는 것으로 시작합시다.
    웹 프레임워크: gin-gonic
    gin-gonic.com에서:

    What is Gin? Gin is a web framework written in Golang. It features a
    martini-like API with much better performance, up to 40 times faster. If you
    need performance and good productivity, you will love Gin.



    $ go get -u github.com/gin-gonic/gin
    go: creating new go.mod: module cmd/gql-server/main.go
    


    2. 웹 서버 코딩



    웹 서버 생성을 시작하고 계속 진행하려면 main.go 파일을 생성합니다.cmd/gql-server
    $ vi cmd/gql-server/main.go
    # vi ensues, I hope you know how to exit
    


    다음 자리 표시자 코드를 붙여넣습니다.

    package main
    
    import (
        "log"
        "net/http"
    
        "github.com/gin-gonic/gin"
    )
    
    func main() {
        host := "localhost"
        port := "7777"
        pathGQL := "/graphql"
        r := gin.Default()
        // Setup a route
        r.GET("/ping", func(c *gin.Context) {
            c.JSON(http.StatusOK, "OK")
        })
        // Inform the user where the server is listening
        log.Println("Running @ http://" + host + ":" + port + pathGQL)
        // Print out and exit(1) to the OS if the server cannot run
        log.Fatalln(r.Run(host + ":" + port))
    }
    


    이 코드go run cmd/gql-server/main.go를 입력하면 GIN 서버가 나타납니다.
    locahost:7777을 듣고 OK를 인쇄하십시오.
    브라우저에서. 효과가있다! 이제 이미 사용하여 이 코드를 리팩토링하겠습니다.
    현재 디렉토리 구조, script, internalpkg 폴더
  • internal/handlers/ping.go

  • package handlers
    
    import (
        "net/http"
    
        "github.com/gin-gonic/gin"
    )
    
    // Ping is simple keep-alive/ping handler
    func Ping() gin.HandlerFunc {
        return func(c *gin.Context) {
            c.String(http.StatusOK, "OK")
        }
    }
    

  • pkg/server/main.go

  • package server
    
    import (
        "log"
    
        "github.com/gin-gonic/gin"
        "github.com/cmelgarejo/go-gql-server/internal/handlers"
    )
    
    var HOST, PORT string
    
    func init() {
        HOST = "localhost"
        PORT = "7777"
    }
    
    // Run web server
    func Run() {
        r := gin.Default()
        // Setup routes
        r.GET("/ping", handlers.Ping())
        log.Println("Running @ http://" + HOST + ":" + PORT )
        log.Fatalln(r.Run(HOST + ":" + PORT))
    }
    

  • cmd/gql-server/main.go 파일을 다음과 같이 변경할 수 있습니다.

  • package main
    
    import (
        "github.com/cmelgarejo/go-gql-server/pkg/server"
    )
    
    func main() {
        server.Run()
    }
    
    

    어때요? 한 줄이면 pkg 폴더가 부족해 서버가 실행됩니다.

    이제 스크립트로 서버를 구축할 수 있습니다.
  • scripts/build.sh ( /bin/sh 더 편재하기 때문에)

  • #!/bin/sh
    srcPath="cmd"
    pkgFile="main.go"
    outputPath="build"
    app="gql-server"
    output="$outputPath/$app"
    src="$srcPath/$app/$pkgFile"
    
    printf "\nBuilding: $app\n"
    time go build -o $output $src
    printf "\nBuilt: $app size:"
    ls -lah $output | awk '{print $5}'
    printf "\nDone building: $app\n\n"
    

    그리고 실행하기 전에 다음을 확인하십시오chmod +x.

    $ chmod +x scripts/build.sh
    # sets execution permission on file
    


    이제 다음과 같이 서버 구축을 시작할 수 있습니다.

    $ .scripts/build.sh
    
    Building: gql-server
    
    real    0m0.317s
    user    0m0.531s
    sys     0m0.529s
    
    Built: gql-server size:16M
    
    Done building: gql-server
    


    16M 독립형 서버, 나쁘지 않다고 생각합니다. 이 서버의 크기는
    도커 이미지! 자, 이제 빌드된 것을 시험해 보겠습니다.

    $ ./build/gql-server
    [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
    
    [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
     - using env:   export GIN_MODE=release
     - using code:  gin.SetMode(gin.ReleaseMode)
    
    [GIN-debug] GET    /ping                     --> github.com/cmelgarejo/go-gql-server/internal/handlers.Ping.func1 (3 handlers)
    2019/07/13 00:00:00 Running @ http://localhost:7777/gql
    [GIN-debug] Listening and serving HTTP on :7777
    [GIN] 2019/07/13 - 00:00:00 | 200 |      38.936µs |             ::1 | GET      /ping
    


    That's some serious speed, 39 µ(micro) seconds.



    그리고 우리는 서버 코드를 더욱 개선하고 구성을 로드할 수 있습니다..env 파일에서 서버용으로 일부 utils를 생성해 보겠습니다.
  • pkg/utils/env.go

  • package utils
    
    import (
        "log"
        "os"
        "strconv"
    )
    
    // MustGet will return the env or panic if it is not present
    func MustGet(k string) string {
        v := os.Getenv(k)
        if v == "" {
            log.Panicln("ENV missing, key: " + k)
        }
        return v
    }
    
    // MustGetBool will return the env as boolean or panic if it is not present
    func MustGetBool(k string) bool {
        v := os.Getenv(k)
        if v == "" {
            log.Panicln("ENV missing, key: " + k)
        }
        b, err := strconv.ParseBool(v)
        if err != nil {
            log.Panicln("ENV err: [" + k + "]\n" + err.Error())
        }
        return b
    }
    


    코드는 거의 자명합니다. ENV var가 존재하지 않으면
    프로그램이 패닉 상태가 되므로 실행해야 합니다. 이제 다음을 변경합니다.
  • pkg/server/main.go 이것으로:

  • package server
    
    import (
        "log"
    
        "github.com/gin-gonic/gin"
        "github.com/cmelgarejo/go-gql-server/internal/handlers"
        "github.com/cmelgarejo/go-gql-server/pkg/utils"
    )
    
    var host, port string
    
    func init() {
        host = utils.MustGet("GQL_SERVER_HOST")
        port = utils.MustGet("GQL_SERVER_PORT")
    }
    
    // Run spins up the server
    func Run() {
        r := gin.Default()
        // Simple keep-alive/ping handler
        r.GET("/ping", handlers.Ping())
        // Inform the user where the server is listening
        log.Println("Running @ http://" + host + ":" + port)
        // Print out and exit(1) to the OS if the server cannot run
        log.Fatalln(r.Run(host + ":" + port))
    
    }
    


    그리고 우리는 그것이 잘 짜여진 프로젝트로서 어떻게 형태를 갖추기 시작하고 있는지 봅니다!

    우리는 이것을 사용하여 로컬에서 서버를 실행하는 것과 같은 몇 가지를 여전히 만들 수 있습니다.
    스크립트:
  • scripts/run.sh (이것도 chmod +x 잊지 마세요)

  • #!/bin/sh
    srcPath="cmd"
    pkgFile="main.go"
    app="gql-server"
    src="$srcPath/$app/$pkgFile"
    
    printf "\nStart running: $app\n"
    # Set all ENV vars for the server to run
    export $(grep -v '^#' .env | xargs) && time go run $src
    # This should unset all the ENV vars, just in case.
    unset $(grep -v '^#' .env | sed -E 's/(.*)=.*/\1/' | xargs)
    printf "\nStopped running: $app\n\n"
    


    그러면 ENV 변수와 go run 서버가 설정됩니다.
    .gitignore 파일을 추가하고 git init 실행하여 원점을 귀하의
    자신의 저장소와 git push 그것을 :)

    이것은 GQLGen 부분을 추가할 위치에서 계속됩니다.
    서버!

    모든 코드를 사용할 수 있습니다here

    좋은 웹페이지 즐겨찾기