Skip to content

Commit c10f1d9

Browse files
committed
feat: 补充服务查询API接口,支持查询单个服务的详细信息; #274
1 parent 9b79efe commit c10f1d9

File tree

3 files changed

+93
-5
lines changed

3 files changed

+93
-5
lines changed

src/naming/core.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,8 @@ pub enum NamingCmd {
10631063
QueryServiceSubscribersPageV2(ServiceQueryParam),
10641064
//查询服务实际信息列表
10651065
QueryServiceInfoPage(ServiceQueryParam),
1066+
// 只查服务自身信息
1067+
QueryServiceOnly(ServiceKey),
10661068
//CreateService(ServiceDetailDto),
10671069
UpdateService(ServiceDetailDto),
10681070
UpdateServiceFromCluster(ServiceDetailDto),
@@ -1094,6 +1096,7 @@ pub enum NamingResult {
10941096
ServicePage((usize, Vec<Arc<String>>)),
10951097
ServiceSubscribersPage((usize, Vec<SubscriberInfoDto>)),
10961098
ServiceInfoPage((usize, Vec<ServiceInfoDto>)),
1099+
ServiceDto(Option<ServiceInfoDto>),
10971100
ClientInstanceCount(Vec<(Arc<String>, usize)>),
10981101
RewriteToCluster(u64, Instance),
10991102
Snapshot(SnapshotForSend),
@@ -1200,6 +1203,9 @@ impl Handler<NamingCmd> for NamingActor {
12001203
NamingCmd::QueryServiceInfoPage(param) => Ok(NamingResult::ServiceInfoPage(
12011204
self.get_service_info_page(param),
12021205
)),
1206+
NamingCmd::QueryServiceOnly(service_key) => Ok(NamingResult::ServiceDto(
1207+
self.get_service(&service_key).map(|s| s.get_service_info()),
1208+
)),
12031209
NamingCmd::QueryServiceSubscribersPageV2(param) => Ok(
12041210
NamingResult::ServiceSubscribersPage(self.get_subscribers_list_by_param(param)),
12051211
),

src/openapi/naming/model.rs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#![allow(unused_imports, unused_assignments, unused_variables)]
22
use crate::common::option_utils::OptionUtils;
33
use crate::naming::model::{Instance, ServiceKey};
4-
use crate::naming::service::SubscriberInfoDto;
4+
use crate::naming::service::{ServiceInfoDto, SubscriberInfoDto};
55
use crate::naming::NamingUtils;
66
use crate::utils::get_bool_from_string;
77
use serde::{Deserialize, Serialize};
@@ -358,3 +358,48 @@ pub struct ServiceQuerySubscribersListResponce {
358358
pub count: usize,
359359
pub subscribers: Vec<SubscriberInfoDto>,
360360
}
361+
362+
#[derive(Debug, Serialize, Deserialize, Default)]
363+
#[serde(rename_all = "camelCase")]
364+
pub struct ServiceInfoVo {
365+
pub namespace_id: Arc<String>,
366+
pub group_name: Arc<String>,
367+
pub name: Arc<String>,
368+
pub protect_threshold: f32,
369+
pub metadata: Option<Arc<HashMap<String, String>>>,
370+
pub selector: HashMap<String, String>,
371+
pub clusters: Vec<ClusterVo>,
372+
}
373+
374+
#[derive(Debug, Serialize, Deserialize, Default)]
375+
#[serde(rename_all = "camelCase")]
376+
pub struct ClusterVo {
377+
pub name: String,
378+
pub health_checker: HashMap<String, String>,
379+
pub metadata: HashMap<String, String>,
380+
}
381+
382+
impl ServiceInfoVo {
383+
/// 从 ServiceInfoDto 创建 ServiceInfoVo,使用默认的命名空间和集群信息
384+
pub fn from_dto(dto: ServiceInfoDto, namespace_id: Arc<String>) -> Self {
385+
let mut selector = HashMap::new();
386+
selector.insert("type".to_owned(), "none".to_string());
387+
selector.insert("contextType".to_owned(), "NONE".to_string());
388+
let mut health_checker = HashMap::new();
389+
health_checker.insert("type".to_owned(), "TCP".to_string());
390+
391+
Self {
392+
namespace_id,
393+
group_name: dto.group_name,
394+
name: dto.service_name,
395+
protect_threshold: dto.protect_threshold.unwrap_or(0.0),
396+
metadata: dto.metadata,
397+
selector,
398+
clusters: vec![ClusterVo {
399+
name: "DEFAULT".to_string(),
400+
health_checker,
401+
metadata: HashMap::new(),
402+
}],
403+
}
404+
}
405+
}

src/openapi/naming/service.rs

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use crate::naming::model::ServiceKey;
55
use crate::naming::NamingUtils;
66
use crate::openapi::constant::EMPTY;
77
use crate::openapi::naming::model::{
8-
ServiceQueryListRequest, ServiceQueryListResponce, ServiceQuerySubscribersListResponce,
8+
ServiceInfoVo, ServiceQueryListRequest, ServiceQueryListResponce,
9+
ServiceQuerySubscribersListResponce,
910
};
1011
use actix::Addr;
1112
use actix_web::http::header;
@@ -25,10 +26,46 @@ pub(super) fn service() -> Scope {
2526
}
2627

2728
pub async fn query_service(
28-
_param: web::Query<ServiceQueryListRequest>,
29-
_naming_addr: web::Data<Addr<NamingActor>>,
29+
param: web::Query<ServiceQueryListRequest>,
30+
naming_addr: web::Data<Addr<NamingActor>>,
3031
) -> impl Responder {
31-
HttpResponse::InternalServerError().body("error,not support at present")
32+
if let Some((group, service_name)) =
33+
NamingUtils::split_group_and_service_name(&param.0.service_name.clone().unwrap_or_default())
34+
{
35+
let namespace_id = NamingUtils::default_namespace(
36+
param
37+
.namespace_id
38+
.as_ref()
39+
.unwrap_or(&"".to_owned())
40+
.to_owned(),
41+
);
42+
let service_key = ServiceKey::new(&namespace_id, &group, &service_name);
43+
match naming_addr
44+
.send(NamingCmd::QueryServiceOnly(service_key.clone()))
45+
.await
46+
{
47+
Ok(res) => {
48+
let result: NamingResult = res.unwrap();
49+
match result {
50+
NamingResult::ServiceDto(service) => {
51+
if let Some(service_dto) = service {
52+
let vo = ServiceInfoVo::from_dto(service_dto, service_key.namespace_id);
53+
HttpResponse::Ok().json(&vo)
54+
} else {
55+
HttpResponse::InternalServerError().body(format!(
56+
"service not found,namespace_id:{},service_name:{}",
57+
&namespace_id, &service_name
58+
))
59+
}
60+
}
61+
_ => HttpResponse::InternalServerError().body("error"),
62+
}
63+
}
64+
Err(err) => HttpResponse::InternalServerError().body(err.to_string()),
65+
}
66+
} else {
67+
HttpResponse::InternalServerError().body("error,service_name is valid")
68+
}
3269
}
3370

3471
pub async fn update_service(

0 commit comments

Comments
 (0)