rpcx 官方技术博客

方便的监控rpcx服务指标

log、metrics、trace是我们观测和监控微服务的三大法宝,而对于metrics,我们尝尝采集服务的指标,把它们推送到Prometheus、InfluxDB等时序数据库中,并使用Grafana展示出来。


阅读全文

细说 XClient 的那些方法

继续我们的rpcx挖掘宝藏之旅,这次我们来看看XClient的哪些方法,以及它们的作用。


阅读全文

啥是Oneshot?

Oneshot在英文中是“一击”或“一枪”的意思, 形容词的意思是“一次性的”,名词的意思是“一次性用品”,在Rust生态圈中尝尝用作一次性使用的并发原语,在Go生态圈中很少使用。

这次我把Oneshot的概念引入到微服务框架里面,用来指代客户端对服务器一次性的调用,不需要等待服务器的返回。


阅读全文

rpcx 支持 grpc 啦!

毫无疑问,rpcx是当前最流行的Go生态圈的微服务框架之一,很多大厂和创业公司都在使用,并且服务端无需额外配置,rpcx也同时支持HTTP调用,这样其它编程语言都可以调用rpcx服务,但是大家还是一直念叨,能不能通过grpc调用rpcx服务,因为毕竟,很多大厂中很多使用Java、C++的同学,比较熟悉grpc,一时半会很难转换到Go生态圈中来。

虽然,grpc的服务和rpcx的服务都很类似,需要请求(Request)和响应(Response),并且第一个参数页都是Context,但是rpcx的服务签名风格是和Go标准库中的rpc库的风格类似,响应(Response)是作为返回值返回的,也就是说,两者的服务不能直接拿回来使用,需要做一点点小小的转换。


阅读全文

rpcx支持websocket协议了

当前, rpcx支持tcp、kcp、quic、unix domain、http、jsonrpc 2.0等传输协议,并没有考虑websocket的支持,原因在于考虑到微服务更多的是企业内部服务之间的通讯,不太可能暴露给浏览器,企业内部大多采用tcp的方式传输,或者udp族(kcp、quic)方式的传输,但是还是有用户提出希望能支持websocket。

我想websocket可能还是会有一些场景下使用,比如游戏开发,移动端核服务端的通讯等等,所以经过慎重考虑,我决定在 rpcx 1.6.2版本中增加对websocket的支持。


阅读全文

[转]Golang之微服务发现为什么更新不了?

rpcx在学而思公司得到了广泛的应用,看看他们在使用rpcx和zookeeper的过程中发现的服务无法发现的问题。

线上环境微服务发现为什么更新不了?本文通过tcpdump分析微服务与zookeeper的数据交互;结合代码review,寻找服务发现框架可能出现的异常。需要特别注意zookeeper监听是一次性的;而Golang并发问题也很容易被忽视。


阅读全文

基于protobuf快速生成服务治理的RPC代码

rpcx是一个流行的Go语言实现的服务治理的框架,只要你简单会写Go的函数,你就能实现带服务治理的RPC服务,超级简单,比如下面的加法服务:

1
2
3
4
5
type Arith struct {}

func (a *Arith) Add(ctx context.Context, args int, reply *int) error {
    *reply = args + 100
}

但是,很多情况下,尤其在大型互联网公司中,常用Protobufproto文件定义数据类型(Message)和(Service),这样做有一个好处,就是方便部门和部门、服务提供者和服务使用者之间沟通,通过 IDL 文件的方式更能精准的描述服务和数据类型。

比如下面的helloworld.proto,定义一个打招呼的服务(Greeter), 这个服务使用HelloRequestHelloResponse做请求参数和返回结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
syntax = "proto3";

option go_package = "helloword";

package helloworld;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

rpcx的用户也不止一次的提出希望rpcx也能支持从proto生成rpcx服务端和客户端的代码,现在可以宣布了,rpcxio组织提供了两个protoc的插件,可以方便的生成Go代码,和grpc插件的使用姿势一样:

  • protoc-gen-rpcx:基于官方的grpc插件,生成标准的protobuf GO类型和rpcx代码
  • protoc-gen-gogorpcx: 基于 gogo/protobuf的插件,可以生成性能更加优异、更多辅助代码的Go代码和rpcx代码

下面就介绍这两种工具的实现。


阅读全文

分布式ID生成服务

不管我们是不是有身份的人,我们一定是有身份证的人,身份证上面的号码就是我们的ID,理论上这个ID是全国唯一的,而且通过这个号码,我们还可以得到一些个人信息,比如前两位可以确定我们第一次申请身份证的时候所在的省份、接下来的四位可以确定我们所在的区县,然后还可以知道我们出生的年月以及性别。

在我们的计算机应用中,也处处存在的ID, 比如订单编号、商品ID、微博ID、微信消息ID、书的ISDN号、商品条码等等。通过ID,可以迅速定位到对象实体、为对象之间建立关联、跟踪对象在不同服务之间的流转等等。

有的ID是无意义的唯一的标识,有的ID还能提供额外的信息,比如时间和机房信息等等。为了确保唯一性,有的ID使用很长的字节数,比如256个字节,有的通过递增的long类型,只需要8个字节来表示。考虑到存储、信息包含量、性能、安全等因素,一个好的ID的设计至关重要。

介绍ID生成和分布式的方案的文章已经非常非常多了,比如文末中的参考资料中的文章,所以我在本文中简洁的汇总各个方案的优缺点,然后介绍一个分布式的ID生成器项目rpcxio/did,它可以实现单节点百万级的ID生成。


阅读全文

查看rpcx服务器定义的所有服务以及它们的定义

追溯到一二十年前,大家还在使用SOA的时候,访问一个服务后缀加上?wsdl会得到webservice的WSDL定义,用以描述webservice服务。 现在grpc也增加了Reflection机制,用以描述grpc服务的元数据。

现在 rpcx 宣布也提供了 Reflection 的机制,用以提供服务端注册的服务的元数据信息。


阅读全文

rpcx在马蜂窝即时通讯领域的实践

即时通讯(IM)功能对于电商平台来说非常重要,特别是旅游电商。国内知名厂商马蜂窝在重构他们的IM应用的过程中,采用rpcx作为他们的服务层的rpc通讯,取得了不错的性能和可用性。


阅读全文