š rpcx - Awesome Go Library for Distributed Systems
Distributed pluggable RPC service framework like alibaba Dubbo.
Detailed Description of rpcx
- stable branch: v1.7.x
- development branch: master
Official site: http://rpcx.io
Notice: etcd
since rpcx 1.7.6, some plugins have been moved to the independent project:
etcd
plugin has been moved to rpcx-etcdzookeeper
plugin has been moved to rpcx-zookeeperconsul
plugin has been moved to rpcx-consulredis
plugin has been moved to rpcx-redisinfluxdb
plugin has been moved to rpcx-pluginsopentelemetry
plugin has been moved to rpcx-plugins
Announce
A tcpdump-like tool added: rpcxdumpć You can use it to debug communications between rpcx services and clients.
Cross-Languages
you can use other programming languages besides Go to access rpcx services.
- rpcx-gateway: You can write clients in any programming languages to call rpcx services via rpcx-gateway
- http invoke: you can use the same http requests to access rpcx gateway
- Java Services/Clients: You can use rpcx-java to implement/access rpcx services via raw protocol.
- rust rpcx: You can write rpcx services in rust by rpcx-rs
If you can write Go methods, you can also write rpc services. It is so easy to write rpc applications with rpcx.
Installation
install the basic features:
go get -v github.com/smallnest/rpcx/...
If you want to use quic
ćkcp
registry, use those tags to go get
ć go build
or go run
. For example, if you want to use all features, you can:
go get -v -tags "quic kcp" github.com/smallnest/rpcx/...
tags:
- quic: support quic transport
- kcp: support kcp transport
Which companies are using rpcx?
Features
rpcx is a RPC framework like Alibaba Dubbo and Weibo Motan.
rpcx is created for targets:
- Simple: easy to learn, easy to develop, easy to integrate and easy to deploy
- Performance: high performance (>= grpc-go)
- Cross-platform: support raw slice of bytes, JSON, Protobuf and MessagePack. Theoretically it can be used with java, php, python, c/c++, node.js, c# and other platforms
- Service discovery and service governance: support zookeeper, etcd and consul.
It contains below features
- Support raw Go functions. There's no need to define proto files.
- Pluggable. Features can be extended such as service discovery, tracing.
- Support TCP, HTTP, QUIC and KCP
- Support multiple codecs such as JSON, Protobuf, MessagePack and raw bytes.
- Service discovery. Support peer2peer, configured peers, zookeeper, etcd, consul and mDNS.
- Fault toleranceļ¼Failover, Failfast, Failtry.
- Load banlancingļ¼support Random, RoundRobin, Consistent hashing, Weighted, network quality and Geography.
- Support Compression.
- Support passing metadata.
- Support Authorization.
- Support heartbeat and one-way request.
- Other features: metrics, log, timeout, alias, circuit breaker.
- Support bidirectional communication.
- Support access via HTTP so you can write clients in any programming languages.
- Support API gateway.
- Support backup request, forking and broadcast.
rpcx uses a binary protocol and platform-independent, which means you can develop services in other languages such as Java, python, nodejs, and you can use other prorgramming languages to invoke services developed in Go.
There is a UI manager: rpcx-ui.
Performance
Test results show rpcx has better performance than other rpc framework except standard rpc lib.
The benchmark code is at rpcx-benchmark.
Listen to others, but test by yourself.
Test Environment
- CPU: Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz, 32 cores
- Memory: 32G
- Go: 1.9.0
- OS: CentOS 7 / 3.10.0-229.el7.x86_64
Use
- protobuf
- the client and the server on the same server
- 581 bytes payload
- 500/2000/5000 concurrent clients
- mock processing time: 0ms, 10ms and 30ms
Test Result
mock 0ms process time
Throughputs | Mean Latency | P99 Latency |
---|---|---|
mock 10ms process time
Throughputs | Mean Latency | P99 Latency |
---|---|---|
mock 30ms process time
Throughputs | Mean Latency | P99 Latency |
---|---|---|
Examples
You can find all examples at rpcxio/rpcx-examples.
The below is a simple example.
Server
// define example.Arith
ā¦ā¦
s := server.NewServer()
s.RegisterName("Arith", new(example.Arith), "")
s.Serve("tcp", addr)
Client
// prepare requests
ā¦ā¦
d, err := client.NewPeer2PeerDiscovery("tcp@"+addr, "")
xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption)
defer xclient.Close()
err = xclient.Call(context.Background(), "Mul", args, reply, nil)
Contributors
Contribute
see contributors.
Welcome to contribute:
- submit issues or requirements
- send PRs
- write projects to use rpcx
- write tutorials or articles to introduce rpcx
License
Apache License, Version 2.0