This is an automated email from the ASF dual-hosted git repository.
xuehuilang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shenyu-client-rust.git
The following commit(s) were added to refs/heads/main by this push:
new d146ba4 support multi namespaces. (#7)
d146ba4 is described below
commit d146ba4e0ae01efc24e774a5f14428c957ed3f13
Author: DamonXue <[email protected]>
AuthorDate: Mon Dec 30 21:59:41 2024 +0800
support multi namespaces. (#7)
---
shenyu-client-rust/src/core.rs | 75 ++++++++++++++++++++++++++++++++++--------
1 file changed, 61 insertions(+), 14 deletions(-)
diff --git a/shenyu-client-rust/src/core.rs b/shenyu-client-rust/src/core.rs
index 836243a..182465b 100644
--- a/shenyu-client-rust/src/core.rs
+++ b/shenyu-client-rust/src/core.rs
@@ -52,7 +52,7 @@ pub struct ShenyuClient {
env: ShenYuConfig,
host: Option<String>,
port: u16,
- namespace_id: String,
+ namespace_ids: Vec<String>,
gateway_base_urls: Vec<String>,
register_meta_data_path_list: Vec<String>,
register_uri_list: Vec<String>,
@@ -94,11 +94,10 @@ impl ShenyuClient {
"Content-Type".to_string(),
"application/json;charset=UTF-8".to_string(),
);
- let namespace_id = config
- .register
- .namespace_id
- .clone()
- .unwrap_or(SYS_DEFAULT_NAMESPACE_ID.to_string());
+ let namespace_ids: Vec<String> =
config.register.namespace_id.clone().map_or(
+ vec![SYS_DEFAULT_NAMESPACE_ID.to_string()],
+ |x| -> Vec<String> {
x.split(';').map(ToString::to_string).collect() },
+ );
let mut client = ShenyuClient {
headers,
@@ -106,7 +105,7 @@ impl ShenyuClient {
env: config,
host: None,
port,
- namespace_id,
+ namespace_ids,
gateway_base_urls: vec![],
register_meta_data_path_list: vec![],
register_uri_list: vec![],
@@ -245,8 +244,19 @@ impl ShenyuClient {
let app_name = &self.app_name.clone();
let rpc_type = &self.env.uri.rpc_type.clone();
let context_path = &self.env.uri.context_path.clone();
- let namespace_id = &self.namespace_id.clone();
+ let namespace_ids = &self.namespace_ids.clone();
+ namespace_ids.iter().for_each(|namespace_id| {
+ self._register_uri(app_name, rpc_type, context_path, namespace_id);
+ });
+ }
+ fn _register_uri(
+ &self,
+ app_name: &str,
+ rpc_type: &str,
+ context_path: &str,
+ namespace_id: &str,
+ ) {
let port = &self.port;
let host = &self.host;
@@ -303,7 +313,7 @@ impl ShenyuClient {
) {
let context_path = &self.env.uri.context_path.clone();
let app_name = &self.app_name.clone();
- let namespace_id = &self.namespace_id.clone();
+ let namespace_ids = &self.namespace_ids.clone();
let rpc_type = &self.env.uri.rpc_type.clone();
let path = if register_all {
format!("{context_path}**")
@@ -312,14 +322,39 @@ impl ShenyuClient {
};
let rule_name = rule_name.unwrap_or(&path).to_string();
+ namespace_ids.iter().for_each(|namespace_id| {
+ self._register_metadata(
+ app_name,
+ rpc_type,
+ context_path.to_string(),
+ path.as_str(),
+ method,
+ rule_name.clone(),
+ namespace_id,
+ enabled,
+ );
+ });
+ }
+
+ fn _register_metadata(
+ &self,
+ app_name: &str,
+ rpc_type: &str,
+ context_path: String,
+ path: &str,
+ method: Option<&str>,
+ rule_name: String,
+ namespace_id: &str,
+ enabled: bool,
+ ) {
let json_data = serde_json::json!({
- "appName": app_name.clone(),
+ "appName": app_name,
"contextPath": context_path.clone(),
- "path": context_path.clone() + path.as_str(),
+ "path": context_path.clone() + path,
"pathDesc": "",
"rpcType": rpc_type,
"ruleName": context_path.clone() + rule_name.as_str(),
- "serviceName": app_name.clone(),
+ "serviceName": app_name,
"methodName": method.unwrap_or("").to_string(),
"parameterTypes": "",
"rpcExt": "",
@@ -388,13 +423,25 @@ impl ShenyuClient {
/// Offline from shenyu.
pub fn offline_register(&self) {
let app_name = &self.app_name.clone();
- let namespace_id = &self.namespace_id.clone();
+ let namespace_ids = &self.namespace_ids.clone();
let rpc_type = &self.env.uri.rpc_type.clone();
let context_path = &self.env.uri.context_path.clone();
let port = &self.port;
let host = &self.host;
-
+ namespace_ids.iter().for_each(|namespace_id| {
+ self._offline_register(app_name, rpc_type, context_path,
namespace_id, port, host);
+ });
+ }
+ fn _offline_register(
+ &self,
+ app_name: &str,
+ rpc_type: &str,
+ context_path: &str,
+ namespace_id: &str,
+ port: &u16,
+ host: &Option<String>,
+ ) {
let json_data = serde_json::json!({
"appName": app_name,
"contextPath": context_path,