golang 分布式框架Origin学习笔记

article/2025/9/11 17:38:14

最近项目的后端需求是全球同服的,在使用语言方面确定了为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{}) errorCallNode(nodeId int,serviceMethod string,args interface{},reply interface{}) errorGoNode(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 服务发现


http://chatgpt.dhexx.cn/article/k3pHp8jG.shtml

相关文章

Java开发Dubbo分布式框架

引言 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候&#x…

PyTorch 分布式框架 Ray :保姆级入门教程

来源:官方博客 翻译:PyTorch 开发者社区(微信公众号) 今天的机器学习需要分布式计算。无论是训练网络、调整超参数、服务模型还是处理数据,机器学习都是计算密集型的,如果没有访问集群,速度会非…

celery 分布式框架详解

Celery 结构图 如果没有celery,让你自己设计一个异步任务队列你怎么做。 首先,要有一个发起任务的client,选定一定保存任务信息的媒介,由一个worker去一直监听这个信息媒介,这个worker最好是多进程的,另外…

分布式定时任务调度框架

分布式定时任务调度框架 1 分布式定时任务框架设计 1.1 所需的功能 一个分布式定时任务,需要具备有以下几点功能: 1)核心功能:定时调度、任务管理、可观测日志 2)高可用:集群、分片、失败处理 3&#xf…

# 手把手教学超详细python通用爬虫分布式框架(一)

手把手教学超详细python通用爬虫分布式框架(一) 这里日后添加系列文章的所有文章的目录 文章目录 手把手教学超详细python通用爬虫分布式框架(一)前言一、所谓任务?二、任务需要什么1.启动格式2.任务执行流程分析3.任务灵活化 总结 前言 采用 vueflask,…

使用c++开发分布式框架实践

目前比较流行的分布式框架有dubbo,springcloud,JMX等,都是java实现的,但是在做c项目时,也有分布式的需求,这时我们可以基于grpc自己设计一套分布式框架。 整体思路如下: Consumer服务消费者&…

Ray入门指南——分布式框架(待更新)

1. ray库介绍 金融、工程模型需要大量使用 Pandas 和 Numpy 来做矩阵计算,需要针对 Pandas/Numpy 有更好的支持,ray库就是其中一种可以加速计算的框架。 Ray 有如下特点: 分布式异步调用内存调度Pandas/Numpy 的分布式支持支持 Python整体性…

springboot分布式框架搭建

搭建框架需要工具默认基于 maven 的分布式工程,我们知道在一个项目中,多个微服务是属于同一个工程,只不过是提供不同的服务而已,因此使用 maven 分布式工程来搭建微服务架构。搭建基于 maven 分布式的 Spring Cloud 微服务工程架构…

分布式事务及分布式框架Seata

分布式事务 分布式事务是什么? 》本地事务是一个单元的sql,分布式事务也是一个单元的sql,他们区别在于,分布式事务的sql分布在了不同服务上,这里的服务指微服务和数据库服务 ?为什么强调服务是微服务和数…

分布式计算框架Map/reduce

简介: MapReduce是一个基于集群的高性能并行计算平台,MapReduce是一个并行计算与运行的软件框架,MapReduce是一个并行程序设计模型与方法.特点: ①分布可靠,对数据集的操作分发给集群中的多个节点实现可靠性,每个节点周期性返回它完成的任务和最新的状态 ②封装了实现细节&a…

什么是分布式架构

一、分布式架构定义 什么是分布式架构 分布式系统(distributed system) 是建立在网络之上的软件系统。 内聚性:是指每一个数据库分布节点高度自治,有本地的数据库管理系统。 透明性:是指每一个数据库分布节点对用户…

分布式架构图解

一、分布式架构图解 1)传统servletjsp模式 2)分布式架构  需要按照功能点把系统拆分,拆分成独立的功能。单独为某一个节点添加服务器。需要系统之间配合才能完成整个业务逻辑。叫做分布式。  分布式架构:多个子系统相互协作…

分布式框架

应用架构 单一应用架构ORM 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。 适用于小型网站,小型管理系统,将所有…

juicer.js @each中的index 索引+1操作

问题描述:想在index1的值显示出来而不是做字符串拼接,如我做的楼号, 想显示2楼,3楼,4楼 解决方法:在index前加一个加号即可。 !{index1}楼 效果: 简单介绍juicer模板: Juicer 是…

Jmetercookie管理器

Jmeter中cookie自动存储 1,新建一个测试计划,然后添加一个"HTTP Cookie 管理器"(用来存储cookie) 2,新建一个线程组,添加一个Sampler-->“HTTP 请求”(用来登录用的),添加一个Samp…

利用3D-DNA流程组装基因组

利用3D-DNA流程组装基因组 使用二代数据或三代数据得到contig后,下一步就是将contig提升到染色体水平。有很多策略可以做到这一点,比如说遗传图谱,BioNano(看运气), HiC, 参考近源物种。 如果利用HiC进行准染色体水平,那么目前常见…

Hic-pro的结果文件转化为.hic文件,在juicebox中实现可视化

hic数据经过Hic-pro处理后,会生成allvalidpairs文件,这是所有有效配对的文件。一般想要可视化的话,比较复杂。这时我们就可以把它转化为.hic文件,放到juicebox中就很好的可视化。 juicer中的pre命令是用来做这个事情的。只要你的…

Java-juc

1. 进程和线程 进程: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个基本单位。例如:打开一个 .exe文件就是一个进程、打开360安全软件就是一个进程 线程 线程是进程的一个实体,是进…

Junit

Junit单元测试 简介:本文主要讲解,如何使用Eclipse,进行单元测试。 1.准备工作:搭建实验环境(EclipseJunitAnt) Eclipse:http://www.eclipse.org/ JUnit:http://www.junit.org/ Ant&#x…

juicer使用案例

代码结构&#xff1a; 编写main.html&#xff1a;引入方式可从bootcdn直接copy script标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge&…