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)

  需要有与之对应的结构体来接受数据,返回的是对象,可以直接点属性来获取值

 

posted @ 2019-01-02 23:09  __Miracle  阅读(913)  评论(0)    收藏  举报