golang 分布式框架Origin学习笔记

2023-11-01

最近项目的后端需求是全球同服的,在使用语言方面确定了为golang之后,了解了一下当前的一些goalng游戏服务器框架,终于在leaf/pitaya/ 等众多框架中选择了 Origin, 主要是因为它是分布式框架,微服务架构,比较匹配做全球同服需求下的功能模块分离。
| 各个框架对比
(后续2021.08.04补充更正一下,Origin的服务发现功能现已实现,参看Origin服务发现详解

目前基本已经上手,现在总结归纳一下一些需要注意和记住的点:

1、服务的安装

步骤如下:

  1. 服务的实现
    定义一个组合了service.Service的结构体,它就是一个服务了

  2. 服务的预加载
    在服务实现的package的init函数中使用 node.setup就可以预加载服务了, 预加载之前根据需要设置服务的Name, 与后面配置servicelist中的名字对应,默认是服务结构体的名称.

  3. 服务配置
    在config/cluster.json 中可以配置每个节点的servicelist, 添加节点想要装载的服务名即可.

  4. main.go中导入服务package
    这点是很容易忽略的点,一不小心就容易搞忘记了, 一定要在main.go中import

2、rpc的使用细节

在Origin中rpc的接口及注释如下:	
	// 异步, rpc首选, 不会阻塞本服务
	AsyncCall(serviceMethod string,args interface{},callback interface{}) error
	// 同步等待调用结果
	Call(serviceMethod string,args interface{},reply interface{}) error
	// 无结果,不阻塞
	Go(serviceMethod string,args interface{}) error
	// 在明确节点时调用,可以稍微减少开销;  Service名相同时, 避免广播
	AsyncCallNode(nodeId int,serviceMethod string,args interface{},callback interface{}) error
	CallNode(nodeId int,serviceMethod string,args interface{},reply interface{}) error
	GoNode(nodeId int,serviceMethod string,args interface{}) error
	// 原数据,减少参数/结果的序列化和反序列化, 大量转发时使用.
	RawGoNode(rpcProcessorType RpcProcessorType,nodeId int,rpcMethodId uint32,serviceName string,rawArgs IRawInputArgs) error
	// 广播
	CastGo(serviceMethod string,args interface{})

RPC函数的定义方式看过官方文档了就大致清楚了,这里强调一下, 有时候被调用方可能是一个很费时的操作,这个时候就需要考虑如下这种方式的RPC函数实现:

// RPC 函数的另一种定义方式, 第一个参数为 rpc.Responder(rpc.requesthandler)类型, 主要可以用来 异步返回调用结果.
func (slf *LoginService) RPC_AuthLoginEx(resp rpc.Responder, req *msgpb.MsgLoginReq) error {

	// 如果ret是一个比较耗时的外部调用的结果,为了不阻塞本服务, 需要开启异步协程, 在异步结果到达时, 调用resp返回rpc结果
	go func(){
		time.Sleep(3*time.Second)
		ret := &msgpb.MsgLoginRes{Ret: msgpb.ErrCode_ConnExceeded}
		resp(ret, rpc.NilError)
	}()

	return nil
}

对应的调用方式不变:

	r.gateService.Call("LoginService.RPC_AuthLoginEx", msgLoginReq, msgLoginRet)
	r.gateService.AsyncCall("LoginService.RPC_AuthLoginEx", msgLoginReq, func(ret *msgpb.MsgLoginRes, err error){
	})

3、Origin核心思想

这个得从config说起,config/cluster.json,这个是目前版本origin(作者Boyce正考虑完善服务发现功能)的集群节点、服务配置。 其中每个节点下有一个servicelist,这个是配置每个节点装载的服务的名字(私有的以下划线_开头),一开始我觉得根据node.setup的服务就可以知道当前节点装载了哪些服务没必要在这里配置,后来才知道错了。

因为origin是单程序,服务配置化的设计思想,即所有节点都使用同一个编译好的执行程序,每个节点根据配置的servicelist来最终装载自己的服务,而不是在每个service的实现文件里的init里的node.setup时装载的。 init里的setup只是预装载,只是把服务名和服务的实现代码绑定起来。最后真正装载服务是在cluster初始化时,解析了节点的servicelist之后才装载的。

这样做的好处目前想到的有如下几点:
1、所有节点的服务配置对外都是透明的,这样其他节点进行rpc时就有源可寻。
2、配置灵活,所有的服务都可以随意配置成单进程或集群模式,不同模式下,在rpc的支持下无需做其他修改。方便开发和生产环境服务器集群的伸缩。

传送点:
1、Origin RPC
2、Origin 服务发现

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang 分布式框架Origin学习笔记 的相关文章

  • 按顺序范围循环映射

    我正在寻找一种确定的方法来范围Go map为了 Go 规范 https golang org ref spec For statements陈述如下 映射的迭代顺序未指定 并且不保证从一次迭代到下一次迭代的顺序相同 如果在迭代过程中删除尚未
  • 如何更改“go build”的库路径

    我正在尝试与 goncurses 一起工作 在 Centos 6 上 ncurses 库很旧 5 7 想要 5 9 所以我从源代码构建了 ncurses 并将其安装到 usr lib usr include 等中 如何告诉 go get 针
  • 如何在Go中从interface{}解组到interface{}

    我的系统中有多个通过 RPC 进行通信的节点 我正在尝试通过 RPC 将 map string interface 发送到另一个节点 发送方使用 json Marshal 接收方使用 json Unmarshal 来获取地图 假设在发送方
  • Golang 中的“相互”包导入

    是否可以在 Golang 中执行 相互 包导入之类的操作 举例来说 我有两个包 A 和 B 分别具有 AFunc 和 BFunc BFunc2 函数 package A import B func AFunc do stuff but al
  • 如何检查我的 golang 应用程序是否使用 Boringcrypto 而不是本机 golang crypto?

    上下文 我正在阅读多篇有关使我的 golang 应用程序符合 FIPS 要求的文章 换句话说 使我的应用程序使用 Boringcrypto 而不是本机 golang crypto https kupczynski info posts fi
  • IntelliJ 2017.1.2 GOLANG 调试不适用于包中的断点

    我的应用程序由一个 main go 文件和一些包组成 当在 main go 中命中断点时 IntelliJ 按预期工作 显示变量值等 但是 当在不同的包中设置断点时 除了被命中之外 不会显示任何变量 并且不会跳过 进入功能按预期工作 被击中
  • 通过 API Gateway 使用表单数据将图像发布到 Lambda 函数会导致文件无效

    I ve a 用 Go 编写的 Lambda 函数 https github com mhausenblas imgn blob master functions app uploadimg main go应该允许图像文件上传 通过 HTM
  • 使用 Golang 通道处理 HTTP 请求

    我正在尝试构建一个简单的 Golang Appengine 应用程序 它使用通道来处理每个 http 请求 原因是我希望每个请求执行合理的大型内存计算 并且每个请求都以线程安全的方式执行 即来自并发请求的计算不会混合 这一点很重要 本质上
  • formatFloat :将浮点数转换为字符串[重复]

    这个问题在这里已经有答案了 http golang org pkg strconv http golang org pkg strconv http play golang org p 4VNRgW8WoB http play golang
  • 带 cookie 身份验证的 Gorilla websocket

    这是我的设置 我正在构建一个带有用户登录的服务 使用 Negroni 和 Gorilla 登录后 用户会获得一个会话 cookie 服务器使用该会话 cookie 来授权受保护的端点 受保护的端点之一允许用户 客户端与服务器打开 Webso
  • golang:使用 gin 路由器服务 net.Conn

    我有一个处理传入 TCP 连接的函数 func Handle conn net Conn error 另外 我有一个初始化的 gin 路由器 带有已实现的句柄 router gin New router GET router POST Th
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • 在 Alpine 中找不到运行时/cgo

    In an alpine edge我安装的容器通过 RUN apk add no cache musl dev go 我试着跑go get github com golang protobuf protoc gen go then 这会导致
  • Go 中的切片分块

    我有一个切片 其中包含约 210 万条日志字符串 我想创建一个切片切片 其中字符串尽可能均匀分布 这是我到目前为止所拥有的 logs is a slice with 2 1 million strings in it var divided
  • Ajax 将文件上传到内容类型为 Multipart 的 GoLang 服务器

    我正在尝试使用多部分表单将音频文件上传到 Golang 服务器 然而 Go 返回错误 multipart NextPart bufio buffer full 我相信这表明我的 Javascript 请求中存在不属于多部分格式的内容 这是我
  • 初始化嵌套匿名结构

    我有一个 json 作为 fields time id status customerId additionalDetail pageInfo start 0 rows 1000 我想将我的结构编组到上面的 json 并创建如下结构 typ
  • 检查值是否实现接口的说明

    我读过 Effective Go 和其他类似这样的问答 golang接口合规性编译类型检查 https stackoverflow com questions 17994519 golang interface compliance com
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • 我怎么知道我的所有 goroutine 确实正在使用 golang 的同步包等待一个条件

    我有一个应用程序 我正在创建多个 goroutine 来同时执行某个任务 所有工作协程都会等待条件 事件发生 一旦事件被触发 它们就会开始执行 创建完所有goroutines后 主线程在发送广播信号之前应该知道所有goroutines确实处

随机推荐

  • IP可以正常访问网站、域名无法正常访问

    问题 域名解析都是都是正常的 可以ping通所指向的IP 端口也可以telnet通 但是就是无法正常访问平台 错误提示403 解决方案 将tomcat里面的server配置文件中的defaultHost这个配置属性修改成网站访问的公网IP地
  • 安装ffmpeg并写入jupyter matplotlib

    Jupyter生成动画需要首先安装一个名叫ffmpeg的软件 这是一个支持网页生成视频的软件 进入ffmpeg主页 Builds CODEX FFMPEG gyan dev 点击下载最新版的ffmpeg git full 7z essent
  • Ogre学习记录

    Ogre学习记录 Posted on 2008 07 09 15 36 RichardHe 阅读 839 评论 2 编辑 收藏 引用 所属分类 OGRE 1 设计初衷 它设计初衷是完全跨平台的 抽象的接口隐藏了平台相关的细节 它设计初衷是大
  • 华为云盘古气象(Pangu-Weather)大模型调试运行之小白教程

    0 前言 最近盘古气象大模型研究成果在 Nature 正刊发表 这个消息引起了大家的广泛关注 作为地理模型爱好者 在之前的学习中接触过一些气象预测模型 对此怀有兴趣 而且顺带蹭蹭热度嘛 不丢人 在此分享一下自己的学习过程 笔者水平有限 如有
  • JPM Coin三部曲 (上) :深入理解摩根幣的運作

    全美最大的銀行摩根大通推出首個由美國銀行支持的加密貨幣 有人說這是主流金融機構開始接納加密貨幣的標誌 有人調侃摩根 CEO 傑米 戴蒙一邊炮轟比特幣 一邊忍不住自己發幣 還有密碼朋克旗幟鮮明地抨擊該 全美最大的銀行摩根大通推出首個由美國銀行
  • centos7配置syslog客户端上传日志

    由于客户要求 需要把主机上的syslog传递到指定系统上 之前没有做过相关设置 本次配置是第一次配置 先上网插了下syslog分为很多种 如图 这只是一部分 可以直接到 etc rsyslog conf配置文件中自行查看 根据需求可以选择全
  • 解决VScode中:C/C++编译器错误导致头文件报错问题

    一 软件安装 VScode安装网址 https code visualstudio com 进入网址 直接download即可 VScode软件很好安装 下载完安装包之后 双击安装包 选同意 选下一步 接下来将框中全部打 之后一路 下一步
  • Unity 新手向,如何快速利用插件设置高亮状态

    前言 相信很多小伙伴在开发游戏的过程中 会需要用到物体高亮的效果 效果如图所示 在初学阶段 我们不需要自己去写复杂的shader 而是快速利用插件来解决这一功能的需求 以下是我们本文将会使用到的一款免费的高亮插件 Quick Outline
  • 【廖雪峰python进阶笔记】面向对象编程

    1 定义类并创建实例 在Python中 类通过 class 关键字定义 以 Person 为例 定义一个Person类如下 class Person object pass 按照 Python 的编程习惯 类名以大写字母开头 紧接着是 ob
  • 关于vue导入csv文件格式错误,js-xlsx导入CSV文件中文乱码处理参考

    最近在vue导入csv文件踩的一个坑 废话就不多说了 直接上源码和处理过程 过程 我最近使用js xlsx导入CSV文件时会出现中文乱码 其实这种问题基本上都是因为文件的编码不对造成的 因为使用这个插件用的比较多之前是可以直接使用UTF 8
  • Gitlab 报错:Error 500 with /api/v4/projects: NoMethodError: undefined method `string_access_level‘

    新安装的gitlab1 14 1版本在调用查询所project的api时 会报如下错误 NoMethodError undefined method string access level for nil NilClass api enti
  • VC文件目录选择对话框(任意目录)

    程序运行界面显示如下 使用目录选择对话框时 如何让其弹出后自动打开指定目录 是的当用目录选择对话框时 用如下的结构打开 以下是代码片段 typedef struct browseinfo HWND hwndOwner LPCITEMIDLI
  • 区块链技术在医疗数据共享中的应用

    随着医疗信息化技术的日益发展 医疗数据的存储和管理变得更加重要 传统的数据存储方法面临着信息泄露 数据篡改等安全隐患 为了解决这些问题 人们开始探索将区块链技术应用于医疗数据共享 以提高数据安全性和可靠性 本文将探讨区块链技术在医疗数据共享
  • 简述SD卡的工作原理(四)

    简述SD卡的工作原理 功能 SD卡是存储卡 它的功能就是存储 分类 SD卡按容量分类 可以分为3类 SD卡 SDHC卡 SDXC卡 如下 容量 命名 简称 0 2G Standard Capacity SD Memory Card SDSC
  • ubuntu顶部的任务栏-标题栏-菜单栏-启动器消失不见7个解决办法

    因为开发环境的Ubuntu服务器不敢随便折腾 所以就在自己机器装了一个 折腾来折腾去 不知道哪个环节安装 卸载出了问题 也可能是改了什么配置我没注意到 进入桌面后找不到启动器 菜单栏和标题栏了 终端可以打开 也能通过终端运行程序 有两次是重
  • 关于WiFi和信号图标出现感叹号消除办法

    谷歌原生安卓系统当连接到移动数据网络或者WIFI网络的时候 其NetworkMonitor模块会向特定的服务器发起一个http的请求并利用收到的响应进行网络状态判断 由于谷歌的服务器被天朝屏蔽 所以导致没有返回值 这个时候谷歌安卓系统就会在
  • linux权限管理

    权限管理 文件的权限针对三类对象进行定义 user属主 缩写u group属组 缩写g other其他 缩写o 1 文件的一般权限 1 r w x的作用及含义 权限 对文件影响 对目录影响 r read 读 可以读取文件内容 可以列出目录的
  • 微信小程序导出zip、excel、word、png到手机

    1 需要使用的方法 wx request 发请求调用接口 wx showModal 打开弹框进行展示 wx setClipboardData 复制文本的数据 wx downloadFile 文件下载的方法 wx getFileSystemM
  • 互联网摸鱼日报(2023-02-26)

    互联网摸鱼日报 2023 02 26 InfoQ 热门话题 迁移工具 Air2phin 宣布开源 2 步迁移 Airflow 至 Dolphinscheduler 专访奇安信董国伟博士 目前开源安全的现状并不乐观 但其重要性已成各方共识 专
  • golang 分布式框架Origin学习笔记

    最近项目的后端需求是全球同服的 在使用语言方面确定了为golang之后 了解了一下当前的一些goalng游戏服务器框架 终于在leaf pitaya 等众多框架中选择了 Origin 主要是因为它是分布式框架 微服务架构 比较匹配做全球同服