Protocol Buffers

PHP使用 Google Protocol Buffers (protobuf)

给你一囗甜甜゛ 提交于 2020-08-18 19:49:09
很久之前,写PHP的时候,使用 Protobuf 做了聊天APP, 游戏服务器。 那个时候还用的是protobuf 2.5。 看了下proto3的语法,来测试下: 服务器环境 与 protoc 版本: # cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core) # protoc --version libprotoc 3.11.4 一、安装 PHP 的 Protocol Buffers 扩展: 1.1 默认安装最新版本: # pecl install protobuf 1.2 指定版本号安装: # pecl install protobuf-{VERSION} 1.3 查看扩展是否已安装: # php -m | grep protobuf protobuf 1.4 查看protobuf扩展的版本信息: # php --ri protobuf protobuf Version => 3.13.0 Directive => Local Value => Master Value protobuf.keep_descriptor_pool_after_request => 0 => 0 二、编写编译proto文件: 2.1 编写proto文件: # cat pack.proto syntax = "proto3"; //

为什么像王者荣耀这样的游戏 Server 不愿意使用微服务?

≯℡__Kan透↙ 提交于 2020-08-18 19:25:54
来源: zhihu.com/question/359630395/answer/954452799 背景介绍: hongjic93 是这样回答的: brice 是这样回答到: 今天在知乎上看到这样一个问题:"为什么游戏公司的server不愿意微服务化?" 背景介绍: “ 笔者最近去面试了家游戏公司。 最近面试了一家游戏公司(满大间的,有上市) 我问他,公司有没有做微服务架构的打算及考量? 他很惊讶的说,我没听说过微服务耶,你可以解释一下吗? 我大概说了,方便测试,方便维护,方便升级,服务之间松耦合,可多语言开发,自动扩容…之类的点 然后他说游戏server不太需要微服务,因为要求real time,做微服务会影响效能,分模组来开发就好了 我也不确定,但微服务不是趋势吗?特别是大公司,游戏server的服务应该很容易拆分吧? hongjic93 是这样回答的: 比如moba类游戏/王者荣耀/LOL,就看王者荣耀的客户端吧,想象一下。 账号系统,符文系统,英雄系统,皮肤系统,好友系统,好友之间messaging,这些都是常规操作,如果流量足够大,当然可以用微服务的架构去做。 不过这不是这个游戏的核心,核心是MOBA:Multiplayer online battle arena。特性是什么? 10个人之间各种游戏事件的高速多向通讯 streaming/broadcast

GRpc添加客户端的五种方式

孤者浪人 提交于 2020-08-18 13:16:37
随着微服务的发展,相信越来越多的.net人员也开始接触GRpc这门技术,大家生成GRpc客户端的方式也各不相同,今天给大家介绍一下依据Proto文件生成Rpc客户端的五种方式 前提:需要安装4个Nuget包 Google.Protobuf、Grpc、GRpc.Net.ClientFactory、GRpc.Tools VS安装命令如下 Install-Package Google.Protobuf Install-Package Grpc Install-Package GRpc.Net.ClientFactory Install-Package GRpc.Tools 准备工作 首先我们新建一个简单的.net core3.1类库 命名为:GRpc.Proto 然后添加HelloWord.Proto 添加一个简单的协议 syntax = "proto3"; import "google/protobuf/timestamp.proto"; option csharp_namespace = "HelloWordDemo"; package HelloWord; service HelloWord{ rpc SayHelloWord(SayHelloWordRequest) returns (SayHelloWordResponse); } message

深入分析序列化和反序列化原理,终于知道serialVersionUID到底有什么用了

情到浓时终转凉″ 提交于 2020-08-18 07:56:59
深入序列化和反序列化原理 一个问题引发的思考 什么是序列化和反序列化 为什么需要序列化 序列化的方式 Java序列化 serialVersionUID的作用 serialVersionUID的两种表现形式 Transient关键字 writeObject和readObject Java序列化特点 Java序列化的缺点 XML序列化 JSON序列化 常用三种序列化方式对比 其他序列化 序列化技术的选型 一个问题引发的思考 下面是一个简单的socket通信demo。 通信数据类: package com . zwx . serialize . demo ; public class SocketUser { public SocketUser ( String id , String name ) { this . id = id ; this . name = name ; } private String id ; private String name ; public String getId ( ) { return id ; } public void setId ( String id ) { this . id = id ; } public String getName ( ) { return name ; } public void setName (

Netty集成ProtoBuf开发私有协议

久未见 提交于 2020-08-18 06:26:46
Netty集成ProtoBuf开发私有协议 私有协议 广义上区分,通信协议可以分为公有协议和私有协议。由于私有协议的灵活性,它往往会在某个公司或者组织内部使用,按需定制,也因为如此,升级起来会非常方便,灵活性好。绝大多数的私有协议传输层都基于TCP/IP,所以利用Netty的NIO TCP协议栈可以非常方便地进行私有协议的定制和开发。 通信模型 (1) Netty协议栈客户端发送握手请求消息,携带节点ID等有效身份认证信息; (2) Netty 协议栈服务端对握手请求消息进行合法性校验,包括节点ID有效性校验、节点重复登录校验和IP地址合法性校验,校验通过后,返回登录成功的握手应答消息: (3)链路建立成功之后,客户端发送业务消息; (4)链路成功之后,服务端发送心跳消息; (5)链路建立成功之后,客户端发送心跳消息; (6)链路建立成功之后,服务端发送业务消息; (7)服务端退出时,服务端关闭连接,客户端感知对方关闭连接后,被动关闭客户端连接。 ProtoBuf数据格式 syntax = "proto3"; option java_package = "com.fy.protobuf"; option java_outer_classname="CustomMessageData"; message MessageData{ int64 length = 1; Content

旧 WCF 项目迁移到 asp.net core + gRPC 的尝试

被刻印的时光 ゝ 提交于 2020-08-18 06:26:00
一个月前,公司的运行WCF的windows服务器down掉了,由于 AWS 没有通知,没有能 第一时间 发现问题。 所以,客户提出将WCF服务由C#改为JAVA,在Linux上面运行;一方面,AWS对Linux有较多的监控措施,另一方面,假如出现问题,可以设置自动重启等服务。 老旧的WCF服务 目前WCF服务,主要提供windows桌面软件的 数据接口 ,应该有五六年的历史了。我进入公司后,WCF服务的代码,一直由我一个人来维护。存在很多 历史遗留问题 ,也有 不同版本 的共存。 如果java重写的话,其中的业务逻辑代码,难免会出现各种各样的bug,增加开发和测试的工作量。听说,要移植到linux服务上后,第一时间想到的就是 跨平台 的 .net core 。 .net core 经过了四年的发展,到目前的 3.1 LST版本,已经是 非常成熟 的跨平台解决方案了。 之后,我就在网上查找,有没有WCF的.net core 版本,查询到的信息总结如下: Core WCF不打算做WCF到.NET Core的100%兼容的移植; 对于新应用程序,WCF这种SOAP技术不建议使用; 对于老的应用程序,建议将这些保留在.NET Framework上; 如果您真的想将一个旧的应用程序迁移到.NET Core并且想继续使用WCF和WF, 社区的开源项目也是可以的

ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存

我们两清 提交于 2020-08-18 04:30:01
原文: ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存 前言 上篇博文 介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件。项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资源缓存和Session缓存。 如果你觉得对你有帮助的话,不妨点个【推荐】。 目录 Redis 介绍 asp.net core Session 介绍 Redis & Session 实例讲解 Session的使用 使用 Protobuf 给 Session添加扩展方法 Redis 介绍 下面是 Redis官网 的介绍: Redis is an open source (BSD licensed), in-memory data structure store, used as database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis

Netty 中的粘包和拆包

谁说我不能喝 提交于 2020-08-17 18:09:20
Netty 底层是基于 TCP 协议来处理网络数据传输。我们知道 TCP 协议是面向字节流的协议,数据像流水一样在网络中传输那何来 “包” 的概念呢? TCP是四层协议不负责数据逻辑的处理,但是数据在TCP层 “流” 的时候为了保证安全和节约效率会把 “流” 做一些分包处理,比如: 发送方约定了每次数据传输的最大包大小,超过该值的内容将会被拆分成两个包发送; 发送端 和 接收端 约定每次发送数据包长度并随着网络状况动态调整接收窗口大小,这里也会出现拆包的情况; Netty 本身是基于 TCP 协议做的处理,如果它不去对 “流” 进行处理,到底这个 “流” 从哪到哪才是完整的数据就是个迷。我们先来看在 TCP 协议中有哪些步骤可能会让 “流” 不完整或者是出现粘滞的可能。 1. TCP 中可能出现粘包/拆包的原因 数据流在TCP协议下传播,因为协议本身对于流有一些规则的限制,这些规则会导致当前对端接收到的数据包不完整,归结原因有下面三种情况: Socket 缓冲区与滑动窗口 MSS/MTU限制 Nagle算法 1. Socket缓冲区与滑动窗口 对于 TCP 协议而言,它传输数据是基于字节流传输的。应用层在传输数据时,实际上会先将数据写入到 TCP 套接字的缓冲区,当缓冲区被写满后,数据才会被写出去。每个TCP Socket 在内核中都有一个发送缓冲区(SO_SNDBUF

动手实现一个简单的 rpc 框架到入门 grpc (下)

a 夏天 提交于 2020-08-17 00:39:13
之前手动实现了一次简陋的 rpc 调用,为了简单使用了 json 编码信息,其实这是非常不可靠的,go 中 json 解析会有一些问题,比如整数会变成浮点数,而且 json 字符串比较占空间。 gRPC 由 google 开发,是一款语言中立、平台中立、开源的 RPC 框架,默认使用 protocol buffers 来序列化和传输消息,基于 http2。 protobuf Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。 先编写 proto 文件,再编译成 go 文件,新建 proto/hello.proto 文件 // proto/hello.proto syntax = "proto3"; package proto; message String { string value = 1; // 类型 字段 字段标识符 } // 定义服务 service HelloService { rpc Hello (String) returns (String); } 安装 protobuf 编译器用于编译 proto 文件,比如使用 scoop 安装 scoop install protobuf

GRpc添加客户端的五种方式

冷暖自知 提交于 2020-08-16 15:34:54
随着微服务的发展,相信越来越多的.net人员也开始接触GRpc这门技术,大家生成GRpc客户端的方式也各不相同,今天给大家介绍一下依据Proto文件生成Rpc客户端的五种方式 前提:需要安装4个Nuget包 Google.Protobuf、Grpc、GRpc.Net.ClientFactory、GRpc.Tools VS安装命令如下 Install-Package Google.Protobuf Install-Package Grpc Install-Package GRpc.Net.ClientFactory Install-Package GRpc.Tools 准备工作 首先我们新建一个简单的.net core3.1类库 命名为:GRpc.Proto 然后添加HelloWord.Proto 添加一个简单的协议 syntax = "proto3"; import "google/protobuf/timestamp.proto"; option csharp_namespace = "HelloWordDemo"; package HelloWord; service HelloWord{ rpc SayHelloWord(SayHelloWordRequest) returns (SayHelloWordResponse); } message