首页 > 其他分享 >(23)go-micro微服务客户端开发(使用负载均衡)

(23)go-micro微服务客户端开发(使用负载均衡)

时间:2023-01-28 10:57:53浏览次数:61  
标签:account err 23 micro2 micro go logger

目录

一 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: "[email protected]"}
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:     "[email protected]",
      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微服务项目客户端开发(使用负载均衡)使用工作就正式完成。

  • 接下来就开始项目经验总结了,这是本专栏的最后一篇文章,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。

欢迎大家加入 夏沫の梦的学习交流群 进行学习交流经验,点击 夏沫の梦学习交流

标签:account,err,23,micro2,micro,go,logger
From: https://www.cnblogs.com/qi66/p/17069807.html

相关文章

  • 2 System Calls Using Go
    Theoperatingsystemprovidesalotofwaysforapplicationstoextractinformationandperformoperations.Youwilllookatthedifferentwaystoextractsys......
  • 如何在 Go 语言开发的宿主程序中嵌入 WebAssembly
    ​​如何在Go语言开发的宿主程序中嵌入WebAssembly​​ 在WebAssembly的官方定义中,​​forastack-basedvirtualmachine​​​这句话也值得关注,因为它引领了......
  • WC2023 zc 讲课听课记录
    POFinal2022Day2三角形演讲比较简单!考察最大值所在的集合,一定可以是一段值域后缀,仔细想想就可以知道另外一个一定可以是一段值域前缀。这个枚举一下后缀长度,是比较......
  • Django3 使用xadmin
    xadmin下载地址:https://github.com/vip68/xadmin_bugfix下载完之后解压,只需要把里面的xadmin文件夹和requirements.txt文件复制到项目根目录下,然后在终端执行pipinstall......
  • PHP转Go实践:xjson解析神器「开源工具集」
    前言近期会更新一系列开源项目的文章,新的一年会和大家做更多的开源项目,也欢迎大家加入进来。xutil今天分享的文章源自于开源项目jinzaigo/xutil的封装。在封装过程中......
  • 二进制部署Kubernetes 1.23.15版本高可用集群实战
    目录前置知识:部署Kubernetes集群的方式一.K8S二进制部署准备环境1.所有节点安装常用的软件包2.免密钥登录集群并配置同步脚本3.Linux基础环境优化4.所有节点升级Linux内......
  • 2023冬 密码学趣题——2
    HITCTF2022revcalcimportstringp=2**607-1defs(a,b):return(a+b)%pdefu(a,b):return(a-b)%pdefm(a,b):returna*b%p......
  • PyCharm配置Django多个setting文件
    django项目设置多个setting文件时,pycharm会少了很多代码补全提示,对于我这种新手很不方便,经过一番折腾,总结了一些小经验1.PyCharm-->设置-->语言和框架-->Django-->启用Dj......
  • 2023.1.27 日寄
    2023.1.27日寄一言\(~~~~\)我希望你们可以尽己所能,想方设法给自己挣到足够的钱,好去旅游,去无所事事,去思索世界的未来或过去,去看书、做梦或是在街头闲逛,让思考的......
  • 2023/1/27 逆序对的数量
    逆序对定义对于数列的的第i个和第j个元素,如果满足i<j且a[i]>a[j],则其为一个逆序对。分析若将序列从中间划分,可以分为3类:某逆序对的两个元素都在左边某逆序......