Copyright © 2022-2024 aizws.net · 网站版本: v1.2.6·内部版本: v1.23.3·
页面加载耗时 0.00 毫秒·物理内存 57.3MB ·虚拟内存 1300.0MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
微服务在大多数场景下会部署为集群服务,为了使集群节点的访问能够均匀分布,就要求客户端使用负载均衡策略,能够均匀得访问每一台节点。
Go Micro 提供了负载均衡插件 selector,为客户端提供了随机 Random 和轮询 RoundRobin 等均衡策略,系统默认为随机策略。
使用 Go Micro 客户端的负载均衡策略调用 hello 服务,以下为客户端程序 main.go:
package main import ( "context" "github.com/micro/go-micro/util/log" "github.com/micro/go-micro/client/selector" "github.com/micro/go-micro" hello "hello/proto/hello" ) func main() { // Create a new service // 创建一个新的服务,服务名为 go.micro.srv.hello service := micro.NewService() // Create a RoundRobin selector // 创建轮询 RoundRobin 负载均衡策略 rrSelector := selector.NewSelector( selector.SetStrategy(selector.RoundRobin), ) // Parse command line flags // 通过 selector 插件初始化服务 service.Init(micro.Selector(rrSelector)) // 模拟 10 次调用,调用请求会被均衡得分配到不同的集群节点 for i:=0; i<10; i++ { // Use the generated client stub // 通过客户端的桩创建 go.micro.srv.hello 服务客户端 helloService := hello.NewHelloService("go.micro.srv.hello",service.Client()) // Make request // 调用 RPC Call 方法 response, err := helloService.Call(context.Background(), &hello.Request{ Name: "aizws", }) if err != nil { log.Error(err) return } // Print result // 打印 RPC Call 调用结果 log.Info(response.Msg) } }
我们可以在不同的终端启动多个 go.micro.srv.hello,观测客户端调用的访问情况,最终调用请求会被均衡得分配到不同的集群节点。
我们可以查看负载均衡算法选中的节点情况,以 mdns 上注册的 go.micro.api.user 服务为例:
package main import ( "fmt" "github.com/micro/go-micro/client/selector" "github.com/micro/go-micro/registry/mdns" ) func main() { // 创建注册中心 regCenter := mdns.NewRegistry() // 获取所有可用服务 services, err := regCenter.GetService("go.micro.api.user") // 使用轮询 RoundRobin 均衡算法,获取本次节点服务地址 next := selector.RoundRobin(services) svc, err := next() if err != nil { fmt.Println(err) return } // 打印选中节点的服务地址 fmt.Println(svc.Address) }
Go Micro 是一个插件化的 RPC 开发框架,用于使用 Go 语言快速构建微服务。我们可以使用 Go Micro 的 micro 工具创建 Web 服务。例如,创建 hello Web 服务:micro ...