跳过正文

亚信科技实习总结:从单体到微服务的架构重构之路

·246 字·2 分钟
黄振宇
作者
黄振宇

背景
#

2025年6月到2026年3月,我在亚信科技实习,参与了公司核心号卡业务系统的微服务重构项目。

这个项目是将一个基于 Spring Boot 的单体应用,逐步迁移至 Spring Cloud 微服务架构。作为实习生,我主要负责网关层优化、服务间通信、分布式事务等模块的设计与开发。

一、网关统一管理与路由优化
#

系统重构的第一步是建立统一的API网关。我们基于 Spring Cloud Gateway 对所有外部请求进行统一管理。

核心工作
#

  1. 路由转发优化:对原有路由规则进行二次封装,提升网关转发效率
  2. 全局过滤器:自定义全局过滤器,统一处理接口鉴权和请求耗时统计
  3. 异常处理:排查并修复空指针异常、请求404、网关转发失败等问题
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange,
                             GatewayFilterChain chain) {
        String path = exchange.getRequest().getURI().getPath();

        // 白名单路径直接放行
        if (isWhiteList(path)) {
            return chain.filter(exchange);
        }

        // Token 校验
        String token = exchange.getRequest()
            .getHeaders().getFirst("Authorization");
        if (token == null || !validateToken(token)) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        // 耗时统计
        long start = System.currentTimeMillis();
        return chain.filter(exchange).doFinally(signal -> {
            long cost = System.currentTimeMillis() - start;
            log.info("[Gateway] {} cost: {}ms", path, cost);
        });
    }

    @Override
    public int getOrder() {
        return -1;
    }
}
⚠️ 实际生产中,全局过滤器的 order 值要合理设置,确保鉴权过滤器优先于业务过滤器执行,同时要处理好白名单和健康检查接口的放行逻辑。

二、服务间通信与熔断降级
#

微服务拆分后,服务间调用变得频繁。我们基于 OpenFeign 封装外部请求接口进行远程调用,并使用 Sentinel 实现自定义降级策略。

@FeignClient(
    name = "card-service",
    fallbackFactory = CardServiceFallbackFactory.class
)
public interface CardServiceClient {

    @GetMapping("/card/query")
    Result<CardVO> queryCardInfo(@RequestParam("cardNo") String cardNo);
}

@Component
public class CardServiceFallbackFactory
    implements FallbackFactory<CardServiceClient> {

    @Override
    public CardServiceClient create(Throwable cause) {
        return new CardServiceClient() {
            @Override
            public Result<CardVO> queryCardInfo(String cardNo) {
                log.warn("卡服务降级触发: {}", cause.getMessage());
                return Result.fail("服务繁忙,请稍后重试");
            }
        };
    }
}

降级策略的核心思路:当某个服务不可用时,不直接抛异常,而是返回一个兜底结果,保证用户侧的体验不受影响。

三、Seata 分布式事务保障一致性
#

在微服务场景下,任务审批流程涉及多个服务协同操作。为保障数据一致性,我们采用 Seata AT 模式 实现分布式事务:

sequenceDiagram
    participant Client as 客户端
    participant GW as Gateway
    participant Approve as 审批服务
    participant Project as 项目服务
    participant TC as Seata TC

    Client->>GW: 提交审批请求
    GW->>Approve: 创建审批单
    Approve->>TC: 开启全局事务
    Approve->>Project: 更新项目状态
    Project->>TC: 注册分支事务
    Project-->>Approve: 操作成功
    Approve->>TC: 全局提交/回滚
    Approve-->>GW: 返回结果
    GW-->>Client: 响应

Seata AT 模式最大的好处是对业务代码零侵入,只需要加一个 @GlobalTransactional 注解,框架会自动管理事务的提交和回滚。

四、LiteFlow 可视化业务编排
#

在号卡业务中,很多流程涉及多个步骤的串联。我们引入 LiteFlow 框架,通过可视化配置界面来编排业务逻辑:

<chain name="cardProcessChain">
    THEN(
        validateParams,
        checkCardStatus,
        doBusiness,
        sendNotification
    );
</chain>

这样做的好处是业务人员可以通过界面拖拽调整流程顺序,不需要每次都改代码重新发布。

实习收获
#

这9个月让我从「能写CRUD」成长为「能参与微服务架构设计」:

能力维度 成长
架构思维 理解微服务设计原则,能参与技术方案评审
排错能力 独立排查生产环境的空指针、404、网关转发等问题
工程实践 LiteFlow编排、Docker部署、CI/CD流程
沟通协作 与产品、测试、前端团队高效协作