kitex的负载均衡是在client(客户端实现的),因此相关的配置都是在客户端进行的
初始化server端
1. 创建echo.thrift
namespace go api
struct Request {
1: string message
}
struct Response {
1: string message
}
service Echo {
Response echo(1: Request req)
}
2. 初始化kitex框架
kitex -moudle loadbalanceTest -service loadbalanceTest echo.thrift
3. 安装最新的kitex
# 安装最新的kitex
github.com/cloudwego/kitex/tool/cmd/kitex@latest
# 模块安装
go mod tidy
4. 修改handler下的处理逻辑
package main
import (
"context"
"log"
api "upstreamTest/kitex_gen/api"
)
type EchoImpl struct{}
func (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {
// 输出请求的内容
log.Println("request comming: ", req.Message)
// 做出响应
return &api.Response{Message: req.Message + " reback"}, nil
}
5. 修改main.go下的逻辑,让服务端可以指定端口运行
package main
import (
"log"
"net"
api "upstreamTest/kitex_gen/api/echo"
"github.com/cloudwego/kitex/server"
)
func main() {
// 此处可以修改监听的端口,修改后需要重新sh build.sh然后再通过sh output bootstrap.sh启动服务
addr, _ := net.ResolveTCPAddr("tcp", "0.0.0.0:8802")
var opts []server.Option
opts = append(opts, server.WithServiceAddr(addr))
svr := api.NewServer(new(EchoImpl), opts...)
err := svr.Run()
if err != nil {
log.Println(err.Error())
}
}
添加kitex客户端的逻辑
1. 代码如下
package main
import (
"context"
"log"
"time"
"upstreamTest/kitex_gen/api"
"upstreamTest/kitex_gen/api/echo"
"github.com/cloudwego/kitex/client"
"github.com/cloudwego/kitex/client/callopt"
"github.com/cloudwego/kitex/pkg/loadbalance"
)
func main() {
// 测试一致性hash的使用
// opt := client.WithLoadBalancer(loadbalance.NewConsistBalancer(loadbalance.NewConsistentHashOption(func(ctx context.Context, request interface{}) string { return "myKey" })))
// 测试基于权重的随机选择策略
opt := client.WithLoadBalancer(loadbalance.NewWeightedBalancer())
cli, err := echo.NewClient("upstreamTest", client.WithHostPorts("0.0.0.0:8801", "0.0.0.0:8802"), opt)
if err != nil {
log.Fatal(err)
}
for {
req := &api.Request{Message: "my request"}
resp, err := cli.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
if err != nil {
log.Fatal(err)
}
log.Println("result: ", resp)
time.Sleep(1*time.Second)
}
}
2. 运行客户端代码
go run main.go
结果演示
1. 启动服务
2. 启动客户端
3. 查看服务端的运行效果