log、metrics、trace是我们观测和监控微服务的三大法宝,而对于metrics,我们尝尝采集服务的指标,把它们推送到Prometheus、InfluxDB等时序数据库中,并使用Grafana展示出来。
阅读全文
rpcx 官方技术博客
log、metrics、trace是我们观测和监控微服务的三大法宝,而对于metrics,我们尝尝采集服务的指标,把它们推送到Prometheus、InfluxDB等时序数据库中,并使用Grafana展示出来。
Oneshot在英文中是“一击”或“一枪”的意思, 形容词的意思是“一次性的”,名词的意思是“一次性用品”,在Rust生态圈中尝尝用作一次性使用的并发原语,在Go生态圈中很少使用。
这次我把Oneshot
的概念引入到微服务框架里面,用来指代客户端对服务器一次性的调用,不需要等待服务器的返回。
毫无疑问,rpcx是当前最流行的Go生态圈的微服务框架之一,很多大厂和创业公司都在使用,并且服务端无需额外配置,rpcx也同时支持HTTP调用,这样其它编程语言都可以调用rpcx服务,但是大家还是一直念叨,能不能通过grpc调用rpcx服务,因为毕竟,很多大厂中很多使用Java、C++的同学,比较熟悉grpc,一时半会很难转换到Go生态圈中来。
虽然,grpc的服务和rpcx的服务都很类似,需要请求(Request)和响应(Response),并且第一个参数页都是Context,但是rpcx的服务签名风格是和Go标准库中的rpc库的风格类似,响应(Response)是作为返回值返回的,也就是说,两者的服务不能直接拿回来使用,需要做一点点小小的转换。
当前, rpcx支持tcp、kcp、quic、unix domain、http、jsonrpc 2.0等传输协议,并没有考虑websocket的支持,原因在于考虑到微服务更多的是企业内部服务之间的通讯,不太可能暴露给浏览器,企业内部大多采用tcp的方式传输,或者udp族(kcp、quic)方式的传输,但是还是有用户提出希望能支持websocket。
我想websocket可能还是会有一些场景下使用,比如游戏开发,移动端核服务端的通讯等等,所以经过慎重考虑,我决定在 rpcx 1.6.2版本中增加对websocket的支持。
rpcx在学而思公司得到了广泛的应用,看看他们在使用rpcx和zookeeper的过程中发现的服务无法发现的问题。
线上环境微服务发现为什么更新不了?本文通过tcpdump分析微服务与zookeeper的数据交互;结合代码review,寻找服务发现框架可能出现的异常。需要特别注意zookeeper监听是一次性的;而Golang并发问题也很容易被忽视。
rpcx是一个流行的Go语言实现的服务治理的框架,只要你简单会写Go的函数,你就能实现带服务治理的RPC服务,超级简单,比如下面的加法服务:
|
|
但是,很多情况下,尤其在大型互联网公司中,常用Protobuf
的proto
文件定义数据类型(Message
)和(Service
),这样做有一个好处,就是方便部门和部门、服务提供者和服务使用者之间沟通,通过 IDL 文件的方式更能精准的描述服务和数据类型。
比如下面的helloworld.proto
,定义一个打招呼的服务(Greeter
), 这个服务使用HelloRequest
和HelloResponse
做请求参数和返回结果:
|
|
rpcx的用户也不止一次的提出希望rpcx也能支持从proto生成rpcx服务端和客户端的代码,现在可以宣布了,rpcxio组织提供了两个protoc的插件,可以方便的生成Go代码,和grpc插件的使用姿势一样:
下面就介绍这两种工具的实现。
不管我们是不是有身份的人,我们一定是有身份证的人,身份证上面的号码就是我们的ID,理论上这个ID是全国唯一的,而且通过这个号码,我们还可以得到一些个人信息,比如前两位可以确定我们第一次申请身份证的时候所在的省份、接下来的四位可以确定我们所在的区县,然后还可以知道我们出生的年月以及性别。
在我们的计算机应用中,也处处存在的ID, 比如订单编号、商品ID、微博ID、微信消息ID、书的ISDN号、商品条码等等。通过ID,可以迅速定位到对象实体、为对象之间建立关联、跟踪对象在不同服务之间的流转等等。
有的ID是无意义的唯一的标识,有的ID还能提供额外的信息,比如时间和机房信息等等。为了确保唯一性,有的ID使用很长的字节数,比如256个字节,有的通过递增的long类型,只需要8个字节来表示。考虑到存储、信息包含量、性能、安全等因素,一个好的ID的设计至关重要。
介绍ID生成和分布式的方案的文章已经非常非常多了,比如文末中的参考资料中的文章,所以我在本文中简洁的汇总各个方案的优缺点,然后介绍一个分布式的ID生成器项目rpcxio/did,它可以实现单节点百万级的ID生成。
追溯到一二十年前,大家还在使用SOA
的时候,访问一个服务后缀加上?wsdl
会得到webservice的WSDL定义,用以描述webservice服务。 现在grpc也增加了Reflection机制,用以描述grpc服务的元数据。
现在 rpcx 宣布也提供了 Reflection 的机制,用以提供服务端注册的服务的元数据信息。