在线logo,整站优化关键词排名,室内装饰设计图集,物联网应用技术就业前景1 Overview
此章节是对第三章的一个补充。同样属于RPC的篇章。是专门为了类似游戏服务这种需要指定RPC服务端具体地址#xff0c;也就是具体是哪台机器的某应用进程#xff0c;通信的方式。笔者简单的封装了下保证基本的服务稳定#xff0c;且具备服务发现的属性即可#…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 stringNamespace string}{server1, namespace}))//client.Start()// do your thingstestHandle(client)// just for testclient.Wait()// closeclient.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.Cclient.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.ClientConnInfo ServInfo
}type ServInfo struct {AddrToRpc stringAddrToClient stringName stringdata any
}
知道了链接地址和名字怎么选择可以随意开发策略是随机是按地址选择按服务名选择也好。
需要知道用户在哪台游戏服的或哪台聊天服的业务场景中可以轻松实现。