GO EASY 游戏框架 之 GRPC 扩展篇 04
2023-12-13 14:45:04
1 Overview
此章节是对第三章的一个补充。同样属于RPC的篇章。是专门为了类似游戏服务这种需要指定RPC服务端具体地址,也就是具体是哪台机器的某应用进程,通信的方式。笔者简单的封装了下保证基本的服务稳定,且具备服务发现的属性即可,因此也仅仅对GRPC的客户端进行一次壳子的封装。
2 客户端初始化
外表看着几乎与03章节的 客户端初始化代码基本一致;
GRPC的初始化类名不同变为了NewGameGrpcCluster 而已;
这里没表现出来的,就是绑定Proto接口的方式发生了变化;
etcd.NewWithOption(option.OptionWith(nil).Default(
option.OptionFunc(func() (string, any) {
return "Endpoints", strings.Split(etcdAddr, ";")
}),
))
client := cgrpc.NewGameGrpcCluster(option.OptionWith(&struct {
PathName string
Namespace string
}{"server1", namespace}))
//client.Start()
// do your things
testHandle(client)
// just for test
client.Wait()
// close
client.Close()
3 调用Proto服务接口
为了方便后续调用,以及简化代码,我们在使用grpc.ClientConn 时的部分进行了一个函数封装。这与经常见过GRPC调用的方式是一样的。
func handleSay(clientConn grpc.ClientConnInterface) {
c := helloworld.NewGreeterClient(clientConn)
resp1, err := c.SayHello(
context.Background(),
&helloworld.HelloRequest{Name: fmt.Sprintf("xiaoming-%d", 9)},
)
if err != nil {
log.Fatal("Say Hello error:%v", err)
return
}
log.Info("SayHello Response:%s\n ", resp1.Message)
}
4 指定GRPC服务的invoke
- 关键点就是一个client.Handle;
- 它的参数是一个匿名函数;
- handle参数匿名函数 传递一个[]*cgrpc.GameGrpcConn的切片;
- cgrpc.GameGrpcConn 是继承于grpc.ClientConn
func testHandle(client *cgrpc.GameRpcCluster) {
ticker := time.NewTicker(time.Second)
for {
<-ticker.C
client.Handle(func(gconns []*cgrpc.GameGrpcConn) {
log.Info("clients conns %v", len(gconns))
if len(gconns) == 0 {
return
}
handleSay(gconns[0])
})
}
}
handle参数匿名函数拿到了grpc链接列表;致于如何获取某一个链接。就是路由的事情了,可以单独做一个小模块,与它结合起来。这里我们暂时没有做。
不过只要知道GameGrpcConn的另外一个参数你就很容易策略做这件事了。看看它的定义
type GameGrpcConn struct {
*grpc.ClientConn
Info ServInfo
}
type ServInfo struct {
AddrToRpc string
AddrToClient string
Name string
data any
}
知道了链接地址,和名字,怎么选择,可以随意开发策略,是随机,是按地址选择,按服务名选择也好。
需要知道用户在哪台游戏服的,或哪台聊天服的业务场景中,可以轻松实现。
文章来源:https://blog.csdn.net/Kaitiren/article/details/134970233
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!