Go微服务框架go-kratos实战学习08:负载均衡基本使用
微服务框架 go-kratos 中负载均衡使用
一、介绍
在前面这篇文章 负载均衡和它的算法介绍,讲了什么是负载均衡以及作用、算法介绍。
go-kratos 的负载均衡主要接口是 Selector,它是一个可插拔的设计。因为它设计的都是接口,只要实现了接口就实现了负载均衡。
go-kratos 在目录下提供了一个默认的 Selector 实现,default_node.go 和 default_selector.go 。
你可以自定义程序来替换这个默认实现。可以通过替换 NodeBuilder 实现节点权重计算算法,Filter 实现服务路由过滤策,Balancer 来实现负载均衡算法。
go-kratos 负载均衡结构主要组成:

在 go-kratos 中已支持 3 种负载均衡算法,分别是:
- wrr : Weighted round robin (Kratos Client内置默认算法),权重轮询算法
- p2c : Power of two choices
- random : Random,随机算法
二、基本使用
go-kratos 负载均衡有2个使用,一个是 http ,一个是 gRPC。
在 go-kratos 文档中展示了主要代码。
go-kratos v2.6.1
go v1.20.2
示例代码在 go-kratos 的 examples 中的 Selector。
从上面例子中摘出 grpc 负载均衡例子,代码如下:
client/grpc.go
package main
import (
"context"
"log"
"time"
"github.com/go-kratos/kratos/contrib/registry/consul/v2"
"github.com/go-kratos/v2/selector/filter"
"github.com/go-kratos/v2/selector/wrr"
"github.com/go-kratos/v2/transport/grpc"
"github.com/hashicorp/consul/api"
"gitub.com/go-kratos/examples/helloworld/helloworld"
)
func main() {
consulCli, err := api.NewClient(api.DefaultConfig())
if err != nil {
panic(err)
}
r := consul.New(consulCli)
// grpc client
conn, err := grpc.DialInsecure(
context.Background(),
grpc.WithEndpoint("discovery:///helloworld"),
grpc.WithDiscovery(r), // consul作为服务发现中心
// 负载均衡 和 filter,weighted round robin算法
grpc.WithBalancerName(wrr.Name),
grpc.WithFilter(
filter.Version("1.0.0"), //静态version=1.0.0的Filter
),
)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
gClient := helloworld.NewGreeterClient(conn)
for {
time.Sleep(time.Second)
CallGRPC(gClient)
}
}
func CallGRPC(client helloworld.NewGreeterClient) {
reply, err := client.SayHello(context.Background(), &helloworld.HelloRequest{Name: "go-kratos"})
if err != nil {
log.Fatal(err)
}
log.Printf("[grpc] SayHello %+v \n", reply)
}
服务端,server/grpc.go
package main
import (
"context"
"fmt"
"os"
"github.com/go-kratos/examples/helloworld/helloworld"
"github.com/go-kratos/kratos/contrib/registry/consul/v2"
"github.com/go-kratos/kratos/v2"
"github.com/go-kratos/kratos/v2/log"
"github.com/go-kratos/kratos/v2/middleware/logging"
"github.com/go-kratos/kratos/v2/middleware/recovery"
"github.com/go-kratos/kratos/v2/transport/grpc"
"github.com/hashicorp/consul/api"
)
type server struct {
helloworld.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context, in *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
return &helloworld.HelloReply{Message: fmt.Sprintf("welcome %+v!", in.Name)}, nil
}
func main() {
logger := log.NewStdLogger(os.Stdout)
consulClient, err := api.NewClient(api.DefaultConfig())
if err != nil {
log.NewHelper(logger).Fatal(err)
}
go runServer("1.0.0", logger, consulClient, 8000)
go runServer("1.0.0", logger, consulClient, 8010)
runServer("2.0.0", logger, consulClient, 8020)
}
func runServer(version string, logger log.Logger, client *api.Client, port int) {
logger = log.With(logger, "version", version, "port:", port)
log := log.NewHelper(logger)
grpcSrv := grpc.NewServer(
grpc.Address(fmt.Sprintf(":%d", port+1000)),
grpc.Middleware(
recovery.Recovery(),
logging.Server(logger),
),
)
s := &server{}
helloworld.RegisterGreeterServer(grpcSrv, s)
r := consul.New(client)
app := kratos.New(
kratos.Name("helloworld"),
kratos.Server(
grpcSrv,
),
kratos.Version(version),
kratos.Registrar(r),
)
if err := app.Run(); err != nil {
log.Fatal(err)
}
}
也可以到我的公众号 九卷技术录:Go微服务框架go-kratos实战学习08:负载均衡基本使用 讨论
三、参考
- https://github.com/go-kratos/kratos/blob/v2.6.1/selector/default_selector.go go-kratos v2.6.1 selector 默认实现
- https://go-kratos.dev/docs/component/selector/ go-kratos 路由与负载均衡
- https://github.com/go-kratos
Go微服务框架go-kratos实战学习08:负载均衡基本使用的更多相关文章
- 微服务框架SpringCloud(Dalston版)学习 (一):Eureka服务注册与发现
eureka-server eureka服务端,提供服务的注册与发现,类似于zookeeper 新建spring-boot工程,pom依赖: <dependency> <groupI ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- kratos微服务框架学习笔记一(kratos-demo)
目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...
- go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])
目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...
- # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)
目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...
- go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)
目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...
- go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)
目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...
- go微服务框架kratos学习笔记八 (kratos的依赖注入)
目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...
- go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)
目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...
- go微服务框架kratos学习笔记十(熔断器)
目录 go微服务框架kratos学习笔记十(熔断器) 什么是熔断 熔断器逻辑 kratos Breaker kratos 熔断逻辑 kratos熔断器使用说明 bladmaster client br ...
随机推荐
- [转帖]TLB缓存是个神马鬼,如何查看TLB miss?
https://zhuanlan.zhihu.com/p/79607142 介绍TLB之前,我们先来回顾一个操作系统里的基本概念,虚拟内存. 虚拟内存 在用户的视角里,每个进程都有自己独立的地址空间, ...
- [转帖]TiDB-merge region相关问题
一.开启region merge # 控制 Region Merge 的 size 上限,当 Region Size 大于指定值时 PD 不会将其与相邻的 Region 合并 pd-ctl confi ...
- [转帖]kingbase(人大金仓)的一些常用表操作语句
包括 1)创建表 2)删除表 3)加字段 4)字段换名 5)字段改类型 6)字段添加注释 7)修改字段为自增类型 8)增加主键 9)查看模式下的表 一.创建和删除表 DROP TABLE IF EXI ...
- 申威3231_SPECJVM2008的测试结果与信创服务器对比验证
申威3231_SPECJVM2008的测试结果与信创服务器对比验证 背景 周六找同事将在公司里的机器进行了开机. 然后验证了config.guess和config.sub 的确是可以通过复制/usr ...
- [转帖]使用 sed 处理文本文件
https://www.cnblogs.com/wx2020/p/16269905.html 前言 sed 是一款 GNU 流编辑器,可以按照指定的规则去处理文本文件或流,其强大的功能使用户在命令中快 ...
- [转帖]iptables命令详解和举例(完整版)
1.防火墙概述 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底 ...
- [转帖]dd命令中dsync和fsync区别
在Linux系统中经常会使用dd命令来测试硬盘的写入速度,命令会涉及几个常用参数:sync.dsync.fsync与fdatasync # dd if=/dev/zero of=/tmp/1G bs= ...
- 【转贴】libcrypto.so.10丢失导致sshd无法运行解决方案
http://www.cnblogs.com/billy98/p/4226023.html libcrypto.so.10丢失导致sshd无法运行解决方案 服务器由于掉电开启系统后无法远程ssh,重启 ...
- 京东小程序CI工具实践
作者:京东物流 张俊峰 本文从整体介绍了京东小程序CI工具的用途及工作流程,读者可以通过本文了解到一种全新的京东小程序上传方式,同时结合构建脚本和流水线,可大大提高小程序的部署和发布效率. 01 前言 ...
- Mac 版的 Quicker CirMenu
之前在Windows上用过一款圆盘菜单工具Quicker, 感觉非常方便, 换成Macos后,一直没有找到类似应用. 最近终于发现,一款好用的快捷键收集,触发工具CirMenu. 其核心功能是可以根据 ...