kitex框架负载均衡基本使用

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. 查看服务端的运行效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值