Gaea源码阅读(五):C客户端

新手编程之旅:零基础如何学习MySQL? SQL如何学习? SQL入门有一本常常提起的书《SQL in 10minutes》这本可以看看。常年amazon销量前列。或者动物社的,learning SQL,也是很好的。 你需要在实际操作中累积经验,因为任何非实际项目你无法真实碰触到实际数据库结构,学习用的都非常简单,不会遇到复杂情况,而SQL使用的水平之一即是写出高效的SQL。 条条大路通罗马,在SQL更是如此,有时候你需要用很多union才能解决问题,别人一个select就能解决,这主要就是经验。 这一块是无法通过教与学了解的,没. 阅读详情

除了Java客户端外,Gaea还提供了C语言和.NET实现。


基本都是相同的,只是序列化/反序列化用C语言重新实现了。你可能会注意到一个特别的文件:Debug/conf/struct.conf ,这个文件曾经让我很迷惑。


实际上,gaea还提供了一个编译过的可执行文件FileScan,源代码位于src/structScan目录下,入口main被重命名为了mainY。


struct.conf就是通过FileScan按如下命令生成的,

FileScan -f 定义实体类的文件


FileScan.structScan扫描结构体定义文件,可识别struct、typedef定义。

结果保存到std::map<std::string, scanStructInfo*> structMap;

然后writeConfig保存到struct.conf中


产生的struct.conf每行一个结构体

ExceptionProtocol,-1300746967,32,0;fromIP,char,-139515017,16,1;errorCode,int,824862661,0,0;ErrorMsg,char,931829677,24,1;toIP,char,1461299386,8,1;

 

typedef struct {
	int errorCode;
	char *toIP;
	char *fromIP;
	char *ErrorMsg;
} ExceptionProtocol;

一行一个实体,第一个分号之4个字段,后面的都是5个字段。


读取格式:

fieldname

typeId

//非首跳过

offset

isPointer


Client执行流程

//GeeaClientTest

int main(int argc, char *argv[]) {
	GaeaClientTest *ha = new GaeaClientTest();
	std::string configFile="/项目路径/c-gaea/Debug/conf/gaea.config";
	std::string s1 = "//项目路径/c-gaea/Debug/conf/struct.conf";
	std::string logFile = "//项目路径/c-gaea/Debug/conf/gaea.log"
	gaea::GaeaClientConfig().init(configFile,s1,logFile);
	ha->NewsServiceTest();}
//首先加载配置以及实体类

gaea.config通过tinyxpath解析,然后注册实体类。

//structHelper.registerStruct
		sfi->typeId = atoi(c);
		key = malloc(sizeof(int));
		*key = sfi->typeId;

		//扫描字段
		while{
			byteArrayPutData(value, sfi, sfiSize);
			++cursor;
		}

		//注册结构体id -> 结构体信息
		objc_hash_add(&structInfoMap, key, value);


//客户端调用

ps->invoke("getNewsByCateID",NULL,0);


//构造RequestProtocol

//serviceProxy.
	RequestProtocol requestProtocol;
	requestProtocol.lookup = lookup;
	requestProtocol.methodName = methodName;
	requestProtocol.paraList = paraList;
	std::string sdpEntityType = "RequestProtocol";

	Protocol sendP(sid, config->getServiceId(), Request, UnCompress, GAEABinary, Java, &requestProtocol, sdpEntityType.c_str());

receiveP = server->request(sendP);

//server.request

         char*data = p.getBytes(dataLen);


//Protocol.getBytes

         char*sdpData = Serialize(sdpEntityType, sdpEntity, &serDataLen);


//序列化Protocol

	int typeId = GetTypeId(type);
	serializerInfo info = { outArray:&retArray, hashcode:1000, refObjArray:&refObjArray };

	serializer sr = getSerializer(typeId, obj); //函数指针
	sr(typeId, &info, obj); //提取typeId类型的obj对象信息,存到info中

//默认getSerilizer返回structSeralizer

	array *structInfo = objc_hash_value_for_key(structInfoMap, &typeId);

	for (i = 1; i < fieldLen; ++i) {
		newObj = obj + sfi->offset;
		if (sfi->isPointe == 1) {
			if (sfi->typeId == SERIALIZE_VOID_N) {
				t = *(int*) (obj + sfi->offset + sizeof(void*));
				sr = getSerializer(t, *(void**) newObj);
			} else {
				t = sfi->typeId;
				sr = getSerializer(sfi->typeId, *(void**) newObj);
			}
			if (sr != nullSerializer && sr != enumSerializer) {
				byteArrayPutData(info->outArray, &t, 4);
			}
			sr(t, info, *(void**) newObj);
		} else {
			sr = getSerializer(sfi->typeId, newObj);
			if (sr != nullSerializer && sr != enumSerializer) {
				byteArrayPutData(info->outArray, &sfi->typeId, 4);
			}
			sr(sfi->typeId, info, newObj);
		}
		++sfi;
	}

Sourcetrail实战:5分钟搞定MariaDB源码可视化分析(附compile_commands.json配置) 本文详细介绍了如何使用Sourcetrail代码分析工具快速可视化分析MariaDB源码。通过生成compile_commands.json配置文件和Sourcetrail项目设置,开发者可以高效构建代码地图,掌握继承关系可视化、函数调用链追踪等核心技巧,大幅提升大型C++项目的代码阅读效率。 阅读详情

相关推荐

Linux 安装Mysql8.0的读写分离,以及常用报错解决方式

Centos7.2 ,Mysql8.0主从配置和读写分离。主写从读 环境准备 系统: Centos7.2 Mysql版本: 8.0 搭建两台服务器,一台作为主服务器,一台作为从服务器。主服务器进行写操作。从服务器进行读操作 之前已经博文已经写过如何安装Mysql 8.0了。不会的可以去查看之前的博客 一、主从配置步骤 确保主数据库和从数据库的数据保持一样 二、主服务器上的操作 修改mysql配...

qq_40990836的博客 1675

Mysql 读写分离中间件(Gaea)

01 摘要 传统的MySql读写分离方案是通过在代码中根据SQL语句的类型动态切换数据源来实现的,那么有没有什么中间件可以自动实现读写分离呢?小米开源的数据库中间件Gaea就可以实现,接下来我们将详细讲解如何使用Gaea来实现MySql的读写分离。 02 Gaea简介 Gaea是小米中国区电商研发部研发的基于MySql协议的数据库中间件,目前在小米商城大陆和海外得到广泛使用,包括订单、社区、...

GIS摆渡人 4243

Java对接快递鸟,查询快递物流信息

根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递API接口,实现自动查询的功能。下面是java版本的根据单号查询物流跟踪信息的详细示例代码。只需要下载就可以运行,(自己需要简单的修改)注:登录快递鸟用户管理后台后获得。登录快递鸟用户管理后台。

Roc的博客 960

【MySQL】Gaea 数据库中间件实现 MySQL 读写分离

声明: 以下内容是学习macro作者的文章,作者原创文章链接:你还在代码里做读写分离么,试试这个中间件吧! 下面夹杂了我自己运行过程中的错误与心得,能运行成功 传统的MySql读写分离方案是通过在代码中根据SQL语句的类型动态切换数据源来实现的,那么有没有什么中间件可以自动实现读写分离呢?小米开源的数据库中间件Gaea就可以实现,接下来我们将详细讲解如何使用Gaea来实现MySql的读写分离。 1、Gaea简介 Gaea是小米中国区电商研发部研发的基于MySql协议的数据库中间件,目前在小米商城大陆

yuxiangdeming的博客 1470

Unreal5(虚幻五) 实现UI与C++代码逻辑的交互 保姆级教程

本人有Unity基础,刚学UE几天,把这一套处理流程记录一下备用。

qq_42915442的博客 9816

微信小程序 - error_msg:net::ERR_CONNECTION_RESET“(“errno“:600001,“errMsg“:“uploadFile:fail errcode:-101)

"errno":600001,"errMsg":"uploadFile:fail errcode:-101 cronet_error_code:-101 error_msg:net::ERR_CONNECTION_RESET"微信小程序,微信小程序wx.uploadFile报错,uniapp微信小程序uni.uploadFile上传文件报错,微信小程序调用wx.uploadFile返回错误ERR_CONNECTION_RESET,如何解决这个问题,上传图片出现报错,小程序上传视频报错,上传文件出现报错,如何

🏆 前端领域优质创作者 5415

Gaea源码阅读(一):使用

Gaea:58同城开源的中间层服务框架 https://github.com/58code/Gaea 中间件 Gaea是支持跨平台具有高并发、高性能、高可靠性,并提供异步、多协议、事件驱动的中间层服务框架。相对于其它重量级的中间件,比如淘宝的dubbo,Gaea只做一件事,因此没有过多的项目依赖。 在学校的时候学过CORBA,因此对中间件有所了解。在CORBA中,接口通过ID

m_vptr的专栏 5441

强化学习(Reinforcement Learning)与动态系统控制方法

一个具体的 RBC 的例子是自动驾驶汽车中的交通规则。在训练过程中,代理通过与环境交互获取奖励信号,并学习如何在某个状态下采取最佳的行动,以最大化长期的累积奖励。在化工过程中,通过对生产过程中的温度、压力、流量等参数的控制来实现产品的质量和产量的提高。需要注意的是,以上代码只是一个简单的示例,实际的 MPC 系统可能会更加复杂,并包含更多的模型预测和控制算法来实现更复杂的控制任务。需要注意的是,以上代码只是一个简单的示例,实际的自动驾驶汽车系统可能会更加复杂,并包含更多的规则和条件来确保安全行驶。

AI天才研究院 4064

Gaea学习--Gaea是什么?

为什么80%的码农都做不了架构师?>>> ...

weixin_34162228的博客 1071

SonarQube 完整手册(2026 最新)

摘要: SonarQube是一款静态代码分析(SAST)平台,支持20+语言(如Java/Go/Python),提供Bug、漏洞、代码异味等检测,集成DevOps流水线。其架构包含服务端、扫描器和SonarLint插件。2026年四大版本:免费社区版(基础功能)、开发者版(多分支/PR分析)、企业版(合规治理)、数据中心版(高可用集群)。核心功能包括质量门禁(QualityGate)、密钥泄露检测及六大质量指标。部署推荐Docker+PostgreSQL,扫描支持Maven/CLI方式。

SmallBull的博客 671

【数字孪生工业应用实战】第2篇:数字孪生系统架构设计与技术选型——从“作秀”到“实干”的骨架构建

本文系统剖析了数字孪生系统从“作秀”到“实干”的架构设计关键。针对多数项目在POC转生产时因架构混乱、选型盲目而失败的问题,深入阐述了四层分层架构(感知层、传输层、模型层、应用层)的设计原则,重点解析了感知层的异构适配与边缘预处理、传输层的异步解耦与多模式通信等工程细节。结合OPC UA、MQTT、EdgeX Foundry等主流技术选型对比,以及汽车焊装车间边缘智能网关的实战代码,提供了从零搭建微型孪生系统的完整指导。旨在帮助工程师建立清晰的选型决策逻辑,构建稳定、可演进的数字孪生“骨架”。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 267

Gaea学习--Gaea的高级使用

为什么80%的码农都做不了架构师?>>> ...

weixin_34095889的博客 804

Codex,Copilot 是什么

GitHub Copilot是什么 **GitHub Copilot** 是一款由 **GitHub** 和 **OpenAI** 合作开发的 **AI 代码辅助工具**,它基于 **OpenAI Codex 技术**,能够根据上下文自动生成代码建议,大幅提升编程效率

ZhangJiqun&191cm&85kg 6822

Gaea源码阅读(二):客户端流程

以GaeaClientTest为入口 GaeaInit.init("conf/gaea.config"); /** * 调用URL 格式:tcp://服务名//接口实现类 * 备注: * 服务名:需要与gaea.config中的服务名一一对应 * 接口实现类:具体调用接口的接口实现类 */ final String url = "tcp://d

m_vptr的专栏 2272

OTFS 消息传递算法信号检测【附matlab代码详解】

OTFS 消息传递算法方面的一些浅浅理解。

Cuby的博客 4012

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

mysql集群源码安装_MariaDB Galera Cluster集群企业版编译安装与配置

MariaDB Galera Cluster集群企业版编译安装与配置发布时间:2020-07-01 01:07:27来源:51CTO阅读:10013作者:zjcnew栏目:数据库安装环境系统:CentOS 6.8 x86_64软件:MariaDB 10.1.16节点一:192.168.11.132 4C 8GB节点二:192.168.11.133 4C 8GB软件获取访问MariaDB企业版下载地...

weixin_36021461的博客 697

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

世界读书日送你畅销好书!前所未有4折购书福利

为了回馈我们默默关注的粉丝朋友们,数据和云(ID:OraNews)特地联合出版社为大家谋取了大幅度的购书折扣,低至4折,另外本期将送出5本精美图书,欢迎小伙伴们参与此次活...

Enmotech的博客 382

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Gaea源码阅读(三):服务端启动流程

转载地址:http://blog.youkuaiyun.com/m_vptr/article/details/9163319 相对于客户端,服务器端工作就比较多了。服务器端需要load jar包,利用fliter实现方法级的权限控制 [java] view plain copy // load service config   log

waiwai4701 414

Gaea:小米基于 MySQL 协议的数据库中间件

项目介绍 Gaea 是小米商城/系统组研发的基于 MySQL 协议的数据库中间件,目前在小米商城大陆和海外得到广泛使用,包括订单、社区、活动等多个业务。 Gaea 支持分库分表、sql 路由、读写分离等基本特性,更多详细功能可以参照下面的功能列表。其中分库分表方案兼容了 mycat 和 kingshard 两个项目的路由方式。 Gaea 在设计、实现阶段参照了mycat、kingshard...

weixin_30929295的博客 419

高性能服务通信框架Gaea的详细实现--server请求处理流程

为什么80%的码农都做不了架构师?>>> ...

weixin_34267123的博客 376

Storm源码阅读(一):使用

Storm项目主页http://storm-project.net/,github主页https://github.com/nathanmarz/storm   storm源码是clojure和java的混合体   安装JRE Clojure 运行在 JRE (JAVA Runtime Environment) 之上,因此,你需要先安装 JRE。   安装lein Clojure项

m_vptr的专栏 2万+

ZooKeeper源码阅读(一):ZAB协议

A simple totally ordered broadcast protocol   causal relationship指的是同一个发送者发送的两个消息,或者leader改变前发送的消息和改变后发送的消息。   怎么保证casual order? 当重选Leader时,前一个Leader发送的消息先于当前Leader发送的消息。   Leader在开始broadcast之前

m_vptr的专栏 2万+

Argo源码阅读(一):Jetty

Argo:58同城开源的轻量级web框架 https://github.com/58code/Argo 作为仅有Java语言背景,从没接触过web容器,Spring、Servlet,tomcat、jetty的门外汉,我心中最大的疑惑是Argo是如何工作的? 附带的例子samples/hello-world,我找不到Main函数。从文档Readme中看到,运行就一条指令 mav

m_vptr的专栏 7684

ZooKeeper源码阅读(六):JUTE

JUTE是跨语言序列化/反序列化工具,类似Thrift 用于产生java/c版本的消息类

m_vptr的专栏 6949

ZooKeeper源码阅读(三):服务器端

服务端入口:org.apache.zookeeper.server.QuorumPeerMain.main (调用ZooKeeperServerMain.main)   运行参数:配置文件 如:QuorumPeerMain /opt/zookeeper/zookeeper-3.4.3/bin/../conf/zoo.cfg     读取配置文件        QuorumPeerC

m_vptr的专栏 6399
上一篇: Github搭建静态博客
下一篇: ZooKeeper源码阅读(一):ZAB协议
m_vptr
博客等级 码龄15年 69粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值