Other

项目介绍

smallnest/rpcx 是一个托管在 GitHub 上的开源项目,主要使用 Go 编写,采用 Other 许可证,目前获得 8.3k 个 Star、1.2k 次 Fork。

仓库全名
smallnest/rpcx
开源许可证
Other
Star 数
8.3k
Fork 数
1.2k
未关闭 Issue
3

README 摘要

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-etcd zookeeper plugin has been moved to rpcx-zookeeper consul plugin has been moved to rpcx-consul redis plugin has been moved to rpcx-redis influxdb plugin has been moved to rpcx-plugins opentelemetry plugin has been…

完整内容见 GitHub 原始 README 或本页 。

常见问题

rpcx 用什么语言开发?

主要使用 Go 编写,采用 Other 许可证,目前有 8.3k 个 Star。

rpcx 可以免费商用吗?

仓库标注的许可证为 Other,商用前请先阅读仓库 LICENSE 文件确认授权范围。

如何获取 rpcx 的源码?

可以直接克隆仓库:git clone https://github.com/smallnest/rpcx.git,默认分支为 master;安装与运行步骤见仓库 README。

rpcx 最近还在维护吗?

仓库最近一次更新为 9月3日,当前有 3 个未关闭 Issue;Star 数为 8.3k,可作为社区活跃度的参考。

简要分析

热度分
10983
价值分
5374
活跃状态
活跃

语言占比

Go
Makefile
Thrift

Release

README

  • stable branch: v1.7.x
  • development branch: master

Official site: http://rpcx.io

License GoDoc github actions Go Report Card coveralls QQ3群

Notice: etcd

since rpcx 1.7.6, some plugins have been moved to the independent project:

Announce

Stable branch: v1.9.4

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
  • rdma: support the experimental RDMA transport (built on gordma’s rdmanet.Conn; requires libibverbs on Linux)

Which companies are using rpcx?

Features

rpcx is a RPC framework like Alibaba Dubbo and Weibo Motan.

rpcx is created for targets:

  1. Simple: easy to learn, easy to develop, easy to integrate and easy to deploy
  2. Performance: high performance (>= grpc-go)
  3. 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
  4. 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® Xeon® 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

ThroughputsMean LatencyP99 Latency

mock 10ms process time

ThroughputsMean LatencyP99 Latency

mock 30ms process time

ThroughputsMean LatencyP99 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)

Registering only selected methods

Register/RegisterName expose every suitable exported method of a struct as RPC. To expose only some of them, use RegisterWithMethods / RegisterNameWithMethods with a whitelist of method names:

    // Arith has exported methods Mul, Add and Sub, but only Mul/Add
    // should be callable remotely.
    s := server.NewServer()
	err := s.RegisterWithMethods(new(example.Arith), []string{"Mul", "Add"}, "")
	// err := s.RegisterNameWithMethods("Arith", new(example.Arith), []string{"Mul", "Add"}, "")
	s.Serve("tcp", addr)

Rules of the whitelist:

  • Whitelist only: methods not listed are not registered, so a newly added method stays private unless you opt it in.
  • Errors on bad names: a name that does not exist on the receiver, or that exists but is not a suitable RPC method, makes registration fail (the two cases give different error messages). Nothing is partially registered.
  • Empty whitelist errors: pass a non-empty list, or use Register / RegisterName to register all methods.

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

评论

暂无评论