Retour au classement

google/tarpc

Rust

An RPC framework for Rust with a focus on ease of use.

rpc-frameworkasynchronous-programmingtokiorustfutures
Croissance des étoiles
Étoiles
3.7k
Forks
228
Croissance hebdomadaire
Issues
44
1k2k3k
févr. 2016juil. 2019janv. 2023juil. 2026
Artefactscrates.iocargo add tarpc
README

Crates.io MIT licensed Build status Discord chat

tarpc

Disclaimer: This is not an official Google product.

tarpc is an RPC framework for rust with a focus on ease of use. Defining a service can be done in just a few lines of code, and most of the boilerplate of writing a server is taken care of for you.

Documentation

What is an RPC framework?

"RPC" stands for "Remote Procedure Call," a function call where the work of producing the return value is being done somewhere else. When an rpc function is invoked, behind the scenes the function contacts some other process somewhere and asks them to evaluate the function instead. The original function then returns the value produced by the other process.

RPC frameworks are a fundamental building block of most microservices-oriented architectures. Two well-known ones are gRPC and Cap'n Proto.

tarpc differentiates itself from other RPC frameworks by defining the schema in code, rather than in a separate language such as .proto. This means there's no separate compilation process, and no context switching between different languages.

Some other features of tarpc:

  • Pluggable transport: any type implementing Stream<Item = Request> + Sink<Response> can be used as a transport to connect the client and server.
  • Send + 'static optional: if the transport doesn't require it, neither does tarpc!
  • Cascading cancellation: dropping a request will send a cancellation message to the server. The server will cease any unfinished work on the request, subsequently cancelling any of its own requests, repeating for the entire chain of transitive dependencies.
  • Configurable deadlines and deadline propagation: request deadlines default to 10s if unspecified. The server will automatically cease work when the deadline has passed. Any requests sent by the server that use the request context will propagate the request deadline. For example, if a server is handling a request with a 10s deadline, does 2s of work, then sends a request to another server, that server will see an 8s deadline.
  • Distributed tracing: tarpc is instrumented with tracing primitives extended with OpenTelemetry traces. Using a compatible tracing subscriber like Jaeger, each RPC can be traced through the client, server, and other dependencies downstream of the server. Even for applications not connected to a distributed tracing collector, the instrumentation can also be ingested by regular loggers like env_logger.
  • Serde serialization: enabling the serde1 Cargo feature will make service requests and responses Serialize + Deserialize. It's entirely optional, though: in-memory transports can be used, as well, so the price of serialization doesn't have to be paid when it's not needed.

Usage

Add to your Cargo.toml dependencies:

tarpc = "0.37"

The tarpc::service attribute expands to a collection of items that form an rpc service. These generated types make it easy and ergonomic to write servers with less boilerplate. Simply implement the generated service trait, and you're off to the races!

Example

This example uses tokio, so add the following dependencies to your Cargo.toml:

anyhow = "1.0"
futures = "0.3"
tarpc = { version = "0.37", features = ["tokio1"] }
tokio = { version = "1.0", features = ["rt-multi-thread", "macros"] }

In the following example, we use an in-process channel for communication between client and server. In real code, you will likely communicate over the network. For a more real-world example, see example-service.

First, let's set up the dependencies and service definition.

use futures::prelude::*;
use tarpc::{
    client, context,
    server::{self, Channel},
};

// This is the service definition. It looks a lot like a trait definition.
// It defines one RPC, hello, which takes one arg, name, and returns a String.
#[tarpc::service]
trait World {
    /// Returns a greeting for name.
    async fn hello(name: String) -> String;
}

This service definition generates a trait called World. Next we need to implement it for our Server struct.

// This is the type that implements the generated World trait. It is the business logic
// and is used to start the server.
#[derive(Clone)]
struct HelloServer;

impl World for HelloServer {
    async fn hello(self, _: context::Context, name: String) -> String {
        format!("Hello, {name}!")
    }
}

Lastly let's write our main that will start the server. While this example uses an in-process channel, tarpc also ships a generic [serde_transport] behind the serde-transport feature, with additional TCP functionality available behind the tcp feature.

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let (client_transport, server_transport) = tarpc::transport::channel::unbounded();

    let server = server::BaseChannel::with_defaults(server_transport);
    tokio::spawn(
        server.execute(HelloServer.serve())
            // Handle all requests concurrently.
            .for_each(|response| async move {
                tokio::spawn(response);
            }));

    // WorldClient is generated by the #[tarpc::service] attribute. It has a constructor `new`
    // that takes a config and any Transport as input.
    let mut client = WorldClient::new(client::Config::default(), client_transport).spawn();

    // The client has an RPC method for each RPC defined in the annotated trait. It takes the same
    // args as defined, with the addition of a Context, which is always the first arg. The Context
    // specifies a deadline and trace information which can be helpful in debugging requests.
    let hello = client.hello(context::current(), "Stim".to_string()).await?;

    println!("{hello}");

    Ok(())
}

Service Documentation

Use cargo doc as you normally would to see the documentation created for all items expanded by a service! invocation.

License: MIT

Dépôts similaires
zeromicro/go-zero

A cloud-native Go microservices framework with cli tool for productivity.

GoGo ModulesMIT Licensegolangmicroservice
go-zero.dev
33.2k4.3k
TarsCloud/Tars

Tars is a high-performance RPC framework based on name service and Tars protocol, also integrated administration platform, and implemented hosting-service via flexible schedule.

C++BSD 3-Clause "New" or "Revised" Licenserpc-frameworkhigh-performance
10.1k2.1k
line/armeria

Your go-to microservice framework for any situation, from the creator of Netty et al. You can build any type of microservice leveraging your favorite technologies, including gRPC, Thrift, Kotlin, Retrofit, Reactive Streams, Spring Boot and Dropwizard.

JavaMavenApache License 2.0httphttp2
armeria.dev
5.1k1k
sofastack/sofa-rpc

SOFARPC is a high-performance, high-extensibility, production-level Java RPC framework.

JavaMavenApache License 2.0sofa-rpcsofastack
sofastack.tech/sofa-rpc/docs/Home
3.9k1.2k
luxiaoxun/NettyRpc

A simple RPC framework based on Netty, ZooKeeper and Spring

JavaMavennettyrpc-framework
2.4k1.1k
zeroc-ice/ice

All-in-one solution for creating networked applications with RPC, pub/sub, server deployment, and more.

C++GNU General Public License v2.0rpcice
zeroc.com
2.2k600
suyuan32/simple-admin-core

Simple Admin是一个基于Go Zero开发面向小型到大型项目的分布式微服务后端管理系统脚手架,提供丰富的后台管理功能,支持k8s快速部署,助力快速开发高并发微服务集群,适合学习和商用。Simple Admin is a powerful microservice framework for large management system. It is based on go-zero and supports several advanced features. It can help you to develop a microservice back-end management system in a short time.

GoGo ModulesApache License 2.0gogolang
doc.ryansu.tech/zh
2k336
hprose/hprose-php

Hprose is a cross-language RPC. This project is Hprose 3.0 for PHP

PHPPackagistMIT Licenserpcrpc-library
2k381
fengjiachun/Jupiter

Jupiter是一款性能非常不错的, 轻量级的分布式服务框架

JavaMavenApache License 2.0jupiterrpc
1.5k555
laruence/yar

Light, concurrent RPC framework for PHP & C

COtheryarrpc-framework
1.4k316
unum-cloud/UCall

Web Serving and Remote Procedure Calls at 50x lower latency and 70x higher bandwidth than FastAPI, implementing JSON-RPC & REST over io_uring ☎️

CApache License 2.0cpythonepoll
unum-cloud.github.io/UCall/
1.3k54
hprose/hprose-golang

Hprose is a cross-language RPC. This project is Hprose for Golang.

GoGo ModulesMIT Licenserpcrpc-framework
1.3k199