GO EASY 游戏框架 之 GRPC 扩展篇 04

发布时间:2023年12月17日

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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。