(23)go-micro微服務客戶端開發(使用負載均衡)

qi66發表於2023-01-28

一 main.go開發

  • 至此,我們們的專案服務端程式碼,已經開發完畢,現在來看一下main.go檔案中的程式碼:
package main

import (
   micro2 "account/common/micro"
   "account/config/logger"
   "account/config/mysql"
   "account/config/redis"
   "account/domain/repository"
   "account/domain/service"
   "account/handler"
   "account/proto/account"
   "fmt"
   _ "github.com/jinzhu/gorm/dialects/mysql"
   "github.com/micro/go-micro/v2"
   "github.com/micro/go-micro/v2/registry"
   "github.com/micro/go-plugins/registry/consul/v2"
   "github.com/micro/go-plugins/wrapper/monitoring/prometheus/v2"
   ratelimit "github.com/micro/go-plugins/wrapper/ratelimiter/uber/v2"
   opentracing2 "github.com/micro/go-plugins/wrapper/trace/opentracing/v2"
   "github.com/opentracing/opentracing-go"
   "go.uber.org/zap"
)

func main() {
   // 1.配置中心
   consulConfig, err := micro2.GetConsulConfig("localhost", 8500, "/micro/config")
   if err != nil {
      fmt.Printf("Init consulConfig failed, err: %v\n", err)
   }
   // 2.註冊中心
   consulRegistry := consul.NewRegistry(func(options *registry.Options) {
      options.Addrs = []string{
         "127.0.0.1:8500",
      }
   })
   if err := micro2.GetAccountFromConsul(consulConfig, "account"); err != nil {
      fmt.Printf("Init consul failed, err: %v\n", err)
   }
   fmt.Println(micro2.ConsulInfo)
   // 3.zap日誌初始化
   if err := logger.Init(); err != nil {
      fmt.Printf("Init logger failed, err: %v\n", err)
      return
   }
   defer zap.L().Sync()
   // 4.jaeger 鏈路追蹤
   t, io, err := micro2.NewTracer(micro2.ConsulInfo.Jaeger.ServiceName, micro2.ConsulInfo.Jaeger.Addr)
   if err != nil {
      logger.Error(err)
      return
   }
   defer io.Close()
   opentracing.SetGlobalTracer(t)
   // 5.初始化資料庫
   db, err := mysql.MysqlInit(micro2.ConsulInfo.Mysql.User, micro2.ConsulInfo.Mysql.Pwd, micro2.ConsulInfo.Mysql.Database)
   if err != nil {
      logger.Error(err)
      return
   }
   defer db.Close()
   // 建立例項
   accountService := service.NewUserService(repository.NewUserRepository(db))
   // 6.初始化Redis連線
   if err := redis.Init(); err != nil {
      logger.Error(err)
      return
   }
   defer redis.Close()
   // 7.暴露監控地址
   micro2.PrometheusBoot(micro2.ConsulInfo.Prometheus.Host, int(micro2.ConsulInfo.Prometheus.Port))
   // 8.註冊服務
   registryService := micro.NewService(
      micro.Name(micro2.ConsulInfo.Micro.Name),
      micro.Version(micro2.ConsulInfo.Micro.Version),
      //暴露的服務地址
      micro.Address(micro2.ConsulInfo.Micro.Address),
      //新增consul 註冊中心
      micro.Registry(consulRegistry),
      //新增鏈路追蹤
      micro.WrapHandler(opentracing2.NewHandlerWrapper(opentracing.GlobalTracer())),
      //新增限流
      micro.WrapHandler(ratelimit.NewHandlerWrapper(int(micro2.ConsulInfo.Ratelimit.QPS))),
      //新增監控
      micro.WrapHandler(prometheus.NewHandlerWrapper()),
   )
   // 9.初始化服務
   registryService.Init()
   // 10.註冊Handle
   account.RegisterAccountHandler(registryService.Server(), &handler.Account{AccountService: accountService})
   // 11.啟動服務
   if err := registryService.Run(); err != nil {
      logger.Fatal(err)
   }
}

二 客戶端程式碼開發:

  • 在client目錄下新建一個account.go檔案,寫入以下程式碼,完成客戶端的建立:
package main

import (
   micro2 "account/common/micro"
   "account/config/logger"
   "account/proto/account"
   "context"
   "fmt"
   "github.com/micro/go-micro/v2"
   "github.com/micro/go-micro/v2/registry"
   "github.com/micro/go-plugins/registry/consul/v2"
   "github.com/micro/go-plugins/wrapper/select/roundrobin/v2"
   opentracing2 "github.com/micro/go-plugins/wrapper/trace/opentracing/v2"
   "github.com/opentracing/opentracing-go"
   "go.uber.org/zap"
)

func main() {
   // 1.配置中心
   consulConfig, err := micro2.GetConsulConfig("localhost", 8500, "/micro/config")
   if err != nil {
      fmt.Printf("Init consulConfig failed, err: %v\n", err)
   }
   // 2.註冊中心
   newConsul := consul.NewRegistry(func(options *registry.Options) {
      options.Addrs = []string{
         "127.0.0.1:8500",
      }
   })
   if err := micro2.GetAccountFromConsul(consulConfig, "account"); err != nil {
      fmt.Printf("Init consul failed, err: %v\n", err)
   }
   fmt.Println(micro2.ConsulInfo)
   // 3.zap日誌初始化
   if err := logger.Init(); err != nil {
      fmt.Printf("Init logger failed, err: %v\n", err)
      return
   }
   defer zap.L().Sync()
   logger.Debug("logger init success...")

   // 4.鏈路追蹤
   t, io, err := micro2.NewTracer("go.micro.service.account", "localhost:6831")
   if err != nil {
      logger.Fatal(err)
   }
   defer io.Close()
   opentracing.SetGlobalTracer(t)
   // 5.監控
   micro2.PrometheusBoot("127.0.0.1", 9292)
   // 6.設定服務
   service := micro.NewService(
      micro.Name("go.micro.service.account.client"),
      micro.Version("latest"),
      //暴露的服務地址
      micro.Address("127.0.0.1:9580"),
      //新增註冊中心
      micro.Registry(newConsul),
      //繫結鏈路追蹤
      micro.WrapClient(opentracing2.NewClientWrapper(opentracing.GlobalTracer())),
      //新增監控
      micro.WrapHandler(opentracing2.NewHandlerWrapper(opentracing.GlobalTracer())),
      //作為服務端訪問時生效
      micro.WrapClient(opentracing2.NewClientWrapper(opentracing.GlobalTracer())),
      //負載均衡
      micro.WrapClient(roundrobin.NewClientWrapper()),
   )
   // 7.建立服務
   accountService := account.NewAccountService("go.micro.service.account", service.Client())

三 客戶端測試功能

1.傳送註冊郵件

// 8.傳送註冊郵件
registerMail := &account.SendMailRequest{Email: "xxx@qq.com"}
registerMailResponse, err := accountService.SendRegisterMail(context.TODO(), registerMail)
if err != nil {
   logger.Error(err)
}
fmt.Println(registerMailResponse)

2.實現註冊功能

// 9.實現註冊功能
accountAdd := &account.RegisterRequest{
   RegisterRequest: &account.UserInfoResponse{
      Username:  "夏沫の夢",
      FirstName: "qi66",
      Password:  "123456",
      Email:     "xxx@qq.com",
      LastName:  "admin",
   },
   Code: registerMailResponse.Code,
}
registerResponse, err := accountService.Register(context.TODO(), accountAdd)
if err != nil {
   logger.Error(err)
}
fmt.Println(registerResponse)

3.查詢使用者功能

// 10.查詢使用者功能
getUser := &account.UserIdRequest{UserId: registerResponse.UserId}
userInfoResponse, err := accountService.GetUserInfo(context.TODO(), getUser)
if err != nil {
   logger.Error(err)
}
fmt.Println(userInfoResponse)

四 執行專案

  • 執行專案之前,要把相關服務啟動起來,如consul、jaeger、prometheus、grafana、ELK等等

  • 把郵箱改成你自己的哦

  • consul啟動之後,記得把配置資料建立一下

  • 第一次啟動,記得把mysql資料表初始化一下,之後要把初始化語句去掉,否則會報錯

  • 執行main.go檔案

go run main.go
  • 執行account.go檔案
go run client/account.go
  • 如果客戶端控制檯成功列印出來我們們剛註冊的使用者資訊的話,說明專案已經完成
  • 如果出現問題的話,可以自行擺渡解決,無法解決的話,可以私信博主或者加博主的學習交流詢問

五 最後

  • 至此,go-micro微服務專案客戶端開發(使用負載均衡)使用工作就正式完成。

  • 接下來就開始專案經驗總結了,這是本專欄的最後一篇文章,希望大家關注博主和關注專欄,第一時間獲取最新內容,每篇部落格都乾貨滿滿。

歡迎大家加入 夏沫の夢的學習交流群 進行學習交流經驗,點選 夏沫の夢學習交流

相關文章