본문 바로가기

카테고리 없음

41. 클라우드 네이티브 Go 실습 3편

  • gRPC는 구글이 최초로 개발한 오픈 소스 원격 프로시저 호출 시스템이다. 전송을 위해 HTTP/2를, 인터페이스 정의 언어로 프로토콜 버퍼를 사용하며 인증, 양방향 스트리밍 및 흐름 제어, 차단 및 비차단 바인딩, 취소 및 타임아웃 등의 기능을 제공
  • Apache Beam은 배치와 실시간 데이터 파이프라인을 개발하고, 다양한 런타임 환경을 지원
  • Go-kit는 마이크로서비스 프레임워크이고 다양한 마이크로서비스 디자인 패턴을 지원
  • Mongo는 가장 유명한 NoSQL이고 JSON의 관리 및 집계에 유용
  • Redis는 가장 유명한 캐시 저장소
  • Tracing는 관찰가능성 중 분산추적을 위한 프레임워크를 제공
  • Echo는 웹 어플리케이션 프레임워크이고 Air와 함께 auto reload를 지원
  • MySQL은 오픈소스 RDBMS
  • GORM은 Go언어에서 사용 가능한 ORM(Object Relation Mapping) 라이브러리
  • Operator는 사용자 정의 리소스의 컨트롤러 역할을 수행하며, 쿠버네티스 자원에 대한 멱등성을 구현
  • Exporter는 다양한 시스템으로부터 메트릭을 수집해서 프로메테우스에게 제공
  • RealWorld은 Echo, GORM 등을 사용한 레퍼런스 데모를 제공

3편에서는 Echo, MySQL, GORM을 데모하고 설명한다.

7. Echo

[root@localhost app2]# go get -u github.com/labstack/echo/...
go: downloading github.com/labstack/echo v1.4.4
go: downloading github.com/labstack/echo v3.3.10+incompatible
go: downloading golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
go: downloading golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3
go: downloading github.com/dgrijalva/jwt-go v1.0.2
go: downloading github.com/labstack/gommon v0.3.1
go: downloading github.com/dgrijalva/jwt-go v3.2.0+incompatible
go: downloading github.com/valyala/fasttemplate v1.2.1
go: downloading github.com/mattn/go-colorable v0.1.11
go: downloading github.com/mattn/go-isatty v0.0.14
go: downloading github.com/valyala/bytebufferpool v1.0.0
go: downloading github.com/mattn/go-colorable v0.1.12
go: downloading golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2
go: downloading golang.org/x/sys v0.0.0-20211103235746-7861aae1554b
go get: added github.com/dgrijalva/jwt-go v3.2.0+incompatible
go get: added github.com/labstack/echo v3.3.10+incompatible
go get: added github.com/labstack/gommon v0.3.1
go get: added github.com/mattn/go-colorable v0.1.12
go get: upgraded github.com/stretchr/testify v1.5.1 => v1.7.0
go get: upgraded golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 => v0.0.0-20211215153901-e495a2d5b3d3
go get: upgraded golang.org/x/net v0.0.0-20190620200207-3b0461eec859 => v0.0.0-20220107192237-5cfca573fb4d
go get: upgraded golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a => v0.0.0-20211216021012-1d35b9e2eb4e
go get: upgraded golang.org/x/text v0.3.0 => v0.3.7
[root@localhost app2]#

 

package main

import (
	"net/http"

	"github.com/labstack/echo"
	"github.com/labstack/echo/middleware"
)

func main() {
	// Echo instance
	e := echo.New()

	// Middleware
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	// Route => handler
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!\n")
	})

	// Start server
	e.Logger.Fatal(e.Start(":1323"))
}

 

root@localhost app2]# go run echo.go

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323

 

[root@localhost app2]# go get -u github.com/cosmtrek/air
go: downloading github.com/cosmtrek/air v1.27.8
go: downloading github.com/fatih/color v1.10.0
go: downloading github.com/fsnotify/fsnotify v1.5.1
go: downloading github.com/imdario/mergo v0.3.12
go: downloading github.com/fatih/color v1.13.0
go: downloading github.com/pelletier/go-toml v1.8.1
go: downloading github.com/pelletier/go-toml v1.9.4
go get: added github.com/cosmtrek/air v1.27.8
go get: added github.com/fatih/color v1.13.0
go get: added github.com/fsnotify/fsnotify v1.5.1
go get: added github.com/pelletier/go-toml v1.9.4
go get: upgraded gopkg.in/yaml.v2 v2.2.2 => v2.3.0
[root@localhost app2]# air -v

  __    _   ___  
 / /\  | | | |_) 
/_/--\ |_| |_| \_ , built with Go 

[root@localhost app2]#

 

[root@localhost app2]# 

ot@localhost app2]# air

  __    _   ___  
 / /\  | | | |_) 
/_/--\ |_| |_| \_ , built with Go 

watching .
!exclude tmp
building...
running...

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323

 

 

 

8. MySQL

 

[root@localhost app2]# docker pull mysql

 

[root@localhost app2]# docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=test1234 -d -p 3306:3306 mysql:latest
6e7a638e741f6b29dc8d366606cd84d53eade3196be65c65c099cc4ee7ced6ea
[root@localhost app2]#

 

[root@localhost app2]# docker start mysql-container
mysql-container

 

[root@localhost app2]# docker exec -it mysql-container bash
root@6e7a638e741f:/# mysql -u root -p
Enter password:

 

package main
 
import (
    "database/sql"
    "fmt"
    "log"
    _ "github.com/go-sql-driver/mysql"
)
 
func main() {
    // sql.DB 객체 생성
    db, err := sql.Open("mysql", "root:test1234@tcp(127.0.0.1:3306)/mysql")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
 
    // 하나의 Row를 갖는 SQL 쿼리
    var User string
    err = db.QueryRow("SELECT User FROM user").Scan(&User)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(User)
}

 

[root@localhost app2]# go get -u github.com/go-sql-driver/mysql
go: downloading github.com/go-sql-driver/mysql v1.6.0
go get: added github.com/go-sql-driver/mysql v1.6.0
[root@localhost app2]#

 

[root@localhost mysql]# go run main.go
main.go:7:5: cannot find package "github.com/go-sql-driver/mysql" in any of:
	/usr/local/go/src/github.com/go-sql-driver/mysql (from $GOROOT)
	/root/go/src/github.com/go-sql-driver/mysql (from $GOPATH)
[root@localhost mysql]# go mod init mysql
go: creating new go.mod: module mysql
go: to add module requirements and sums:
	go mod tidy
[root@localhost mysql]# go mod tidy
go: finding module for package github.com/go-sql-driver/mysql
go: found github.com/go-sql-driver/mysql in github.com/go-sql-driver/mysql v1.6.0
[root@localhost mysql]# go build
[root@localhost mysql]# ll
total 5236
-rw-r--r--. 1 root root      69 Jan 10 02:53 go.mod
-rw-r--r--. 1 root root     179 Jan 10 02:53 go.sum
-rw-r--r--. 1 root root     492 Jan 10 02:54 main.go
-rwxr-xr-x. 1 root root 5349108 Jan 10 02:54 mysql
[root@localhost mysql]# ./mysql
root

9. GORM

[root@localhost gorm]# go get github.com/go-sql-driver/mysql

 

package main
import (
	"github.com/jinzhu/gorm"
	_ "github.com/go-sql-driver/mysql"
)
func  main() {
	// mysql 드라이버를 사용하여, 데이터베이스에 접속
	// 사용자 : testuser, 비밀번호 : test1234, URL
	db, _  := gorm.Open("mysql", "root:test1234@tcp(127.0.0.1:3306)/")
	defer db.Close() // 스콥(scope)을 벗어나면, db.CLose()실행, 이 경우는 main()함수 종료시
	dbName  :=  "testdb"  // 생성할 데이터베이스 이름
	// Raw SQL로 데이터베이스 생성
	db.Exec("CREATE DATABASE IF NOT EXISTS "  + dbName)
	db.Exec("commit;")
}

 

[root@localhost gorm]# go mod init gorm
go: creating new go.mod: module gorm
go: to add module requirements and sums:
	go mod tidy
[root@localhost gorm]# go mod tidy
go: finding module for package github.com/jinzhu/gorm
go: finding module for package github.com/go-sql-driver/mysql
go: downloading github.com/jinzhu/gorm v1.9.16
go: found github.com/go-sql-driver/mysql in github.com/go-sql-driver/mysql v1.6.0
go: found github.com/jinzhu/gorm in github.com/jinzhu/gorm v1.9.16
go: downloading github.com/jinzhu/inflection v1.0.0
go: downloading github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5
go: downloading github.com/jinzhu/now v1.0.1
go: downloading github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd
go: downloading github.com/lib/pq v1.1.1
go: downloading github.com/mattn/go-sqlite3 v1.14.0
go: downloading github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe
go: downloading golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd
[root@localhost gorm]# go build
[root@localhost gorm]# ll
total 7024
-rw-r--r--. 1 root root     105 Jan 10 08:07 go.mod
-rwxr-xr-x. 1 root root 7178312 Jan 10 08:07 gorm
-rw-r--r--. 1 root root    3259 Jan 10 08:07 go.sum
-rw-r--r--. 1 root root     579 Jan 10 08:06 main.go
[root@localhost gorm]# ./gorm

 

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

mysql>

 

package main
import (
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)
// 데이터베이스 스키마 Go 언어 선언
type  Product  struct {
	gorm.Model
	Code string
	Price uint
}
func  main() {
	db, err  := gorm.Open("mysql", "root:test1234@tcp(127.0.0.1:3306)/testdb?charset=utf8&parseTime=True&loc=Local")
	if err !=  nil {
		panic("failed to connect database")
	}
	defer db.Close()
	// 테이블 생성
	db.AutoMigrate(&Product{})
	// Create :  레코드 삽입/추가(insert)
	db.Create(&Product{Code: "L1212", Price: 1000})
	// Read : 읽기
	var  product Product
	db.First(&product, 1) // find product with id 1
	db.First(&product, "code = ?", "L1212") // find product with code l1212
	// Update - product의  price 를 2000 으로 갱신/수정
	db.Model(&product).Update("Price", 2000)
	// Delete - product를 삭제
	db.Delete(&product)
}

 

[root@localhost gorm]# go mod init create
go: creating new go.mod: module create
go: to add module requirements and sums:
	go mod tidy
[root@localhost gorm]# go mod tidy
go: finding module for package github.com/jinzhu/gorm
go: finding module for package github.com/go-sql-driver/mysql
go: found github.com/go-sql-driver/mysql in github.com/go-sql-driver/mysql v1.6.0
go: found github.com/jinzhu/gorm in github.com/jinzhu/gorm v1.9.16
[root@localhost gorm]# go build
[root@localhost gorm]# ll
total 7020
-rwxr-xr-x. 1 root root 7175886 Jan 10 08:10 create
-rw-r--r--. 1 root root     868 Jan 10 08:09 create.go
-rw-r--r--. 1 root root     107 Jan 10 08:10 go.mod
-rw-r--r--. 1 root root    3259 Jan 10 08:10 go.sum
[root@localhost gorm]# ./create
[root@localhost gorm]#