1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use std::sync::Once;
use tonic::client::Grpc;
use tonic::transport::Channel;
use tonic::transport::Endpoint;
use crate::common::url::Url;
use crate::invocation::{Request, Response};
use crate::protocol::Invoker;
pub struct GrpcInvoker {
client: Grpc<Channel>,
url: Url,
once: Once,
}
impl GrpcInvoker {
pub fn new(url: Url) -> GrpcInvoker {
let endpoint = Endpoint::new(url.to_url()).unwrap();
let conn = endpoint.connect_lazy();
Self {
url,
client: Grpc::new(conn),
once: Once::new(),
}
}
}
impl Invoker for GrpcInvoker {
fn is_available(&self) -> bool {
true
}
fn destroy(&self) {
self.once.call_once(|| println!("destroy..."))
}
fn get_url(&self) -> Url {
self.url.to_owned()
}
fn invoke<M1>(&self, req: Request<M1>) -> Response<String>
where
M1: Send + 'static,
{
let (metadata, _) = req.into_parts();
let resp = Response::new("string");
let (_resp_meta, msg) = resp.into_parts();
Response::from_parts(metadata, msg.to_string())
}
}
impl Clone for GrpcInvoker {
fn clone(&self) -> Self {
Self {
client: self.client.clone(),
url: self.url.clone(),
once: Once::new(),
}
}
}