苍穹外卖-异常排查笔记:拆分微服务后出现的401,403报错处理

苍穹外卖微服务模块调用与异常排查笔记

问题背景与要解决的问题

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 TD A[前端<br/>(浏览器/Postman)] --> B[sky-server-gateway<br/>网关] B --> C[sky-server-admin-operation<br/>管理端业务服务] C -.-> D[sky-common<br/>公共配置/工具] B -.-> D

二、正常请求调用流程

1. 流程图

graph LR A[前端] -->|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.返回响应结果| C C -->|5.回传响应| B B -->|6.返回结果给前端| A

2. 步骤说明

  1. 前端发起请求:访问网关统一入口(如8080端口);
  2. 网关路由转发:根据Path=/admin/**规则,将请求转发到admin-operation8081端口);
  3. Security过滤admin-operation加载common的Security配置,放行合法请求;
  4. 业务处理与响应:Controller处理逻辑后,结果经网关回传前端。

三、401/403异常原因及拦截逻辑

1. 401异常(未认证)

流程图

graph LR A[前端] -->|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 LR A[前端] -->|1.发送OPTIONS预检请求<br/>(跨域检查)| B[网关] B -->|2.无跨域配置 → 拦截| F[返回403<br/>“跨域禁止”] F --> B --> A A -->|3.网关加载common的Security| B B -->|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 {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()          // 关闭CSRF校验
            .authorizeRequests()
                .antMatchers("/admin/**").permitAll() // 放行业务接口
                .anyRequest().permitAll();
        http.httpBasic().disable();    // 关闭默认认证
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(); // 避免默认密码报错
    }
}

2. 403异常解决:网关针对性配置

(1)添加跨域配置(sky-server-gateway

@Configuration
public class GatewayCorsConfig {
    @Bean
    public CorsWebFilter corsWebFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOriginPattern("*"); // 允许跨域源
        config.addAllowedMethod("*");       // 允许所有请求方法
        config.setAllowCredentials(true);   // 允许携带Cookie
        
        UrlBasedCorsConfigurationSource 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 LR A[前端] -->|1.OPTIONS预检请求| B[网关] B -->|2.跨域配置处理<br/>允许跨域| A A -->|3.真实请求/admin/login| B B -->|4.转发到admin-operation| C[admin-operation] C -->|5.common的Security放行| D[Controller处理] D -->|6.返回结果| C --> B --> A

核心结论:异常本质是模块依赖传递导致的配置冲突+关键配置缺失,通过“common统一配置+网关针对性适配”,可实现请求顺畅流转。

posted @ 2025-11-30 16:32  WILK  阅读(2)  评论(0)    收藏  举报