Protocol Buffers

protobuf DebugString 引起的 异常

断了今生、忘了曾经 提交于 2020-11-05 04:13:47
protobuf DebugString 引起的 异常 引用 参考了 下面两个链接,感谢原作者 https://stackoverflow.com/questions/62213892/protobuf-shortdebugstring-crash https://github.com/protocolbuffers/protobuf/issues/4958 https://stackoverflow.com/questions/51584960/stdcall-once-throws-stdsystem-error-unknown-error-1 现象 #0 0x00007f9bfc4afb20 in __cxa_throw () from /lib64/libstdc++.so.6 #1 0x00007f9bfc504e30 in std::__throw_system_error(int) () from /lib64/libstdc++.so.6 #2 0x00007f9bf8c29ed2 in call_once<void (&)(google::protobuf::internal::AssignDescriptorsTable const*), google::protobuf::internal::AssignDescriptorsTable*&> ( __f=

序列化和反序列化

☆樱花仙子☆ 提交于 2020-10-28 10:19:45
#摘要 序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没在框架之中;另一方面,它们会以其他更容易理解的概念出现,例如加密、持久化。然而,序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式、大数据量系统设计里面更为显著。恰当的序列化协议不仅可以提高系统的通用性、强健性、安全性、优化系统性能,而且会让系统更加易于调试、便于扩展。本文从多个角度去分析和讲解“序列化和反序列化”,并对比了当前流行的几种序列化协议,期望对读者做序列化选型有所帮助。 简介 文章作者服务于美团推荐与个性化组,该组致力于为美团用户提供每天billion级别的高质量个性化推荐以及排序服务。从Terabyte级别的用户行为数据,到Gigabyte级别的Deal/Poi数据;从对实时性要求毫秒以内的用户实时地理位置数据,到定期后台job数据,推荐与重排序系统需要多种类型的数据服务。推荐与重排序系统客户包括各种内部服务、美团客户端、美团网站。为了提供高质量的数据服务,为了实现与上下游各系统进行良好的对接,序列化和反序列化的选型往往是我们做系统设计的一个重要考虑因素。 本文内容按如下方式组织: 第一部分给出了序列化和反序列化的定义,以及其在通讯协议中所处的位置。 第二部分从使用者的角度探讨了序列化协议的一些特性。

Dubbo3.0

我与影子孤独终老i 提交于 2020-10-28 03:50:41
作者 | 郭浩(项升) 阿里巴巴经济体 RPC 框架负责人 导读: 本文整理自作者于 2020 年云原生微服务大会上的分享《Dubbo3.0 - 开启下一代云原生微服务》,主要介绍了关于思考 rpc 框架层面,功能演进的方向是什么?以及怎么更好地支持云上的多语言开发的新思考。 看 到这个题目,大家可能会有几个问题,比如,什么是云原生微服务?Dubbo3.0 是什么?和目前的 Dubbo2.0 有什么区别?用了 Dubbo3.0 会带来哪些业务视角的好处? 后面的分享会对这些问题逐一解答。 这次分享分为以下几个环节: Dubbo 的演进历史 Dubbo 的开源现状 定义 Dubbo3.0 分享 Dubbo 3.0 目前取得的一些成果 考虑到有些同学对 Dubbo 可能不太熟悉,在介绍背景之前,我先简单介绍一下 Dubbo 是什么。简单地说,Dubbo 是基于 Java 的 RPC 框架。一个 RPC 框架至少由数据格式、传输协议和连接管理组成,这三点也是构成核心。Dubbo 能够被广泛应用主要有两个原因: 一方面是较好的插件机制支撑了多种扩展,这些扩展在不同业务场景和基础架构中能分别发挥最大优势; 另一方面不同于普通的 RPC 框架,Dubbo 的服务治理功能让其在易用性方面脱颖而出,比如路由规则能够支持灵活多样的运行时动态路由,可以基于此功能实现灰度、ABTest、流量回放等功能。

TiDB 在北京银行交易场景中的应用实践

不打扰是莪最后的温柔 提交于 2020-10-21 14:13:28
作者介绍:陈振东,北京银行软件开发部 北京银行是一家城市商业银行,公司价值位列中国区域性发展银行的首位,依托于中国经济的大环境,北京银行的资产总量在全球千家大银行中名列第 61 位,连续六年跻身全球银行业百强。北京银行积极开辟多元化的业务经营,例如北京地区的社保缴纳和医保代发,都是由北京银行在提供服务,在你入职一家公司的时候,收到的医保折子就是来自北京银行。 业务转型驱动分布式架构建设 由于快速的业务发展需求,北京银行在业务转型中对系统架构进行了升级,逐渐向分布式架构进行转移。早在 2016 年,北京银行就开始了对分布式数据库的探索,并于 2018 年正式投产上线了 TiDB 分布式数据库,当时在业内还没有一个比较完善与成熟的体系,我们也是根据银行的安全合规需求建设了两地三中心的部署方案。 如上图所示,在两地三中心部署了 TiDB 分布式数据库集群,采用主从的多活架构,主集群作为生产集群承担日常的生产服务,从集群是建设在西安的异地灾备中心,主从之间是用 Kafka 同步 Binlog 形式进行数据的同步。 在这两年的建设过程中,北京银行与 PingCAP 进行专项的深度合作,这里简单介绍三个方面: 两地三中心 :在两地三中心的部署方案中,异地中心的网络延时会对整个集群的性能产生较大影响,我们在这层面上对 gRPC 的消息格式进行了压缩,同时利用 Multi-Raft

Go语言初探gRPC服务

混江龙づ霸主 提交于 2020-10-18 06:33:39
原文链接: https://www.jianshu.com/p/20ed82218163 环境:2018-05-12 protoc 3.5.1 go1.10.1 windows gRPC: Google主导开发的RPC框架,这里不再赘述。 准备工作 先安装Protobuf 编译器 protoc,下载地址: https://github.com/google/protobuf/releases 我的是windows,将压缩包bin目录下的exe放到环境PATH目录中即可。 然后获取插件支持库 // gRPC运行时接口编解码支持库 go get -u github.com/golang/protobuf/proto // 从 Proto文件(gRPC接口描述文件) 生成 go文件 的编译器插件 go get -u github.com/golang/protobuf/protoc-gen-go 获取go的gRPC包(网络问题可参阅 https://www.jianshu.com/p/6392cb9dc38f ) go get google.golang.org/grpc 接口文件 /src/ 新建 test.proto 示例: syntax = "proto3"; // 定义包名 package test; // 可以定义多个服务,每个服务内可以定义多个接口 service

stm32与linux通过protobuf打包数据并进行通信

这一生的挚爱 提交于 2020-10-14 05:56:38
一、利用protobuf通信原理 最近项目中需要用到stm32与Orange Pi(移植了linux)进行数据交互,H6端是用C++编写的串口底层驱动,与stm32的串口连接并通信。串口间的通信协议定为采用protobuf打包数据并通过串口发出的形式, 即发送端编码数据并序列化成数组通过串口发出,接收端接收到一帧数据,进行解码并解析数据。 二、 移植protobuf(nanopb-0.3.8)到stm32工程 protobuf是一种打包数据的工具,和JSON打包数据的作用是一样的。在C++下用protobuf传递数据,要先写一个.proto文件,然后在linux环境下编译该文件,或者直接放在CMake里面编译,便可以生成出来一个类(.cpp 和 .h),利用protobuf打包便是打包这个类。 可以理解成把这个类的所有数据加上帧头帧尾帧校验,然后通过串口,网络等通信格式将数据发送出去,这个过程称为序列化。解包就是把收到序列化的数据反序列化,然后把有效数据放入生成的类中。 一般开发stm32的环境是在Windows下,基于Keil开发,要通过.proto文件生成结构体(.c和.h)需要下载一个官方protobuf的轮子,然后在命令行下编译即可生成我们需要的结构体文件。这个轮子的下载地址放在文末。 三、编写.proto文件 编写.proto文件很简单,开头先写protobuf的版本号

BeetleX之TCP消息通讯Protobuf/TLS

我是研究僧i 提交于 2020-10-10 22:47:01
在网络通讯应用中直接操作数据流是比较繁琐的事情,毕竟在业务层面处理的都是对象化消息;为了让网络数据操作变得更友好直观,一般都会引用序列化组件来处理网络流和对象之前的转换工作;在这里介绍组件如何使能Protobuf进行数据交互通讯。 协议定义 组件使用对象处理就不同之前HelloWorld示例一样简单操作流就可以,在这里需要进一步封装一个简单的应用协议。 |-----------------------------------------------------------------| |0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7 | |----------------------------------------------------------------| |Probobuf数据流长度,占4字节 | |----------------------------------------------------------------| |Protobuf数据流 | |----------------------------------------------------------------| 以上是一个简单的应用协议,消息头4字节描述消息的长度

今儿一个早起,整理了一波百度开源的 Java 项目,哎哟有点东西..

断了今生、忘了曾经 提交于 2020-10-09 04:38:37
1. Disconf 2. UidGenerator 3. BRPC-Java 4. Spring Cloud Formula 5. JProtobuf 6. Jprotobuf-rpc-socket 7. BI 平台 BiPlatform 今儿 7 点一大早,早起群的死变态已经纷纷打卡起来学习了。 菜逼互啄群 吓得艿艿这个小帅胖,翻了一圈“年轮”,赶紧起来 = =。 点了一套煎饼果子,看到《百度开源的 71 款项目》文章,于是乎去百度的 https://github.com/baidu 愁一愁有哪些和 Java 相关的,还是有点东东的。。。 1. 分布式配置管理平台 Disconf https://github.com/knightliao/disconf Distributed ConfigurationManagement Platform(分布式配置管理平台)专注于各种 分布式系统配置管理 的通用组件/通用平台, 提供统一的配置管理服务。 目前已经不维护,建议采用 Apollo 或者 Nacos 作为配置中心。 2. 分布式 ID 生成器 UidGenerator https://github.com/baidu/uid-generator UidGenerator 是Java实现的, 基于Snowflake算法的唯一ID生成器。 UidGenerator

nanopb

倾然丶 夕夏残阳落幕 提交于 2020-10-07 04:54:49
目录 关于Protocol Buffers 编译工具安装 Nanopb 遇到的问题 问题1:make失败 问题2:grpcio-tools下载超时中断 问题3: make失败 关于Protocol Buffers Protocol Buffers是Google开发的用于序列化数据的机制,它无关开发语言,无关使用平台,且具有良好的可扩展性。 使用Protocol Buffers,你只需要把你的数据定义为结构化的protocol buffer数据,然后使用 编译工具 把它编译成特定语言下的代码,调用编译后的代码接口,你就能很方便地将你的结构数据写成数据流(编码),或是将数据流读取为你的结构数据(解码)。 目前Protocol buffers可支持的生成语言有Java,Python, Object-c, 以及C++, proto3版本还新增了Dart,Go, Ruby, C#。 编译工具安装 这里说的编译工具是指编译.proto文件,即protocol compiler(protoc) 首先,安装并选择默认python版本: sudo apt-get install python//系统自带的python脚本,18.04上自带版本仍然是2.7.15~rc1-1) //https://www.runoob.com/python3/python3-install.html 安装python3

golang简单使用gRPC

自闭症网瘾萝莉.ら 提交于 2020-10-05 09:14:26
一. 环境准备。 安装 gprc 。 go get - u google . golang . org / grpc 安装 protocol buffers 。 下载地址: https://github.com/protocolbuffers/protobuf/releases 下载解压后放入PATH路径下 二. 实现服务端。 新建 account.proto 文件。 syntax = "proto3" ; // 定义包名 package account ; // 可以定义多个服务,每个服务内可以定义多个接口 service Waiter { // 定义接口 (结构体可以复用) // 方法 (请求消息结构体) returns (返回消息结构体) {} //注册 rpc Register ( RegisterReq ) returns ( RegisterRes ) { } //登录 rpc Login ( LoginReq ) returns ( LoginRes ) { } } // 定义 Req 消息结构 //注册请求参数 message RegisterReq { // 类型 字段 = 标识号 string username = 1 ; //账号 string password = 2 ; //密码 } //登录请求参数 message LoginReq { // 类型 字段