工程结构
首先我们来搭建工程结构,主体分为三个微服务和一个网关,还包括公共组件及部署文件等。
如图:
-
deploy:部署文件目录,包括Dockerfile、k8s yaml文件等。
-
library-apigateway:结合 Consul 实现的网关。
-
library-book-grpc-service:提供 rpc 接口调用的书籍管理微服务,用于微服务内部之间的调用。
-
library-book-service:提供 restful 接口调用的书籍管理微服务。
-
library-user-service:提供 restful 接口调用的用户管理微服务。
-
pkg:公共组件目录,如读取配置、创建数据库链接、限流、熔断等。
-
protos:protobuf 文件及根据 protobuf 文件生成的 go 程序。
基础组件
在这一部分,我们先实现读取配置文件功能及创建数据库链接功能。
完整代码:
https://github.com/Justin02180218/micro-kit
读取配置文件
配置文件采用 yaml 格式,在 user.yaml 配置文件中,配置了用户管理微服务的启动端口、启动模式和服务名称。MySQL 数据库的链接信息。
server:
port: 10086
mode: debug
name: "user-service"
mysql:
host: "localhost"
port: 3306
db: "library"
username: "root"
password: "123456"
debug: true
在 config.go 中定义对应的 struct :
type ServerConfig struct {
Port int `json:"port" yaml:"port"`
Mode string `json:"mode" yaml:"mode"`
Name string `json:"name" yaml:"name"`
}
type MySQLConfig struct {
Host string `json:"host" yaml:"host"`
Username string `json:"username" yaml:"username"`
Password string `json:"password" yaml:"password"`
Port string `json:"port" yaml:"port"`
Db string `json:"db" yaml:"db"`
Debug bool `json:"debug" yaml:"debug"`
}
引入"github.com/ghodss/yaml" 包解析 user.yaml :
yamlData, err := ioutil.ReadFile(file)
if err != nil {
fmt.Println(err)
return err
}
if err = yaml.Unmarshal(yamlData, Conf); err != nil {
return err
}
我们在 user-service 的 main.go 中引入 config ,然后做个测试:
var confFile = flag.String("f", "user.yaml", "user config file")
func main() {
flag.Parse()
err := configs.Init(*confFile)
if err != nil {
panic(err)
}
fmt.Println(configs.Conf.ServerConfig.Name)
fmt.Println(configs.Conf.ServerConfig.Port)
fmt.Println(configs.Conf.ServerConfig.Mode)
}
执行结果:
创建数据库链接
我们选用MySQL数据库作为数据存储,对象关系映射选用 gorm 类库,使用文档请参考:https://gorm.io/docs/
在 mysql.go 中引入 _ "github.com/go-sql-driver/mysql" 和 "github.com/jinzhu/gorm",初始化代码如下:
import (
"com/justin/micro/kit/pkg/configs"
"fmt"
"log"
"time"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)
var DB *gorm.DB
func InitMySql(cfg *configs.MySQLConfig) (err error) {
connUrl := fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
cfg.Username, cfg.Password, cfg.Host, cfg.Port, cfg.Db)
DB, err = gorm.Open("mysql", connUrl)
if err != nil {
log.Println(err)
return
}
err = DB.DB().Ping()
if err != nil {
log.Println(err)
return
}
if cfg.Debug {
DB = DB.Debug()
}
DB.DB().SetConnMaxLifetime(time.Minute * 10)
DB.SingularTable(true)
return
}
在 user-service 的 main.go 中初始化数据库链接
err = databases.InitMySql(configs.Conf.MySQLConfig)
if err != nil {
fmt.Println("load mysql failed")
}
下一篇文章,我们开始编写用户管理微服务:library-user-service
完整代码:
https://github.com/Justin02180218/micro-kit/
更多【分布式专辑】【架构实战专辑】系列文章,请关注公众号