// Baidu RPC - A framework to host and access services throughout Baidu. // Copyright (c) 2014 Baidu.com, Inc. All Rights Reserved // // If you have any problem, contact us: // Baidu Hi : group 1296497 // Email : pbrpc@baidu.com // Wiki : http://wiki.baidu.com/display/RPC/baidu-rpc // A client sending requests to server every 1 second. #include <gflags/gflags.h> #include <base/logging.h> #include <base/time.h> #include <brpc/channel.h> #include "echo.pb.h" DEFINE_string(connection_type, "","Connection type. Available values: single, pooled, short"); DEFINE_string(server, "0.0.0.0:8000", "IP Address of server"); DEFINE_string(load_balancer, "", "The algorithm for load balancing"); DEFINE_int32(timeout_ms, 100, "RPC timeout in milliseconds"); DEFINE_int32(max_retry, 3, "Max retries(not including the first RPC)"); DEFINE_string(protocol, "sofa_pbrpc", "Protocol type. Defined in protocol/brpc/options.proto"); int main(int argc, char* argv[]) { // Parse gflags. We recommend you to use gflags as well. google::ParseCommandLineFlags(&argc, &argv, true); // A Channel represents a communication line to a Server. Notice that // Channel is thread-safe and can be shared by all threads in your program. brpc::Channel channel; // Initialize the channel, NULL means using default options. brpc::ChannelOptions options; options.protocol = FLAGS_protocol; options.connection_type = FLAGS_connection_type; options.timeout_ms = FLAGS_timeout_ms/*milliseconds*/; options.max_retry = FLAGS_max_retry; if (channel.Init(FLAGS_server.c_str(), FLAGS_load_balancer.c_str(), &options) != 0) { LOG(ERROR) << "Fail to initialize channel"; return -1; } // Normally, you should not call a Channel directly, but instead construct // a stub Service wrapping it. stub can be shared by all threads as well. example::EchoService_Stub stub(&channel); // Send a request and wait for the response every 1 second. int log_id = 0; while (!brpc::IsAskedToQuit()) { // We will receive response synchronously, safe to put variables // on stack. example::EchoRequest request; example::EchoResponse response; brpc::Controller cntl; request.set_message("hello world"); cntl.set_log_id(log_id ++); // set by user // Because `done'(last parameter) is NULL, this function waits until // the response comes back or error occurs(including timedout). stub.Echo(&cntl, &request, &response, NULL); if (!cntl.Failed()) { LOG(INFO) << "Received response from " << cntl.remote_side() << ": " << response.message() << " latency=" << cntl.latency_us() << "us"; } else { LOG(WARNING) << "Fail to send EchoRequest, " << cntl.ErrorText(); } sleep(1); } LOG(INFO) << "EchoClient is going to quit"; return 0; }