Specifying CallOpt During Invocation
To enhance the framework’s flexibility and user-friendliness, Volo allows users on the client-side to use CallOpt
to set certain request metadata for individual requests.
Taking Volo-Thrift as an example, the definition of CallOpt
is as follows:
pub struct CallOpt {
/// Sets the callee tags for the call.
pub callee_tags: TypeMap,
/// Sets the address for the call.
pub address: Option<Address>,
pub config: Config,
/// Sets the caller tags for the call.
pub caller_tags: TypeMap,
}
The callee_tags
refer to some metadata of the remote endpoint, while caller_tags
represent local metadata. These two TypeMaps are primarily intended for middleware extensions like service discovery, load balancing and routing.
The address
denotes the downstream address. If set, in principle, it eliminates the need to go through service discovery and load balancing components.
Within the config
, various request configurations can be set, such as RPC timeout duration.
We can specify CallOpt
during a request using the following method:
lazy_static! {
static ref CLIENT: volo_gen::volo::example::ItemServiceClient = {
let addr: SocketAddr = "127.0.0.1:8080".parse().unwrap();
volo_gen::volo::example::ItemServiceClientBuilder::new("volo-example-item")
.layer_outer(LogLayer)
.address(addr)
.build()
};
}
#[volo::main]
async fn main() {
let callopt = CallOpt::default();
let req = volo_gen::volo::example::GetItemRequest { id: 1024 };
let resp = CLIENT.clone().with_callopt(callopt).get_item(req).await;
match resp {
Ok(info) => tracing::info!("{:?}", info),
Err(e) => tracing::error!("{:?}", e),
}
}