This is an automated email from the ASF dual-hosted git repository.
yangyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/dubbo-rust.git
The following commit(s) were added to refs/heads/main by this push:
new 6943c9f Rft: Optimize the relation of metadata and headers (#193)
6943c9f is described below
commit 6943c9fb1876ad5dbc6d335939afbc37abeed775
Author: Yang Yang <[email protected]>
AuthorDate: Sun Apr 28 10:21:17 2024 +0800
Rft: Optimize the relation of metadata and headers (#193)
* refact(triple): optimize metadata and header logic
* style: cargo fmt
---
dubbo/src/codegen.rs | 2 +-
dubbo/src/invocation.rs | 33 +++++++++++++++++--
dubbo/src/protocol/triple/triple_invoker.rs | 4 +++
dubbo/src/triple/client/triple.rs | 50 +++++++++++++++++++++++------
examples/echo/src/echo/client.rs | 20 ++++++++----
5 files changed, 90 insertions(+), 19 deletions(-)
diff --git a/dubbo/src/codegen.rs b/dubbo/src/codegen.rs
index 9277414..baf3929 100644
--- a/dubbo/src/codegen.rs
+++ b/dubbo/src/codegen.rs
@@ -29,7 +29,7 @@ pub use tower_service::Service;
pub use super::{
empty_body,
- invocation::{IntoStreamingRequest, Request, Response, RpcInvocation},
+ invocation::{IntoStreamingRequest, Metadata, Request, Response,
RpcInvocation},
protocol::{triple::triple_invoker::TripleInvoker, Invoker},
triple::{
client::TripleClient,
diff --git a/dubbo/src/invocation.rs b/dubbo/src/invocation.rs
index 5750337..7b25183 100644
--- a/dubbo/src/invocation.rs
+++ b/dubbo/src/invocation.rs
@@ -144,11 +144,23 @@ where
type Message = T::Item;
- fn into_streaming_request(self) -> Request<Self::Stream> {
+ fn into_streaming_request(self) -> Request<Self> {
Request::new(self)
}
}
+impl<T> IntoStreamingRequest for Request<T>
+where
+ T: Stream + Send + 'static,
+{
+ type Stream = T;
+ type Message = T::Item;
+
+ fn into_streaming_request(self) -> Self {
+ self
+ }
+}
+
// impl<T> sealed::Sealed for T {}
// pub mod sealed {
@@ -167,6 +179,11 @@ impl Metadata {
}
}
+ pub fn insert(mut self, key: String, value: String) -> Self {
+ self.inner.insert(key, value);
+ self
+ }
+
pub fn from_headers(headers: http::HeaderMap) -> Self {
let mut h: HashMap<String, String> = HashMap::new();
for (k, v) in headers.into_iter() {
@@ -196,10 +213,12 @@ pub trait Invocation {
fn get_method_name(&self) -> String;
}
-#[derive(Default, Clone)]
+#[derive(Default, Clone, Debug)]
pub struct RpcInvocation {
target_service_unique_name: String,
method_name: String,
+
+ metadata: Metadata,
}
impl RpcInvocation {
@@ -211,9 +230,19 @@ impl RpcInvocation {
self.method_name = method_name;
self
}
+
+ pub fn with_metadata(mut self, metadata: Metadata) -> Self {
+ self.metadata = metadata;
+ self
+ }
+
pub fn unique_fingerprint(&self) -> String {
format!("{}#{}", self.target_service_unique_name, self.method_name)
}
+
+ pub fn get_metadata(&self) -> Metadata {
+ self.metadata.clone()
+ }
}
impl Invocation for RpcInvocation {
diff --git a/dubbo/src/protocol/triple/triple_invoker.rs
b/dubbo/src/protocol/triple/triple_invoker.rs
index 29704f5..516dab2 100644
--- a/dubbo/src/protocol/triple/triple_invoker.rs
+++ b/dubbo/src/protocol/triple/triple_invoker.rs
@@ -71,6 +71,10 @@ impl TripleInvoker {
.body(body)
.unwrap();
+ // add header of source
+ for (k, v) in parts.headers.iter() {
+ req.headers_mut().insert(k, v.to_owned());
+ }
// *req.version_mut() = http::Version::HTTP_2;
req.headers_mut()
.insert("method", HeaderValue::from_static("POST"));
diff --git a/dubbo/src/triple/client/triple.rs
b/dubbo/src/triple/client/triple.rs
index 46f8e9c..2948dec 100644
--- a/dubbo/src/triple/client/triple.rs
+++ b/dubbo/src/triple/client/triple.rs
@@ -137,7 +137,7 @@ impl TripleClient {
&mut self,
req: Request<M1>,
path: http::uri::PathAndQuery,
- invocation: RpcInvocation,
+ mut invocation: RpcInvocation,
) -> Result<Response<M2>, crate::status::Status>
where
M1: Message + Send + Sync + 'static + Serialize,
@@ -147,6 +147,9 @@ impl TripleClient {
Box<dyn Decoder<Item = M2, Error = Status> + Send + 'static>,
Box<dyn Encoder<Error = Status, Item = M1> + Send + 'static>,
) = get_codec("application/grpc+proto");
+
+ let mt = req.metadata.clone();
+
let req = req.map(|m| stream::once(future::ready(m)));
let body_stream = encode(
encoder,
@@ -157,13 +160,18 @@ impl TripleClient {
.into_stream();
let body = hyper::Body::wrap_stream(body_stream);
+ invocation = invocation.with_metadata(mt.clone());
let mut invoker = self.mk.new_service(invocation);
- let request = http::Request::builder()
+ let mut request = http::Request::builder()
.header("path", path.to_string())
.body(body)
.unwrap();
+ for (k, v) in mt.into_headers().iter() {
+ request.headers_mut().insert(k, v.to_owned());
+ }
+
let response = invoker
.call(request)
.await
@@ -200,7 +208,7 @@ impl TripleClient {
&mut self,
req: impl IntoStreamingRequest<Message = M1>,
path: http::uri::PathAndQuery,
- invocation: RpcInvocation,
+ mut invocation: RpcInvocation,
) -> Result<Response<Decoding<M2>>, crate::status::Status>
where
M1: Message + Send + Sync + 'static + Serialize,
@@ -210,7 +218,10 @@ impl TripleClient {
Box<dyn Decoder<Item = M2, Error = Status> + Send + 'static>,
Box<dyn Encoder<Error = Status, Item = M1> + Send + 'static>,
) = get_codec("application/grpc+proto");
+
let req = req.into_streaming_request();
+ let mt = req.metadata.clone();
+
let en = encode(
encoder,
req.into_inner().map(Ok),
@@ -220,13 +231,18 @@ impl TripleClient {
.into_stream();
let body = hyper::Body::wrap_stream(en);
+ invocation = invocation.with_metadata(mt.clone());
let mut invoker = self.mk.new_service(invocation);
- let request = http::Request::builder()
+ let mut request = http::Request::builder()
.header("path", path.to_string())
.body(body)
.unwrap();
+ for (k, v) in mt.into_headers().iter() {
+ request.headers_mut().insert(k, v.to_owned());
+ }
+
let response = invoker
.call(request)
.await
@@ -247,7 +263,7 @@ impl TripleClient {
&mut self,
req: impl IntoStreamingRequest<Message = M1>,
path: http::uri::PathAndQuery,
- invocation: RpcInvocation,
+ mut invocation: RpcInvocation,
) -> Result<Response<M2>, crate::status::Status>
where
M1: Message + Send + Sync + 'static + Serialize,
@@ -258,6 +274,8 @@ impl TripleClient {
Box<dyn Encoder<Error = Status, Item = M1> + Send + 'static>,
) = get_codec("application/grpc+proto");
let req = req.into_streaming_request();
+ let mt = req.metadata.clone();
+
let en = encode(
encoder,
req.into_inner().map(Ok),
@@ -266,14 +284,19 @@ impl TripleClient {
)
.into_stream();
let body = hyper::Body::wrap_stream(en);
+
+ invocation = invocation.with_metadata(mt.clone());
let mut invoker = self.mk.new_service(invocation);
- let request = http::Request::builder()
+ let mut request = http::Request::builder()
.header("path", path.to_string())
.body(body)
.unwrap();
- // let mut conn = Connection::new().with_host(http_uri);
+ for (k, v) in mt.into_headers().iter() {
+ request.headers_mut().insert(k, v.to_owned());
+ }
+
let response = invoker
.call(request)
.await
@@ -310,7 +333,7 @@ impl TripleClient {
&mut self,
req: Request<M1>,
path: http::uri::PathAndQuery,
- invocation: RpcInvocation,
+ mut invocation: RpcInvocation,
) -> Result<Response<Decoding<M2>>, crate::status::Status>
where
M1: Message + Send + Sync + 'static + Serialize,
@@ -320,7 +343,10 @@ impl TripleClient {
Box<dyn Decoder<Item = M2, Error = Status> + Send + 'static>,
Box<dyn Encoder<Error = Status, Item = M1> + Send + 'static>,
) = get_codec("application/grpc+proto");
+
let req = req.map(|m| stream::once(future::ready(m)));
+ let mt = req.metadata.clone();
+
let en = encode(
encoder,
req.into_inner().map(Ok),
@@ -329,13 +355,19 @@ impl TripleClient {
)
.into_stream();
let body = hyper::Body::wrap_stream(en);
+
+ invocation = invocation.with_metadata(mt.clone());
let mut invoker = self.mk.new_service(invocation);
- let request = http::Request::builder()
+ let mut request = http::Request::builder()
.header("path", path.to_string())
.body(body)
.unwrap();
+ for (k, v) in mt.into_headers().iter() {
+ request.headers_mut().insert(k, v.to_owned());
+ }
+
let response = invoker
.call(request)
.await
diff --git a/examples/echo/src/echo/client.rs b/examples/echo/src/echo/client.rs
index 74dec98..030003f 100644
--- a/examples/echo/src/echo/client.rs
+++ b/examples/echo/src/echo/client.rs
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-use dubbo::codegen::*;
+use dubbo::{codegen::*, invocation::Metadata};
use example_echo::generated::generated::{echo_client::EchoClient, EchoRequest};
use futures_util::StreamExt;
@@ -41,11 +41,15 @@ async fn main() {
let mut cli = EchoClient::new(builder);
// let mut unary_cli = cli.clone().with_filter(FakeFilter {});
// let mut cli =
EchoClient::build(ClientBuilder::from_static("http://127.0.0.1:8888"));
- let resp = cli
- .unary_echo(Request::new(EchoRequest {
+ let mut mtdata = Metadata::default();
+ mtdata = mtdata.insert("static_tag".to_string(), "red".to_string());
+ let req = Request::from_parts(
+ mtdata.clone(),
+ EchoRequest {
message: "message from client".to_string(),
- }))
- .await;
+ },
+ );
+ let resp = cli.unary_echo(req).await;
let resp = match resp {
Ok(resp) => resp,
Err(err) => return println!("{:?}", err),
@@ -64,7 +68,9 @@ async fn main() {
message: "msg3 from client streaming".to_string(),
},
];
- let req = futures_util::stream::iter(data);
+ let mut mtdata = Metadata::default();
+ mtdata = mtdata.insert("client_streaming".to_string(), "true".to_string());
+ let req = Request::from_parts(mtdata, futures_util::stream::iter(data));
let resp = cli.client_streaming_echo(req).await;
let client_streaming_resp = match resp {
Ok(resp) => resp,
@@ -84,7 +90,7 @@ async fn main() {
message: "msg3 from client".to_string(),
},
];
- let req = futures_util::stream::iter(data);
+ let req = Request::new(futures_util::stream::iter(data));
let bidi_resp = cli.bidirectional_streaming_echo(req).await.unwrap();