Protocol Buffers

rpc和http的区别

不打扰是莪最后的温柔 提交于 2020-04-17 13:14:49
【推荐阅读】微服务还能火多久?>>> 作者:知乎用户 链接:https://www.zhihu.com/question/41609070/answer/191965937 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 这个问题其实是有理解误区的,首先 http 和 rpc 并不是一个并行概念。 rpc是远端过程调用,其调用协议通常包含传输协议和编码协议。 传输协议包含: 如著名的 [gRPC]( grpc / grpc.io ) 使用的 http2 协议,也有如dubbo一类的自定义报文的tcp协议。 编码协议包含: 如基于文本编码的 xml json,也有二进制编码的 protobuf binpack 等。 因此我理解的你想问的问题应该是: 为什么要使用自定义 tcp 协议的 rpc 做后端进程通信? 要解决这个问题就应该搞清楚 http 使用的 tcp 协议,和我们自定义的 tcp 协议在报文上的区别。 首先要否认一点 http 协议相较于自定义tcp报文协议,增加的开销在于连接的建立与断开。http协议是支持连接池复用的,也就是建立一定数量的连接不断开,并不会频繁的创建和销毁连接。二一要说的是http也可以使用protobuf这种二进制编码协议对内容进行编码,因此二者最大的区别还是在传输协议上。 通用定义的http1

Go gRPC教程-服务端流式RPC(三)

谁都会走 提交于 2020-04-14 10:25:04
【推荐阅读】微服务还能火多久?>>> 前言 上一篇介绍了 简单模式RPC ,当数据量大或者需要不断传输数据时候,我们应该使用流式RPC,它允许我们边处理边传输数据。本篇先介绍 服务端流式RPC 。 服务端流式RPC :客户端发送请求到服务器,拿到一个流去读取返回的消息序列。 客户端读取返回的流,直到里面没有任何消息。 情景模拟:实时获取股票走势。 1.客户端要获取某原油股的实时走势,客户端发送一个请求 2.服务端实时返回该股票的走势 新建proto文件 新建server_stream.proto文件 1.定义发送信息 // 定义发送请求信息 message SimpleRequest{ // 定义发送的参数,采用驼峰命名方式,小写加下划线,如:student_name // 请求参数 string data = 1; } 2.定义接收信息 // 定义流式响应信息 message StreamResponse{ // 流式响应数据 string stream_value = 1; } 3.定义服务方式ListValue 服务端流式rpc,只要在响应数据前添加stream即可 // 定义我们的服务(可定义多个服务,每个服务可定义多个接口) service StreamServer{ // 服务端流式rpc,在响应数据前添加stream rpc ListValue

C#如何正确的做深拷贝

眉间皱痕 提交于 2020-04-14 08:25:11
【今日推荐】:为什么一到面试就懵逼!>>> 估计很多人在网上看到各种各样的DeepClone实现, 例如: 1. 通过BinaryFormatter进行二进制序列化  这玩意儿序列化出来的东西还带namespace类型, 尺寸非常大, 调试一下就知道极其不靠谱  有些人又开始动歪脑筋了, 说我搞一个JSON序列化, 或者BSON序列化可不可以 2. JSON/BSON序列化  本质问题还是一样的, Object => byte[] => Object, 中间产生的垃圾对象太多, 尤其是Stream那些 所以, 我们需要思考DeepClone的本质是啥! 如果现在有一个类A, 你自己手写一个Clone函数, 那么是不是可以做到效率最高? 答案是显然的, 我知道有什么成员, new一个对象分别赋值就行了. 但是如果这个类A成天改, 维护的成本就比较高昂, 万一哪天忘了改, 就会出现一些奇妙的BUG. 所以, 类A的Clone函数, 是一个重复性的工作. 所有重复性的工作, 都可以通过代码生成来搞. 那么会有很多代码生成的答案: 3. 写一个DSL编译器 不要嘲笑这种方式, protobuf在C++的实现里面, 就有一个原型工厂, 做的是类似的事情. C++里面没有反射只能通过这种方式, 只要把这些脏活累活交给编译器就可以了. 唯一不同的是, 这是编译前代码生成. 4.

一、什么是接口测试?

谁说我不能喝 提交于 2020-04-12 14:23:20
什么是接口测试? 接口测试是测试系统组件间接口的一种测试,接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点,测试的重点要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 接口测试场景: 手机app 客户端软件 web网站API:微信接口、新浪微博接口等等 公司内部系统API:订单接口需要调用用户资金接口查询余额。 软件架构模型: 服务器-客户端: 1:b/s:浏览器服务器模型,通过http协议、websocket协议等进行通讯。 2:c/s:客户端服务器模型。客户端:app、桌面软件 服务器内部: 服务器之间互相调用。 接口测试分类: 1:模块之间的接口:如订单模块下单时,需要去用户资金模块查询余额 2:系统对外部系统提供的接口 3:内部子系统的服务之间的接口 登录: 1:username=lixx&pwd=123456 2:json: {username:'lixx',pwd:'123456'} 3:xml: <root> <username value='lixx'>  <pwd value='123456'> </root> 4:自定义: 定长:lixx 123456 不定长:lixx123456 tcp/ip协议: http、https、websocket、json、xml webservice(soap/wsdll)

JProtobuf的使用

混江龙づ霸主 提交于 2020-04-11 15:51:28
1)什么是序列化和反序列化? (1)数据结构要存储,传送使用,数据结构,数据对象里面的内容-->编码-->二进制 (2)存入文件,网络发送 (3)使用: 根据这个数据重建这个对象,初始化这个对象的每个数据成员-->解码 例子: class{string uname; string upwd;} -->["uname" + [upwd]] 等你重建这个: new一个对象,你再从二进制里面将uname、upwd读出来 目的: 存入文件、网络传送 JSON: 对象的数据编码为JSON字符串(二进制),根据JSON字符串来解出我们的对象; XML: 对象的数据编码成XML, 解码根据XML来将新对象的数据初始化好; PROTOBUF: 二进制编码(不是人类可读的文本),编码解码更高效、安全、体积更小 2)Protobuf是什么? (1)二进制编码 class{string uname; string upwd;} [长度, 0xxx, 0xxx, 0xxx] 文本<uname>blake</uname> 因此自己要定义一个规则,谁是uname,谁是upwd 每个对象都要有一个这样的规则(编码解码的规则, 这个规则叫做协议, json、xml这些是通用的协议): 编码函数: 把uname放在第一位, upwd放在第二位--》【0xxx, 0xxx】 解码函数: 吧第一个作为uname

gRPC怎样节省您的开发时间

生来就可爱ヽ(ⅴ<●) 提交于 2020-04-11 12:08:25
感谢平台分享- http://bjbsair.com/2020-04-10/tech-info/53317.html 此时,您应该已经听说过" gRPC"(标题中至少一次)。 在本文中,我将着重介绍采用gRPC作为微服务之间的通信介质的好处。 首先,我将尝试简要介绍一下架构演变的历史。 其次,我将重点介绍使用REST(作为媒介)和可能出现的问题。 第三,gRPC启动。最后,我将以我的开发工作流程为例。 架构发展简史 本节将列出并讨论每种体系结构的优缺点(着重于基于Web的应用程序) 整体式 一切都在一个包中。 优点: · 容易上手 · 单一代码库可满足所有需求 缺点: · 难以扩展(部分) · 加载服务器(服务器端渲染) · 不良的用户体验(加载时间长) · 难以扩展的开发团队 Monolith architecture Inside monolith architecture Monolith v2(前端-后端) 前端逻辑和后端逻辑之间的清晰分隔。 后端仍然庞大。 优点: · 可以将团队分为前端和后端 · 更好的用户体验(客户端的前端逻辑(应用程序)) 缺点: · [仍然]难以扩展(部分) · [仍然]难以扩展的开发团队 Frontend-Backend architecture 微服务 每一件事物一项服务(包)。 使用网络在每个软件包之间进行通信。 优点: · 可扩展的组件 ·

Apollo 3.5 车辆配置方案

放肆的年华 提交于 2020-04-11 01:30:22
本文作者:HelloDeveloper Apollo 开放车辆的接口标准主要涉及到两大部分,即 线控系统 和 车辆系统 。Apollo 对这两者的功能指标、性能指标、安全指标进行一系列的约定并提出了相关标准。以常见的刹车和油门为例, Apollo 对这两者的控制精度、控制力度、系统的周期时间、响应时间都有着严格的规定。 线控系统 对指令越界保护和控制的处理等安全指标都有着明确约定以及标准化的要求。而 车辆系统 要求有相对稳定的CAN信号通道,同时对于车辆电源,包括电压、功率、最大波动、输出误差都有一系列的规定,以够保证在整个自动驾驶过程中电源输出稳定。 本文由 Apollo开发者社区认证布道师-阿渊 撰写,对 Apollo 3.5 车辆配置方案 进行了详细讲解,希望这篇文章给感兴趣的同学带来更多帮助。 以下,ENJOY 前言 最近在研究百度无人车 Apollo 的工厂模式及车辆配置方式,有一些小心得希望和大家一起分享。 Apollo车型配置方式 Apollo 无人驾驶平台支持 Lincoln MKZ、WEY VV6 等来自多个 OEM 的不同车型。 Apollo 兼容的开放车型,来源: http://apollo.auto/vehicle/certificate_cn.html 众所周知,各车厂车型的配置方式、接口、信号都各不相同。那么 Apollo 是如何兼容各个车型的呢

Apollo 3.5 车辆配置方案

牧云@^-^@ 提交于 2020-04-10 01:44:04
本文作者:HelloDeveloper Apollo 开放车辆的接口标准主要涉及到两大部分,即 线控系统 和 车辆系统 。Apollo 对这两者的功能指标、性能指标、安全指标进行一系列的约定并提出了相关标准。以常见的刹车和油门为例, Apollo 对这两者的控制精度、控制力度、系统的周期时间、响应时间都有着严格的规定。 线控系统 对指令越界保护和控制的处理等安全指标都有着明确约定以及标准化的要求。而 车辆系统 要求有相对稳定的CAN信号通道,同时对于车辆电源,包括电压、功率、最大波动、输出误差都有一系列的规定,以够保证在整个自动驾驶过程中电源输出稳定。 本文由 Apollo开发者社区认证布道师-阿渊 撰写,对 Apollo 3.5 车辆配置方案 进行了详细讲解,希望这篇文章给感兴趣的同学带来更多帮助。 以下,ENJOY 前言 最近在研究百度无人车 Apollo 的工厂模式及车辆配置方式,有一些小心得希望和大家一起分享。 Apollo车型配置方式 Apollo 无人驾驶平台支持 Lincoln MKZ、WEY VV6 等来自多个 OEM 的不同车型。 Apollo 兼容的开放车型,来源: http://apollo.auto/vehicle/certificate_cn.html 众所周知,各车厂车型的配置方式、接口、信号都各不相同。那么 Apollo 是如何兼容各个车型的呢

.NET Core ❤ gRPC

拜拜、爱过 提交于 2020-04-08 21:11:02
这篇内容主要来自Microsoft .NET团队程序经理Sourabh Shirhatti的博客文章: https://grpc.io/blog/grpc-on-dotnetcore/ , .NET Core 3.0现已提供grpc的.NET 托管实现 grpc-dotnet, gRpc 取代WCF成为 .NET的一等公民。自2018年11月以来,Microsoft的.NET团队一直与gRPC团队密切合作,共同开发适用于.NET Core的gRPC的全新完全托管实现。 gRpc 有非常多的公司在使用,比如 Salesforce,Netflix,Spotify,Fanatics等公司(当然还有Google),特别是整个CNCF 主导下的云原生应用开发生态里gRpc 有着举足轻重的地位。 .NET目前有两种正式的gRPC实现: Grpc.Core :基于本地gRpc Core库的原生 gRpc C#实现,支持.NET Core 2.1/.NET Framework 4.5+/Mono 4+ 。 grpc-dotnet :完全以C#编写的新实现,没有任何本机依赖性,并且基于最新发布的.NET Core 3.0。 这两种实现并排共存,并且在可用功能,集成,支持的平台,成熟度和性能方面各有各的优势。两种实现共享用于调用和处理RPC的相同API,用户能够选择最能满足其需求的实现