go-kratos 微服务框架 warden模块使用

本文介绍了如何在Go Kratos微服务框架中使用warden模块,涉及pb文件的生成与使用,服务的注册与发现,包括直接连接、使用discovery和ETCD的方式,以及WRR和P2C两种负载均衡策略的实现和工作原理。通过阅读,读者可以了解到在Kratos中如何实现gRPC服务的搭建、客户端调用和服务治理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pb文件

创建项目成功后,进入api目录下可以看到api.proto文件:

option go_package = "api";
option (gogoproto.goproto_getters_all) = false;

service RPCDemo {
  rpc Ping(.google.protobuf.Empty) returns (.google.protobuf.Empty);
  rpc SayHello(HelloReq) returns (.google.protobuf.Empty);
  rpc SayHelloURL(HelloReq) returns (HelloResp) {
    option (google.api.http) = {
      get: "/kratos-demo/say_hello"
    };
  };
}

message HelloReq {
  string name = 1 [(gogoproto.moretags) = 'form:"name" validate:"required"'];
}

message HelloResp {
  string Content = 1 [(gogoproto.jsontag) = 'content'];
}

运行:

kratos tool protoc --grpc --bm api.proto

命令可以得到api.pb.go 和 api.bm.go

api.proto是gRPC server的描述文件
api.pb.go是基于api.proto生成的代码文件,用于rpc调用,具体逻辑可在internal/service/serevice.go 内实现
api.bm.go是基于api.proto生成的代码文件,用于http调用,将参数绑定后,调用serevice.go中方法,并返回json结果。

参考

gogo/protobuf

注册server

进入internal/server/grpc目录打开server.go文件,可以看到以下代码,只需要替换以下注释内容就可以启动一个gRPC服务。

package grpc

import (
	"github.com/luslin/tools/kratos-demo/api"

	"github.com/go-kratos/kratos/pkg/conf/paladin"
	"github.com/go-kratos/kratos/pkg/net/rpc/warden"
)

// New new a grpc server.
func New(svc api.RPCDemoServer) (ws *warden.Server, err error) {
	var (
		cfg warden.ServerConfig
		ct paladin.TOML
	)
	if err = paladin.Get("grpc.toml").Unmarshal(&ct); err != nil {
		return
	}
	if err = ct.Get("Server").UnmarshalTOML(&cfg); err != nil {
		return
	}
	ws = warden.NewServer(&cfg)
	// 替换这里   RegisterRPCDemoServer 在 api.pb.go 中
	api.RegisterRPCDemoServer(ws.Server(), svc)
	ws, err = ws.Start()
	return
}

注册方法 internal/service/service.go

var Provider = wire.NewSet(New, wire.Bind(new(api.RPCDemoServer), new(*Service)))

// Service service.
type Service struct {
   
	ac  *paladin.Map
	dao dao.Dao
}

// New new a service and return.
func New(d dao.Dao) (s *Service, cf func(), err error) {
   
	s = &Service{
   
		ac:  &paladin.TOML{
   },
		dao: d,
	}
	cf = s.Close
	err = paladin.Watch("application.toml", s.ac)
	return
}

// SayHello grpc demo func.
func (s *Service) SayHello(ctx context.Context, req *api.HelloReq) (reply *empty.Empty, err error) {
   
	reply = new(empty.Empty)
	fmt.Printf("hello %s", req.Name)
	return
}

// SayHelloURL bm demo func.
func (s *Service) SayHelloURL(ctx context.Context, req *api.HelloReq) (reply *api.HelloResp, err error) {
   
	reply = &api.HelloResp{
   
		Content: "hello " + req.Name,
	}
	fmt.Printf("hello url %s", req.Name)
	return
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值