Go Micro 负载均衡

微服务在大多数场景下会部署为集群服务,为了使集群节点的访问能够均匀分布,就要求客户端使用负载均衡策略,能够均匀得访问每一台节点。

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: "codebaoku",
		})
		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 ...