rpcx 官方技术博客

使用Redis做服务发现

Redis 是一个高性能的key/value数据库,和Memcached类似,但是它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis读写性能优异,又方便进行主从复制,横向扩展方便,在大厂中得到了广泛应用。微博曾部署了最大的redis节点,即使是现在,微博内部也部署了大量的Redis集群。

如果我们能把它作为服务发现的注册中心的话,可以利用它的高性能和容错机制,实现微服务部署中的服务发现功能。


阅读全文

使用 Rust 开发 rpcx 服务

当前,你可以使用GoJava开发原生的rpcx服务,也可以其它语言(C、C++、Python、C#、NodeJS等等)通过http或者JSON-RPC 2.0的方式访问rpcx服务。

现在, RPCX支持使用 Rust 编程语言实现原生的rpcx服务,也可以使用 Rust 通过原生的rpcx协议访问其它语言编写的rpcx服务。


阅读全文

什么,使用rpcx还可以上传下载大文件?

绝大部分的 rpc 框架是不支持上传下载文件的。第一个原因是普通的rpc服务框架不支持流式通讯,或者是伪流式通讯,在发送数据的时候,需要把数据全部加载到内存中,然后封装成byte数组放入的request和response中,这会占用大量的内存资源。试想你要上传一个10G的葫芦娃视频,如果把这个10G的数据全部读入到内存中,对系统的资源占用就太大了。

第二个原因,rpc框架的实现中,客户端和服务器端很多时候会建立一个连接或者几个连接,服务之间的调用会共享这些连接。如果在连接上传输巨大的文件数据,势必会影响其它的服务调用,严重影响服务的质量(吞吐和延迟)。

所以很多情况下客户端和服务器端是通过其它服务进行文件的上传和下载,但是还是有些用户提出这样的需求,希望借助单一的rpc框架,能提供文件的上传和下载,比如在物联网的项目中,一些设备需要到服务器拉取配置,或者需要将设备的一些累积的统计文件上传到服务器上。

鱼和熊掌如何兼得?rpcx采用了一个巧妙的实现,既避免了降低服务的质量,还可以客户端和服务器端之间传输大文件。


阅读全文

使用 rpcxdump 监控 rpcx服务的通讯

在很多时候,调试分布式应用并不是一件很容易的事情,异常情况除了和客户端/服务器端的代码实现有关,还和网络的传输有关,甚至在微博我们还曾遇到宇宙射线对服务器的影响。那么如何能更好地更便利的调试rpc服务呢。


阅读全文

实现 JSONRPC 2.0 协议

rpc实现方式有多种,一种是基于TCP/UDP的自定义的协议,还有一个基于http或者websocket的rpc实现方式。 基于http比较常用的是RESTful API的实现方式,还有一种是基于http的常用编码格式的通讯方式, 比如XML-RPC、JSON-RPC, grpc和twitchtv/twirp等。

虽然一般直接基于TCP的自定义协议的RPC框架可以取得更好的性能,但是基于http的rpc框架,比如RESTful API、JSON-RPC实现起来更简单,而且更容易的实现跨平台的服务提供和服务调用,所以也有很广泛的应用。

JSON-RPC 1.0于2005年发布了1.0的版本,经过数次演化,于2010年发布了最后一个2.0订正版本。

JSON-RPC所有的传输对象都是单一的类型,序列化成JSON格式。一个request就是对远程方法的一次调用,它必需包含三个属性:

  • method: 要调用的方法名
  • params: 对象或者数组,要传入的参数
  • id: 一个字符串、数字或者Null(不推荐)的ID,用来匹配request和response

一个response必需包括:

  • result: 返回结果,如果error不等于空,这个值必需为null
  • error: 一个错误编码。
  • id: 对应的request的id

阅读全文

rpcx 简史

2016年5月18日我提交了rpcx的第一段代码,那是一个基于标准rpc库的扩展,期望能够扩展rpc的功能,提供更多的服务治理的功能。

2016年初我的第一本技术书《Scala集合技术手册》出版了,这本书花费我太多的心血在编写和技术呈现上,但是我终于能腾出时间做点其它的事情。

正好,从Motorola出来后的创业公司被Comcast收购,Comcast的很多业务都是使用Go做开发的,虽然从03年到这个时候我还是使用Java开发,但是也在尝试使用Go做一些东西。一开始我对Go是有一定的误解的,首先对于它的非C风格的语法有些抵触,另外还认为它只能用来写一些小工具,根本没有意识到它的企业级应用的价值。随着慢慢地对它的熟悉,才渐渐感觉到它的强大,逐渐被它的简洁和并发编程所吸引,并且相信它是未来应用广阔的编程语言之一。

来到微博后就基本全时间的使用Go做开发,开发了服务发现和配置中心、消息队列、区块链、redis云服务等系统,越来越对Go语言有了更深的认识,也越来越喜欢上了这个简洁的开发语言。现在回过头来看2016年的一些探索,真是走对了方向。所以说, 2016年是rpcx的元年,5.18是它的诞生日。


阅读全文