Copyright © 2022-2025 aizws.net · 网站版本: v1.2.6·内部版本: v1.25.2·
页面加载耗时 0.00 毫秒·物理内存 135.0MB ·虚拟内存 1372.6MB
欢迎来到 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 ...