#rpc #brpc #protobuf-compiler #brpc-rs #apache #plugin #rust

app brpc-protoc-plugin

用于brpc-rs的Protobuf编译器插件

1 个不稳定版本

0.1.0 2019年7月30日
0.1.0-alpha4 2019年7月26日
0.1.0-alpha1 2019年7月25日

#10 in #protobuf-compiler

Apache-2.0

30KB
459

brpc-rs: Apache BRPC库的Rust实现

Build Status Crate Documentation

Apache BRPC 是一个工业级RPC框架,用于构建可靠和高性能的服务。 brpc-rs 允许使用Rust编程语言实现BRPC客户端和服务器。

状态

此项目目前是一个处于积极开发中的原型。许多API都缺失;提供的API在1.0版本之前可能不稳定。

仓库结构

  • 项目根目录
    • brpc-build
    • brpc-protoc-plugin
    • brpc-sys
      • brpc-sys 包,Apache BRPC的FFI绑定
    • 示例
      • 示例
    • src

此图说明了这些包是如何协同工作的

快速入门

先决条件

首先 构建安装 Apache BRPC。说明可以在 getting_started.md 中找到。

或者,您可以使用为Ubuntu 16.04/18.04 预先构建的Apache BRPC 0.9.6的deb包。这些不是官方包。

确保已安装以下依赖项

$ sudo apt-get install libprotobuf-dev libprotoc-dev protobuf-compiler
$ sudo apt-get install libssl-dev libgflags-dev libleveldb-dev

从crates.io安装brpc-protoc-plugin

$ cargo install brpc-protoc-plugin --version 0.1.0-alpha4

现在我们可以开始一个 brpc-rs 项目了。

Cargo.toml

让我们创建一个小型包,echo_service,它包括一个 echo_client 和一个 echo_server

$ cargo new echo_service && cd echo_service

Cargo.toml 中,将 brpc-rsprostbytes 添加到 [dependencies] 部分;将 brpc-build 添加到 [build-dependencies] 部分。例如,

[build-dependencies]
brpc-build = "0.1.0"

[dependencies]
brpc-rs = "0.1.0"
prost = "0.5.0"
bytes = "0.4.12"

定义两个二进制文件:echo_clientecho_server,在 Cargo.toml 中。

[[bin]]
name = "echo_client"
path = "src/client.rs"

[[bin]]
name = "echo_server"
path = "src/server.rs"

build.rs

src 目录下放置一个 protobuf 文件 echo.proto。此文件定义了 EchoRequestEchoResponseEchoService

syntax="proto2";
package example;
message EchoRequest {
      required string message = 1;
};
message EchoResponse {
      required string message = 1;
};
service EchoService {
      rpc echo(EchoRequest) returns (EchoResponse);
};

Cargo.toml 中的 [package] 部分添加一行 build = "build.rs"。然后创建一个名为 build.rs 的文件,用于从 src/echo.proto 生成绑定。

fn main() {
    brpc_build::compile_protos(&["src/echo.proto"],
                               &["src"]).unwrap();
}

注意 echo.proto 中的 package 名称是 example。因此,build.rs 会生成两个文件,分别命名为 example.rsexample.brpc.rs

src/server.rs

接下来,让我们实现 echo 服务器。创建 src/server.rs 如下:

use brpc_rs::{Server, ServerOptions, ServiceOwnership};

pub mod echo {
    include!(concat!(env!("OUT_DIR"), "/example.rs"));
    include!(concat!(env!("OUT_DIR"), "/example.brpc.rs"));
}

fn main() {
    let mut service = echo::EchoService::new();
    service.set_echo_handler(&mut move |request, mut response| {
        response.message = request.message.clone();
        Ok(())
    });

    let mut server = Server::new();
    let mut options = ServerOptions::new();
    options.set_idle_timeout_ms(1000);
    server
        .add_service(&service, ServiceOwnership::ServerDoesntOwnService)
        .expect("Failed to add service");
    server.start(50000, &options).expect("Failed to start service");
    server.run(); // Run until CTRL-C
}

因为 EchoServiceecho.proto 中定义了一个名为 echo 的函数,brpc-protoc-plugin 会为 EchoService 生成 set_echo_handler 的 Rust 定义。 set_echo_handler 接受一个闭包,用于处理来自客户端的 EchoRequest 并返回相同的消息。接下来的几行创建了一个监听在 0.0.0.0:50000 的服务器。

src/client.rs

use brpc_rs::{Channel, ChannelOptions};

pub mod echo {
    include!(concat!(env!("OUT_DIR"), "/example.rs"));
    include!(concat!(env!("OUT_DIR"), "/example.brpc.rs"));
}

fn main() {
    let mut options = ChannelOptions::new();
    options.set_timeout_ms(100);
    let addr = "127.0.0.1:50000".parse().expect("Invalid socket address");
    let ch = Channel::with_options(&addr, &options);
    let client = echo::EchoServiceStub::with_channel(&ch);
    let request = echo::EchoRequest {
        message: "hello".to_owned(),
    };
    match client.echo(&request) {
        Ok(r) => println!("Response: {:?}", r),
        Err(e) => eprintln!("Error: {:?}", e),
    }
}

客户端首先创建一个 Channel 并使用该通道初始化一个 service_stub。然后,客户端调用 service_stub.echo 发送请求。

运行客户端和服务器

$ cargo run --bin echo_server &
$ cargo run --bin echo_client
Response: EchoResponse { message: "hello" }

维护者

许可证

brpc-rs 提供 Apache License,版本 2.0。副本见 LICENSE 文件。

依赖项

~225KB