Go之路(三十五):微服务之go-micro(二)——docker与mysql
微服务之go-micro(二)——docker与mysql
首先,目录结构如下:

这个小demo的思路是把数据库放在一个容器中,然后user-srv另外起一个容器,通过user-srv来访问mysql.
首先创建mysql的容器
(运行下面的命令前先拉取mysql的镜像)
docker run --name test-mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
handler.go(处理请求的主要逻辑)
package handler
import (
"context"
_ "github.com/go-sql-driver/mysql"
"github.com/gpmgo/gopm/modules/goconfig"
"github.com/jmoiron/sqlx"
"log"
"miracle-cinema/services/user-srv/src/proto"
)
type user_service struct {
}
var (
conf_path = "./conf/mysql.ini"
)
func NewSrv() *user_service {
return &user_service{}
}
func initconf()(login_conf string,err error){
cfg,err := goconfig.LoadConfigFile(conf_path)
if err != nil {
return "",err
}
login_conf,err = cfg.GetValue("mysql","mysql_conf")
log.Println(login_conf)
return login_conf,nil
}
func initdb(log_conf string)(db *sqlx.DB){
db = sqlx.MustConnect("mysql",log_conf)
return db
}
func (c *user_service)CreateUser(context.Context, *user_srv.UserInfo, *user_srv.Response) (err error) {
cfg,err := initconf()
if err != nil{
log.Print("init conf failed")
return err
}
db := initdb(cfg)
//db.Exec()
log.Print(db)
return
}
随后go build出可执行文件(因为懒得在容器里重新安装go)
然后创建dockerfile
FROM ubuntu MAINTAINER miracle RUN mkdir /user-srv COPY . /user-srv WORKDIR /user-srv CMD ./user-srv
然后执行
docker build -t user-srv . docker run -it --link mysql_service:dblink --name dblink user-srv /bin/bash
--link代表与名称为mysql_service的容器连接起来,可以在此容器内通过env获取相关参数
另外,使用sqlx来操作mysql的时候,要注意以下几点
tx := db.MustBegin()
_ = tx.MustExec("INSERT INTO person (first_name, last_name, email) VALUES (?, ?, ?)", "???", "Moiron", "jmoiron@jmoiron.net")
tx.Commit()
如果直接用db.MustExec的话就是直接执行,如果用tx的话,会先放到缓冲区,执行commit的时候再一起提交,另外,占位符号用?,而不是github文档上的$。
data := []Person{}
db.Select(&data,"SELECT * FROM person ")
log.Print(data[0].LastName)
需要有与之对应的结构体来接受数据,返回的是对象,可以直接点属性来获取值

浙公网安备 33010602011771号