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结果。
参考
注册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

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

被折叠的 条评论
为什么被折叠?



