当前位置:   article > 正文

二,基础框架搭建

框架搭建

工程结构

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

如图:

图片

  • 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 数据库的链接信息。

  1. server:
  2. port: 10086
  3. mode: debug
  4. name: "user-service"
  5. mysql:
  6. host: "localhost"
  7. port: 3306
  8. db: "library"
  9. username: "root"
  10. password: "123456"
  11. debug: true

在 config.go 中定义对应的 struct :

  1. type ServerConfig struct {
  2. Port int `json:"port" yaml:"port"`
  3. Mode string `json:"mode" yaml:"mode"`
  4. Name string `json:"name" yaml:"name"`
  5. }
  6. type MySQLConfig struct {
  7. Host string `json:"host" yaml:"host"`
  8. Username string `json:"username" yaml:"username"`
  9. Password string `json:"password" yaml:"password"`
  10. Port string `json:"port" yaml:"port"`
  11. Db string `json:"db" yaml:"db"`
  12. Debug bool `json:"debug" yaml:"debug"`
  13. }

引入"github.com/ghodss/yaml" 包解析 user.yaml :

  1. yamlData, err := ioutil.ReadFile(file)
  2. if err != nil {
  3. fmt.Println(err)
  4. return err
  5. }
  6. if err = yaml.Unmarshal(yamlData, Conf); err != nil {
  7. return err
  8. }

我们在 user-service 的 main.go 中引入 config ,然后做个测试:

  1. var confFile = flag.String("f", "user.yaml", "user config file")
  2. func main() {
  3. flag.Parse()
  4. err := configs.Init(*confFile)
  5. if err != nil {
  6. panic(err)
  7. }
  8. fmt.Println(configs.Conf.ServerConfig.Name)
  9. fmt.Println(configs.Conf.ServerConfig.Port)
  10. fmt.Println(configs.Conf.ServerConfig.Mode)
  11. }

执行结果:

图片

创建数据库链接

我们选用MySQL数据库作为数据存储,对象关系映射选用 gorm 类库,使用文档请参考:https://gorm.io/docs/

在 mysql.go 中引入  _ "github.com/go-sql-driver/mysql" 和 "github.com/jinzhu/gorm",初始化代码如下:

  1. import (
  2. "com/justin/micro/kit/pkg/configs"
  3. "fmt"
  4. "log"
  5. "time"
  6. _ "github.com/go-sql-driver/mysql"
  7. "github.com/jinzhu/gorm"
  8. )
  9. var DB *gorm.DB
  10. func InitMySql(cfg *configs.MySQLConfig) (err error) {
  11. connUrl := fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
  12. cfg.Username, cfg.Password, cfg.Host, cfg.Port, cfg.Db)
  13. DB, err = gorm.Open("mysql", connUrl)
  14. if err != nil {
  15. log.Println(err)
  16. return
  17. }
  18. err = DB.DB().Ping()
  19. if err != nil {
  20. log.Println(err)
  21. return
  22. }
  23. if cfg.Debug {
  24. DB = DB.Debug()
  25. }
  26. DB.DB().SetConnMaxLifetime(time.Minute * 10)
  27. DB.SingularTable(true)
  28. return
  29. }

在 user-service 的 main.go 中初始化数据库链接

  1. err = databases.InitMySql(configs.Conf.MySQLConfig)
  2. if err != nil {
  3. fmt.Println("load mysql failed")
  4. }

下一篇文章,我们开始编写用户管理微服务:library-user-service

完整代码:

https://github.com/Justin02180218/micro-kit/


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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号