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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: (23)go-micro微服务客户端开发(使用负载均衡)

一 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

如果客户端控制台成功打印出来咱们刚注册的用户信息的话,说明项目已经完成

如果出现问题的话,可以自行摆渡解决,无法解决的话,可以私信博主或者加博主的学习交流询问


五 最后

至此,go-micro微服务项目客户端开发(使用负载均衡)使用工作就正式完成。


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


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
27天前
|
消息中间件 API 持续交付
后端开发中的微服务架构实践####
【10月更文挑战第21天】 本文深入探讨了微服务架构在后端开发中的应用,从基本概念出发,详细阐述了微服务的核心优势、设计原则及关键技术。通过实际案例分析,揭示了微服务如何助力企业应对复杂业务需求,提升系统的可扩展性、灵活性与可靠性。同时,也指出了实施微服务过程中可能面临的挑战,并提供了相应的解决方案和最佳实践。 ####
28 3
|
19天前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
21天前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
17天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
31 1
|
19天前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
38 1
|
20天前
|
负载均衡 监控 API
后端开发中的微服务架构实践与挑战
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势和面临的挑战,并通过案例分析提出了相应的解决策略。微服务架构以其高度的可扩展性和灵活性,成为现代软件开发的重要趋势。然而,它同时也带来了服务间通信、数据一致性等问题。通过实际案例的剖析,本文旨在为开发者提供有效的微服务实施指导,以优化系统性能和用户体验。
|
25天前
|
消息中间件 运维 开发者
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在后端开发中的应用,从其核心概念、设计原则到实际部署过程中面临的挑战进行了全面剖析。不同于传统的单体应用,微服务通过将复杂系统拆解为一系列小型、独立的服务,提高了系统的灵活性和可维护性。然而,这种架构的转变也伴随着服务间通信、数据一致性、部署复杂性等新问题。本文旨在为开发者提供一套应对这些挑战的策略,同时分享一些成功案例,以期促进微服务架构的有效实施。 ####
|
27天前
|
缓存 负载均衡 API
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的可扩展性、灵活性及易于维护的特点,成为众多企业后端开发的首选架构模式。本文将深入探讨微服务架构的核心理念,通过具体案例分析其在实际应用中的实践策略与面临的挑战,为读者提供一份详尽的微服务架构实施指南。 ####
|
23天前
|
消息中间件 监控 API
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,分析了其优势、实施过程中的关键考虑因素及面临的挑战。不同于传统的单体应用,微服务通过拆分功能模块为独立服务,提升了系统的灵活性和可维护性。我们将从微服务的基本概念入手,逐步剖析其在真实场景下的应用案例,并讨论如何有效应对服务间通信、数据一致性等复杂问题,旨在为开发者提供一套实用的微服务落地指南。 ####
19 0
|
24天前
|
安全 测试技术 持续交付
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过一个虚构项目案例,详细阐述了从单体架构向微服务架构转型的过程、面临的挑战及解决方案。不同于常规摘要的概述性质,本文摘要旨在直接引入核心议题——如何有效实施微服务以提升系统的可扩展性、灵活性和容错能力,同时揭示转型过程中常见的技术陷阱与最佳实践策略,为读者提供实战指南。 ####
19 0