Go EASY游戏框架 之 RPC Guide 03

news2024/10/7 9:20:18

1 Overview

easy解决服务端通信问题,同样使用了RPC技术。easy使用的ETCD+GRPC,直接将它们打包组合在了一起。随着服务发现的成熟,稳定,简单,若是不用,甚至你也并不需要RPC来分解你的架构。

GRPC 有默认resovler 解决服务发现的方案,只需要完成resolver,watch等,可以轻易实现,RPC的负载均衡。只不过这种只适合,对服务器ID信息等不敏感,比如说数据服务,和业务服务。不关心是哪台服务器完成的,只要数据处理完即可。

在游戏的应用场景中,登陆你可能使用的http,进入游戏用的游戏服务器,那么登陆服务需要知道用户在哪台游戏服务器中,使用token判定登陆,传输用户信息等走RPC通道,需要明确知道是哪台服务器。默认的服务发现就不满足我们的需求了。因此我们需要改造下,将游戏的这种具有耦合性质的负载也要支持才行。

2 传送门

go get github.com/slclub/easy/rpc

  • rpc/etcd  ETCD简单封装
  • rpc/cgrpc. GRPC 原生服务发现的封装实现,以及指定方式负载的服务发现

测试项目地址:github.com/slclub/easy/examples/rpc

3 传输协议编码Protobuf

我们直接使用grpc官网的helloworld。我们简单点直接上proto文件的描述语言。致于protoc等工具,以及go的依赖proto就不详细赘述了


syntax = "proto3";

option go_package = "google.golang.org/grpc/examples/helloworld/helloworld";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

4 GRPC服务端

4.1 helloworld 接口


// server is used to implement helloworld.GreeterServer.
type hello struct {
	helloworld.UnimplementedGreeterServer
}

// SayHello implements helloworld.GreeterServer
func (s *hello) SayHello(ctx context.Context, in *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
	log.Info("Received: %v", in.GetName())
	return &helloworld.HelloReply{Message: "Hello " + in.GetName()}, nil
}

SayHello接口会自动依据protobuf 生成的helloworld_grpc.pb.go 文件代码去接收客户端来的请求。

4.2 ETCD client初始化

etcd.NewWithOption(option.OptionWith(nil).Default(
		option.OptionFunc(func() (string, any) {
			return "Endpoints", strings.Split(etcdAddr, ";")
		})),
	)

etcdAddr 是 用分号链接起来的,etcd的监听地址字符串。ETCD 在整个服务发现体系仅仅需要这理论的一行代码足够了。演示项目我们没有配置账号和密码。实际项目需要主要服务安全。

4.3  服务端grpc 

  • 第一部分grpc初始化
  • 第二部分proto接口注册
  • 第三部分就一个函数调用Serv启动服务监听
// New 一个rpc 监听服务
	server := cgrpc.NewServer(option.OptionWith(&cgrpc.Config{
		PathName:  "server1",
		Addr:      serverAddr,
		Namespace: namespace,
		//TTL:       15,
	}).Default(
		option.DEFAULT_IGNORE_ZERO,
		option.OptionFunc(func() (string, any) {
			return "ID", "abluo"
		}),
		option.OptionFunc(func() (string, any) {
			return "AddrToClient", "127.0.0.1:18080"
		}),
	))

	// 绑定业务接口到 rpc服务
	// 可以被多次使用RegisterService,我们用的append
	server.RegisterService(
		func(server *grpc.Server) {
			helloworld.RegisterGreeterServer(server, &hello{})
		},
	)

	// 监听;如果您有主监听,那么可以用go 并发运行
	server.Serv()

其中AddrToClient 是针对游戏服务提供给游戏客户端的监听地址,对于grpc来说不是必须的。这里仅仅是从顺便使用grpc 的服务端注册到ETCD中,完成游戏端的服务发现。可以做到任何游戏服不停服的扩展性,动态添加或减少服务端的机器。

这里我们可以发现使用option.Assignment初始化的优势,演示代码的时候不需要写完整的配置参数,还能人为控制的保证参数的默认值。处理默认值都是统一的格式,流程化代码。

当然option.Assignment是有局限性的,仅仅适合服务类的对象,或者仅仅LoadOnce的逻辑部分使用。在业务代码不建议使用,因使用了reflect反射会性能低下。

4.4 grpc客户端

  • ETCD初始化;
  • grpc.Client初始化;
  • Client启动我们分开了,多了一行启动过程,一个函数调用Start();
  • handle 绑定调用接口proto;
  • client.Wait() 为测试而生的函数,实际项目中用不到;
  • client.Close() 不严谨的情况可以不用,严谨的话,在项目工程服务关闭后调用;
	// plan2 using the default value setting function.
	etcd.NewWithOption(option.OptionWith(nil).Default(
		option.OptionFunc(func() (string, any) {
			return "Endpoints", strings.Split(etcdAddr, ";")
		}),
	))

	client := cgrpc.NewClient(option.OptionWith(&struct {
		PathName  string
		Namespace string
	}{"server1", namespace}))

	client.Start()

	// do your things
	handle(client.ClientConn)
	// just for test
	client.Wait()

	// close
	client.Close()

5 启动

为了启动测试命令随时可以手敲,笔者没有将ETCD,GRPC地址通过flag传递给应用工程。直接写到代码里了。运行前,请下修改代码中的监听地址变量的值。

5.1 启动服务端

$  cd 到 examples/rpc/server 

go build && ./server

5.2 启动客户端

$  cd 到 examples/rpc/client

go build && ./client

6 Output

首先双方通信正常OK。

启动服务后,笔者模拟,任意一端崩掉用(CTRL+C),再启动崩掉的端,整体服务立刻回复正常。

其他的测试情况就不一一再往这上面粘贴了。

服务端

断开gprc服务端再启动

客户端

7 总结

构建一个完整架构的游戏服务器,仅仅靠服务发现,rpc等虽然还不足够。但是这么简单的实现服务端通信,还是让人很愉快。后续再有其他的服务组件,我们可以一一加入进去。同时给出测试项目。

go讲究毕竟是精简,笔者也不是弄个大杂烩,而是设计好package,需要什么我们就用什么。虽说做不到EASY在手天下我有,但是弄一个小体系,还是能节省我们很多项目时间。

最后欢迎大家互相交流学习,有好东西互相分享下。有兴趣的通许可以通过传送门去github,给EASY来个小小的star。因压力测试还不到位,不全,所以笔者一直没有发布一个Stable版本,希望大家谅解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1307701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

产品入门第三讲:Axure产品流程图绘制

📚📚 🏅我是默,一个在CSDN分享笔记的博主。📚📚 ​​​​​ 🌟在这里,我要推荐给大家我的专栏《Axure》。🎯🎯 🚀无论你是编程小白,还…

电子学会C/C++编程等级考试2022年12月(五级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:漫漫回国路 2020年5月,国际航班机票难求。一位在美国华盛顿的中国留学生,因为一些原因必须在本周内回到北京。现在已知各个机场之间的航班情况,求问他回不回得来(不考虑转机次数和机票价格)。 时间限制:1000 内存限制:655…

排序算法---希尔排序

1. 基本思想 希尔排序是插入排序的一种,它与直接插入排序不同的是,它会优先比较距离较远的元素,因此希尔排序又被称为“缩小增量排序”。希尔排序的实现思路是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序&…

鸿蒙OS应用开发者高级认证题库

一、判断题 云函数打包完成后,需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用(错) 在column和Row容器组件中,aligntems用于设置子组件在主轴方向上的对齐格式,justifycontent用于设置子组件在交叉轴…

Nature 确认:大语言模型只是没有感情的「学人精」

DeepMind、EleutherAI 科学家提出,大模型只是在角色扮演。 ChatGPT 爆火后,大语言模型一跃而至,成为了行业与资本的宠儿。而在人们或是猎奇、或是探究地一次次对话中,大语言模型所表现出的过度拟人化也引起了越来越多的关注。 其实…

Linux常用命令----pgrep 命令

文章目录 介绍语法常用选项用法示例结论 介绍 pgrep 是一个在 Linux 系统上用于查找进程 ID(PID)的常用命令。通过提供进程名或者其他选择性的标志,pgrep 可以快速地检索与之匹配的进程 ID,并将其输出到标准输出。 语法 pgrep …

java-sec-code中的sql注入

java-sec-code 用于学习java漏洞代码 环境部署 直接在idea中git 运行即可 sql注入 环境中主要是两个 分别为jdbc和mybatis jdbc 存在问题的写法 直接获取用户传入的数据,拼接执行 String sql "select * from users where username " request.getP…

python源码,在线读取传奇列表,并解析为需要的JSON格式

python源码,在线读取传奇列表,并解析为需要的JSON格式 [Server] ; 使用“/”字符分开颜色,也可以不使用颜色,支持以前的旧格式,只有标题和服务器标题支持颜色 ; 标题/颜色代码(0-255)|服务器标题/颜色代码(0-255)|服务…

小航助学2023年9月电子学会Scratch二级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号) 单选题2.00分 删除编辑附件图文 答案:D 第1题点击绿旗,运行程序后,舞台上的图形是?( ) A、画笔粗细…

小企业必备:实用邮件营销软件推荐

通俗来讲,邮件营销是指通过邮件,与新老客户保持长久互动,把潜在客户转变为企业客户,为宣传企业品牌,提高品牌知名度和影响力,保持长久客户关系的一种简单有效的营销方式。 相较于其他营销方式,…

【FPGA/verilog -入门学习10】verilog 查表法实现正弦波形发生器

0,需求 用查找表设计实现一个正弦波形发生器 寻址的位宽是10位,数据量是1024个,输出的数据是16位 1,需求分析 数据量是1024个: x linspace(0,2*pi,1024) 输出数据是16位: y范围:0~2^16 -1 0~65535…

防火墙访问控制、安全审计、网络设备防护检查表

1、访问控制类检查 2、安全审计类检查 3、网络设备防护类检查 原件: 防火墙标准检查表 分类 测评项 预期结果 访问控制 应在网络边界部署访问控制设备,启用访问控制功能 启用了访问控制规则 应能根据会话状态信息为数据流提供明确的允许/拒绝访…

【JMeter】使用nmon进行性能资源监控

一、前言 ​ 在工作中可能会遇到需要在压测的时候对Linux服务器进行性能资源监控的情况。这时可以用nmon来对服务器进行监控。 二、nmon的下载安装 1.查看系统信息 shell cat /etc/os-release结果为 shell PRETTY_NAME"Debian GNU/Linux 12 (bookworm)" NAME&qu…

《HumanGaussian: Text-Driven 3D Human Generation with Gaussian Splatting》

文章目录 前置知识:一、正文:二、方法 前置知识: \quad 1)SMPL(Skinned Multi-Person Linear)模型 \quad SMPL(Skinned Multi-Person Linear)模型是一种用于表示人体形状和姿势的三维…

TikTok与虚拟现实的完美交融:全新娱乐时代的开启

TikTok,这个风靡全球的短视频平台,与虚拟现实(VR)技术的深度结合,为用户呈现了一场全新的娱乐盛宴。虚拟现实技术为TikTok带来了更丰富、更沉浸的用户体验,标志着全新娱乐时代的开启。本文将深入探讨TikTok…

matlab信号分选系统算法-完整算法结构

matlab信号分选系统算法 针对得到的脉冲流PDW进行信号分选,包括重频恒定、重频抖动、重频参差和重频滑变四种脉间调制类型。   这里我们先进行数据的仿真,后续边仿真边分享思路:首先根据信号类型,分别产生重频恒定、重频抖动、重…

陪玩系统最新上线!APP小程序H5三端源码交付,支持二开!开发者必看!

首先,陪玩系统需要提供实时匹配功能。用户输入自己的游戏信息和陪玩需求后,系统需要根据这些信息实时匹配合适的陪玩者。匹配算法应该考虑到游戏类型、玩家水平、价格等因素,以确保匹配结果符合用户期望。 其次,陪玩系统需要提供…

常见的计算机图片格式

左rgb (光源色彩) 右cmyk (印刷色彩) 缺点,不能保存,储存空间太大

专为中小培训机构精心打造的教务管理系统

随着互联网的普及和线上教育的兴起,教育机构纷纷开发出自己的小程序管理系统,以满足广大学生和家长的需求。本文将详细介绍如何使用乔拓云平台,一键开发出自己的教育机构小程序管理系统。 一、进入乔拓云后台 在浏览器搜索乔拓云&#xff0c…

【数组Array】力扣-283 移动零

目录 题目描述 解题过程 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,…