赞
踩
首先我们来搭建工程结构,主体分为三个微服务和一个网关,还包括公共组件及部署文件等。
如图:
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/
更多【分布式专辑】【架构实战专辑】系列文章,请关注公众号
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。