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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: (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)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
22天前
|
缓存 Java 开发者
开发故事:一个 @Async 如何搞瘫整个微服务系统
大家好,我是小米,一个热爱分享技术的29岁开发者。本文讲述了一个困扰我们团队的开发环境问题,最终发现罪魁祸首竟是 `@Async` 注解。我们通过详细分析错误日志和 Spring 的 Bean 代理机制,逐步排查并解决了这一难题。文章介绍了三种解决方案:调整依赖结构、使用 `@Lazy` 延迟加载以及禁用 `@Async` 的代理功能。希望对你有所帮助!欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
19 5
开发故事:一个 @Async 如何搞瘫整个微服务系统
|
7天前
|
设计模式 负载均衡 监控
深入理解后端开发中的微服务架构
在现代软件开发领域,微服务架构已经成为一种流行的设计模式。本文将探讨微服务的基本概念、优势与挑战,并通过实例展示如何在实际项目中应用微服务架构。无论是初学者还是经验丰富的开发者,都能从中获得启发和实用技巧。
22 7
|
9天前
|
存储 运维 负载均衡
后端开发中的微服务架构实践与思考
本文旨在探讨后端开发中微服务架构的应用及其带来的优势与挑战。通过分析实际案例,揭示如何有效地实施微服务架构以提高系统的可维护性和扩展性。同时,文章也讨论了在采用微服务过程中需要注意的问题和解决方案。
|
24天前
|
消息中间件 存储 缓存
后端开发之深入浅出微服务架构
在数字化时代的浪潮中,后端开发如同一座桥梁,连接着用户与数据的世界。本文将带你探索微服务架构的奥秘,从基础概念到实战应用,一步步揭开它神秘的面纱。我们将一起思考,如何在这个快速变化的时代,找到属于自己的节奏和方向。
40 2
|
6天前
|
负载均衡 Java 开发者
Ribbon框架实现客户端负载均衡的方法与技巧
Ribbon框架为微服务架构中的客户端负载均衡提供了强大的支持。通过简单的配置和集成,开发者可以轻松地在应用中实现服务的发现、选择和负载均衡。适当地使用Ribbon,配合其他Spring Cloud组件,可以有效提升微服务架构的可用性和性能。
7 0
|
25天前
|
设计模式 Kubernetes 开发者
探索后端开发中的微服务架构
本文旨在通过浅显易懂的方式,向读者介绍微服务架构的概念、优势以及在后端开发中的应用。我们将从微服务的基本定义出发,逐步深入到如何设计、部署和维护一个高效的微服务系统。文章还将分享一些实际案例,帮助初学者和有经验的开发者更好地理解和掌握微服务架构。
|
机器学习/深度学习 缓存 Cloud Native
Dubbo-go 源码笔记(二)客户端调用过程
有了上一篇文章《Dubbo-go 源码笔记(一)Server 端开启服务过程》的铺垫,可以类比客户端启动于服务端的启动过程。其中最大的区别是服务端通过 zk 注册服务,发布自己的ivkURL并订阅事件开启监听;而客户应该是通过zk注册组件,拿到需要调用的serviceURL,更新invoker并重写用户的RPCService,从而实现对远程过程调用细节的封装。
24928 0
Dubbo-go 源码笔记(二)客户端调用过程
|
7天前
|
Go
Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
16 1
|
6天前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
7天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
下一篇
无影云桌面