天天看点

二,基础框架搭建

工程结构

首先我们来搭建工程结构,主体分为三个微服务和一个网关,还包括公共组件及部署文件等。

如图:

二,基础框架搭建
  • 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/

更多【分布式专辑】【架构实战专辑】系列文章,请关注公众号

二,基础框架搭建

继续阅读