订单微服务( orders_srv)

该博客围绕Go语言进行订单微服务(orders_srv)开发。内容包括项目初始化,如建立目录、添加配置文件等;定义表结构和模型;进行proto文件开发;还涉及接口开发,如购物车列表、创建与更新、订单列表与详情、创建与更新订单状态等操作。

七.订单微服务( orders_srv)

1.项目初始化
1.1.建立初始化目录

在这里插入图片描述

1.2添加配置文件
host: '192.168.0.4'
port: 8848
namespace: 'ba14206d-403f-4377-b7e7-70a3e8fa2bbf'
user: 'nacos'
password: 'nacos'
dataid: 'orders-srv.json'
group: 'dev'
1.3建立全局变量
package global

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"log"
	"mxshop_srvs/orders_srv/config"
	"mxshop_srvs/orders_srv/proto"
	"os"
	"time"
)

var (
	DB           *gorm.DB
	ServerConfig config.ServerConfig
	NacosConfig  config.NacosConfig

	GoodsSrvClient     proto.GoodsClient
	InventorySrvClient proto.InventoryClient
)
1.4在nacos上建立配置文件

order-srv.json,这个要在配置中心建立

{
   
   
  "name": "goods-srv",
  "tags":["imooc", "bobby", "goods", "srv"],
  "mysql": {
   
   
    "host": "127.0.0.1",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "db": "mxshop_orders_srv"
  },
  "consul": {
   
   
    "host": "127.0.0.1",
    "port": 8500
  },
  "goods_srv":{
   
   
    "name":"goods-srv"
  },
  "inventory_srv":{
   
   
    "name":"inventory-srv"
  }
}

建立后的效果如下

在这里插入图片描述

1.5配置文件初始化

orders-srv/initialize/config.go

package initialize

import (
   "encoding/json"
   "fmt"
   "github.com/nacos-group/nacos-sdk-go/clients"
   "github.com/nacos-group/nacos-sdk-go/common/constant"
   "github.com/nacos-group/nacos-sdk-go/vo"
   "github.com/spf13/viper"
   "go.uber.org/zap"
   "mxshop_srvs/goods_srv/global"
)

func GetEnvInfo(env string) bool {
   
   
   viper.AutomaticEnv()
   return viper.GetBool(env)
   //刚才设置的环境变量 想要生效 我们必须得重启goland
}

func InitConfig() {
   
   
   //从配置文件中读取出对应的配置
   debug := GetEnvInfo("MXSHOP_DEBUG")
   configFilePrefix := "config"
   configFileName := fmt.Sprintf("goods_srv/%s-pro.yaml", configFilePrefix)
   if debug {
   
   
      configFileName = fmt.Sprintf("goods_srv/%s-debug.yaml", configFilePrefix)
   }

   v := viper.New()
   //文件的路径如何设置
   v.SetConfigFile(configFileName)
   if err := v.ReadInConfig(); err != nil {
   
   
      panic(err)
   }
   //这个对象如何在其他文件中使用 - 全局变量
   if err := v.Unmarshal(&global.NacosConfig); err != nil {
   
   
      panic(err)
   }
   zap.S().Infof("配置信息: %v", global.NacosConfig)

   //从nacos中读取配置信息
   sc := []constant.ServerConfig{
   
   
      {
   
   
         IpAddr: global.NacosConfig.Host,
         Port:   global.NacosConfig.Port,
      },
   }

   cc := constant.ClientConfig{
   
   
      NamespaceId:         global.NacosConfig.Namespace, // 如果需要支持多namespace,我们可以场景多个client,它们有不同的NamespaceId
      TimeoutMs:           5000,
      NotLoadCacheAtStart: true,
      LogDir:              "tmp/nacos/log",
      CacheDir:            "tmp/nacos/cache",
      LogLevel:            "debug",
   }

   configClient, err := clients.CreateConfigClient(map[string]interface{
   
   }{
   
   
      "serverConfigs": sc,
      "clientConfig":  cc,
   })
   if err != nil {
   
   
      panic(err)
   }

   content, err := configClient.GetConfig(vo.ConfigParam{
   
   
      DataId: global.NacosConfig.DataId,
      Group:  global.NacosConfig.Group})

   if err != nil {
   
   
      panic(err)
   }
   //fmt.Println(content) //字符串 - yaml
   //想要将一个json字符串转换成struct,需要去设置这个struct的tag
   err = json.Unmarshal([]byte(content), &global.ServerConfig)
   if err != nil {
   
   
      zap.S().Fatalf("读取nacos配置失败: %s", err.Error())
   }
   fmt.Println(&global.ServerConfig)
}

db.go

package initialize

import (
   "fmt"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
   "gorm.io/gorm/logger"
   "gorm.io/gorm/schema"
   "log"
   "mxshop_srvs/goods_srv/global"
   "os"
   "time"
)

func InitDB() {
   
   
   c := global.ServerConfig.MysqlInfo
   dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
      c.User, c.Password, c.Host, c.Port, c.Name)
   newLogger := logger.New(
      log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
      logger.Config{
   
   
         SlowThreshold: time.Second, // 慢 SQL 阈值
         LogLevel:      logger.Info, // Log level
         Colorful:      true,        // 禁用彩色打印
      },
   )

   // 全局模式
   var err error
   global.DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
   
   
      NamingStrategy: schema.NamingStrategy{
   
   
         SingularTable: true,
      },
      Logger: newLogger,
   })
   if err != nil {
   
   
      panic(err)
   }
}

logger.go

package initialize

import "go.uber.org/zap"

func InitLogger() {
   
   
   logger, _ := zap.NewDevelopment()
   zap.ReplaceGlobals(logger)
}

srv_conn.go

package initialize

import (
   "fmt"
   "go.uber.org/zap"
   "google.golang.org/grpc"
   "mxshop_srvs/orders_srv/global"
   "mxshop_srvs/orders_srv/proto"
)

func InitSrvConn() {
   
   
   consulInfo := global.ServerConfig.ConsulInfo
   goodsConn, err := grpc.Dial(
      fmt.Sprintf("consul://%s:%d/%s?wait=14s", consulInfo.Host, consulInfo.Port, global.ServerConfig.GoodsSrvInfo.Name),
      grpc.WithInsecure(),
      grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy": "round_robin"}`),
      //grpc.WithUnaryInterceptor(otgrpc.OpenTracingClientInterceptor(opentracing.GlobalTracer())),
   )
   if err != nil {
   
   
      zap.S().Fatal("[InitSrvConn] 连接 【商品服务失败】")
   }

   global.GoodsSrvClient = proto.NewGoodsClient(goodsConn)

   //初始化库存服务连接
   invConn, err := grpc.Dial(
      fmt.Sprintf("consul://%s:%d/%s?wait=14s", consulInfo.Host, consulInfo.Port, global.ServerConfig.InventorySrvInfo.Name),
      grpc.WithInsecure(),
      grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy": "round_robin"}`),
      //grpc.WithUnaryInterceptor(otgrpc.OpenTracingClientInterceptor(opentracing.GlobalTracer())),
   )
   if err != nil {
   
   
      zap.S().Fatal("[InitSrvConn] 连接 【库存服务失败】")
   }

   global.InventorySrvClient = proto.NewInventoryClient(invConn)
}
1.6配置文件映射
package config

type GoodsSrvConfig struct {
   
   
   Name string `mapstructure:"name" json:"name"`
}

type MysqlConfig struct {
   
   
   Host     string `mapstructure:"host" json:"host"`
   Port     int    `mapstructure:"port" json:"port"`
   Name     string `mapstructure:"db" json:"db"`
   User     string `mapstructure:"user" json:"user"`
   Password string `mapstructure:"password" json:"password"`
}

type ConsulConfig struct {
   
   
   Host string `mapstructure:"host" json:"host"`
   Port int    `mapstructure:"port" json:"port"`
}

type ServerConfig struct {
   
   
   Name       string       `mapstructure:"name" json:"name"`
   Tags       []string     `mapstructure:"tags" json:"tags"`
   MysqlInfo  MysqlConfig  `mapstructure:"mysql" json:"mysql"`
   ConsulInfo ConsulConfig `mapstructure:"consul" json:"consul"`

   //商品微服务的配置
   GoodsSrvInfo GoodsSrvConfig `mapstructure:"goods_srv" json:"goods_srv"`

   //库存微服务的配置
   InventorySrvInfo GoodsSrvConfig `mapstructure:"inventory_srv" json:"inventory_srv"`
}

type NacosConfig struct {
   
   
   Host      string `mapstructure:"host"`
   Port      uint64 `mapstructure:"port"`
   Namespace string `mapstructure:"namespace"`
   User      string `mapstructure:"user"`
   Password  string `mapstructure:"password"`
   DataId    string `mapstructure:"dataid"`
   Group     string `mapstructure:"group"`
}
1.7main.go文件
package main

import (
	"flag"
	"fmt"
	"github.com/hashicorp/consul/api"
	"go.uber.org/zap"
	"google.golang.org/grpc"
	"mxshop_srvs/orders_srv/global"
	"mxshop_srvs/orders_srv/handler"
	"os"
	"os/signal"
	"syscall"

	"github.com/satori/go.uuid"
	"google.golang.org/grpc/health"
	"google.golang.org/grpc/health/grpc_health_v1"
	"mxshop_srvs/orders_srv/initialize"
	"mxshop_srvs/orders_srv/proto"
	"net"
)

func main() {
   
   
	IP := flag
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值