题解 | 微服务架构下的深层依赖链路漏洞影响面分析
微服务架构下的深层依赖链路漏洞影响面分析
https://www.nowcoder.com/practice/a8416ddac26b427c97d8a8c6a7d14779
# 查询所有直接或间接依赖于服务名为'Payment_Gateway'的微服务,
with recursive dependency_paths as (
# 初始查询(深度=1)
# 找出所有直接依赖于Payment_Gateway的服务
select
s2.service_id,
s2.service_name,
1 as dependency_depth,
concat('Payment_Gateway->',s2.service_name) as dependency_path
from service_dependencies s1
inner join services s2
on s1.caller_service_id = s2.service_id
where s1.callee_service_id = (
select service_id from services
where service_name ='Payment_Gateway'
)
# 仅统计依赖建立日期(first_call_date)在2025年(包含2025全年)的调用关系
and year(s1.first_call_date) = 2025
# 连接初始查询和递归查询
union all
# 递归查询 深度>=2
# 基于已找到的服务,继续查询依赖与它们的服务
# 即 找出所有间接依赖于Payment_Gateway的服务
select
s2.service_id,
s2.service_name,
# 深度+1
dp.dependency_depth + 1 as dependency_depth,
# 追加路径
concat(dp.dependency_path,'->',s2.service_name) as dependency_path
from service_dependencies s1
# 关键:将当前依赖表与已找到的递归结果关联
inner join dependency_paths dp
on s1.callee_service_id = dp.service_id
inner join services s2
on s1.caller_service_id = s2.service_id
where year(s1.first_call_date) = 2025
# condition 即 防止循环的条件:确保路径中不包含当前服务名时,停止递归查询
and dp.dependency_path not like concat('%',s2.service_name,'%')
)
select * from dependency_paths
order by dependency_depth,service_id,dependency_path;
# 排序规则:
# 结果须按依赖深度(dependency_depth)升序排列;
# 若深度相同,则按主调服务ID(service_id)升序排列;
# 若主调服务ID也相同(说明该服务通过多条不同路径依赖了目标服务),则按依赖路径(dependency_path)的字典序升序排列。
递归查询with recursive
语法如下
with recursive cte_name(column_list) as ( select initial_query_result union [all] select recursive_query from cte_name where condition ) select * from cte_name; # cte_name:递归表的名称。 # column_list:递归表中包含的列名。 # initial_query_result:初始查询结果。 # recursive_query:递归查询语句。 # condition:递归查询的终止条件。
查看27道真题和解析