- 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]#