苍穹外卖微服务模块调用与异常排查笔记
问题背景与要解决的问题
1. 背景
苍穹外卖项目从单体架构拆分为微服务架构,拆分出sky-common(公共模块)、sky-server-gateway(网关模块)、sky-server-admin-operation(管理端业务模块)。拆分后因模块间依赖传递、配置缺失 / 冲突,前端通过网关访问管理端接口时出现401(未认证)、403(禁止访问) 报错,原单体架构的配置逻辑不再适配微服务调用流程。
2. 要解决的问题
- 梳理微服务架构下请求从前端→网关→业务服务的完整调用逻辑,定位 401/403 报错的根本原因;
- 解决模块间配置冲突(如 Security 配置干扰)、关键配置缺失(如网关跨域配置)问题;
- 形成适配微服务架构的配置方案,确保请求在各模块间顺畅流转,消除接口访问异常。
一、模块定位与关系
1. 模块核心作用
| 模块名称 | 定位与作用 |
|---|---|
sky-common |
公共模块(工具箱):存放全局配置(如SecurityConfig)、工具类,被网关和业务服务依赖 |
sky-server-gateway |
网关模块(总开关):接收前端所有请求,按路由规则转发到对应业务服务 |
sky-server-admin-operation |
管理端业务模块(处理器):处理/admin/**路径的业务逻辑(如员工登录、菜品管理) |
2. 模块关系图
graph TDA[前端<br/>(浏览器/Postman)] --> B[sky-server-gateway<br/>网关]B --> C[sky-server-admin-operation<br/>管理端业务服务]C -.-> D[sky-common<br/>公共配置/工具]B -.-> D
二、正常请求调用流程
1. 流程图
graph LRA[前端] -->|1.发送请求<br/>http://网关:8080/admin/login| B[网关]B -->|2.匹配路由规则<br/>Path=/admin/** → 转发到admin-operation| C[admin-operation]C -->|3.经过Security过滤<br/>(common配置放行)| D[Controller处理业务逻辑]D -->|4.返回响应结果| CC -->|5.回传响应| BB -->|6.返回结果给前端| A
2. 步骤说明
- 前端发起请求:访问网关统一入口(如
8080端口); - 网关路由转发:根据
Path=/admin/**规则,将请求转发到admin-operation(8081端口); - Security过滤:
admin-operation加载common的Security配置,放行合法请求; - 业务处理与响应:Controller处理逻辑后,结果经网关回传前端。
三、401/403异常原因及拦截逻辑
1. 401异常(未认证)
流程图
graph LRA[前端] -->|1.请求/admin/login| B[网关]B -->|2.转发到admin-operation| C[admin-operation]C -->|3.默认Security拦截<br/>(无common配置,需认证)| E[返回401<br/>“未认证”]E --> C --> B --> A
核心原因
admin-operation依赖common但缺少Security配置,启用Spring Security默认规则(所有请求需登录认证,默认用户user+随机密码),请求无认证信息被拦截。
拦截位置
admin-operation的Security过滤器链(FilterSecurityInterceptor)。
2. 403异常(禁止访问)
流程图
graph LRA[前端] -->|1.发送OPTIONS预检请求<br/>(跨域检查)| B[网关]B -->|2.无跨域配置 → 拦截| F[返回403<br/>“跨域禁止”]F --> B --> AA -->|3.网关加载common的Security| BB -->|4.CSRF校验失败 → 拦截| G[返回403<br/>“CSRF错误”]G --> B --> A
核心原因
- 跨域配置缺失:前端跨域访问时,浏览器先发OPTIONS预检请求,网关未配置CORS导致拦截;
- Security依赖干扰:网关依赖
common后,间接加载Security配置(虽为Servlet配置,但残留逻辑引发CSRF校验失败)。
拦截位置
网关的CORS过滤器(无配置时)或Security过滤器(残留配置时)。
四、异常解决策略
1. 401异常解决:sky-common添加全局Security配置
在sky-common中创建SecurityCommonConfig,统一放行业务接口:
@Configuration
@EnableWebSecurity
public class SecurityCommonConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable() // 关闭CSRF校验.authorizeRequests().antMatchers("/admin/**").permitAll() // 放行业务接口.anyRequest().permitAll();http.httpBasic().disable(); // 关闭默认认证}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder(); // 避免默认密码报错}
}
2. 403异常解决:网关针对性配置
(1)添加跨域配置(sky-server-gateway)
@Configuration
public class GatewayCorsConfig {@Beanpublic CorsWebFilter corsWebFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedOriginPattern("*"); // 允许跨域源config.addAllowedMethod("*"); // 允许所有请求方法config.setAllowCredentials(true); // 允许携带CookieUrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}
(2)排除sky-common的Security依赖(网关pom.xml)
<dependency><groupId>com.sky</groupId><artifactId>sky-common</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></exclusion></exclusions>
</dependency>
五、关键配置总结
| 配置场景 | 核心代码/操作 | 作用 |
|---|---|---|
common的Security配置 |
csrf().disable()+permitAll() |
让业务服务放行接口,避免401 |
| 网关跨域配置 | CorsWebFilter+允许跨域源/方法 |
处理OPTIONS预检请求,避免跨域403 |
| 网关依赖排除 | 排除spring-boot-starter-security |
避免网关加载Security配置,消除干扰 |
六、最终正常流程
graph LRA[前端] -->|1.OPTIONS预检请求| B[网关]B -->|2.跨域配置处理<br/>允许跨域| AA -->|3.真实请求/admin/login| BB -->|4.转发到admin-operation| C[admin-operation]C -->|5.common的Security放行| D[Controller处理]D -->|6.返回结果| C --> B --> A
核心结论:异常本质是模块依赖传递导致的配置冲突+关键配置缺失,通过“common统一配置+网关针对性适配”,可实现请求顺畅流转。