Go로 자신 있는 GraphQL 서버 만들기 - 1부
Gin-gonic 웹 프레임워크
OAuth2 연결용Goth
GORM DB ORM으로
번거로움 없이 GraphQL 서버를 구축하기 위한 GQLGen
이것은 다음을 가지고 있다고 가정합니다.
프로젝트 설정
우리는 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
, internal
및 pkg
폴더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
Reference
이 문제에 관하여(Go로 자신 있는 GraphQL 서버 만들기 - 1부), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cmelgarejo/creating-an-opinionated-graphql-server-with-go-part-1-3g3l텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)