微服务框架 go-kratos 中负载均衡使用

一、介绍

在前面这篇文章 负载均衡和它的算法介绍,讲了什么是负载均衡以及作用、算法介绍。

go-kratos 的负载均衡主要接口是 Selector,它是一个可插拔的设计。因为它设计的都是接口,只要实现了接口就实现了负载均衡。

go-kratos 在目录下提供了一个默认的 Selector 实现,default_node.godefault_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-kratosexamples 中的 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:负载均衡基本使用 讨论

三、参考

Go微服务框架go-kratos实战学习08:负载均衡基本使用的更多相关文章

  1. 微服务框架SpringCloud(Dalston版)学习 (一):Eureka服务注册与发现

    eureka-server eureka服务端,提供服务的注册与发现,类似于zookeeper 新建spring-boot工程,pom依赖: <dependency> <groupI ...

  2. Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  3. kratos微服务框架学习笔记一(kratos-demo)

    目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...

  4. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

  5. # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)

    目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...

  6. go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)

    目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...

  7. go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)

    目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...

  8. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  9. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

  10. go微服务框架kratos学习笔记十(熔断器)

    目录 go微服务框架kratos学习笔记十(熔断器) 什么是熔断 熔断器逻辑 kratos Breaker kratos 熔断逻辑 kratos熔断器使用说明 bladmaster client br ...

随机推荐

  1. [转帖]TIDB - TIDB集群的扩容和缩容及TIUP指令说明

    一.TIUP工具简介 前面介绍了使用TIUP搭建TIDB集群,本篇文章详细介绍下使用TIUP对集群进行扩容和缩容. 在面对双十一这种流量突峰的场景,我们平常的TIDB集群有可能承受不住,因此需要提前进 ...

  2. Python学习之六_同时访问Oracle和Mysql的方法

    Python学习之六_同时访问Oracle和Mysql的方法 背景 jaydebeapi 可以访问大部分数据库. 但是他有一个问题是仅能够访问一种类型的数据库. 如果同事连接两种数据库,那么就会出现问 ...

  3. 【解决了一个小问题】es query返回数据中, int64类型精度丢失的问题

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 首先定义了一个简单的结构体来接收es query返回的数据 ...

  4. 收藏-即时通讯(IM)开源项目OpenIM-功能手册

    OpenIM简介 OpenIM是由IM技术专家打造的开源即时通讯组件,也是目前最受欢迎的开源IM项目之一,目前github star近万.开发者通过集成OpenIM组件,并私有化部署服务端,可以将即时 ...

  5. Docker 安装 MySQL8 数据库

    创建数据卷 mkdir -p /usr/mysql/conf /usr/mysql/data chmod -R 755 /usr/mysql/ 创建配置文件 vim /usr/mysql/conf/m ...

  6. C/C++ 通过HTTP实现文件上传下载

    WinInet(Windows Internet)是 Microsoft Windows 操作系统中的一个 API 集,用于提供对 Internet 相关功能的支持.它包括了一系列的函数,使得 Win ...

  7. Python 实现 WebSocket 通信

    WebSocket 协议主要用于解决Web前端与后台数据交互问题,在WebSocket技术没有被定义之前,前台与后端通信需要使用轮询的方式实现,WebSocket则是通过握手机制让客户端与服务端建立全 ...

  8. Java中的自动装配注解

    1.说明 springboot 框架的亮点之一就是依赖注入和自动装配,它避免了我们在写代码时纠结类的生命周期问题 本文只记录一些注解的常用方法,并不深入说明 2.@Autowired 顾名思义,该注解 ...

  9. AOF

    AOF 基础概念 以日志的形式记录了每个写操作 在redis重新运行时,会将这些操作重新执行一遍 文件形式:appendonly.aof 开启AOF需要更改配置文件:appendonly:yes AO ...

  10. Proteus仿真出现“Internal Exception: access violation in module ‘LOADERS.DLL‘ [00020627].”错误

    Proteus仿真问题 在使用 Proteus 8.4 进行仿真时, 出现错误提示 Internal Exception: access violation in module 'LOADERS.DL ...