• 【基础架构设计】仿12306系统公共组件设计深度解析


    仿12306系统学习

    学习路线

    12306 铁路购票系统学习总体分为三块:组件库开发、业务梳理以及业务系统开发。

    image-20230916131704724

    组件库开发

    组件库的产出源于对公共功能的封装,避免了在不同项目之间相互复制代码的情况。当然,如果这种复制代码的方式出现问题,那么需要同时对所有项目进行改造,从成本和优雅设计的角度来看并不可取。

    为了统一各个项目可能使用的公共内容,我们在这里规划了常用且通用的功能点,供大家使用,以提高编码效率。如果有一些好的想法,在通用的前提下,可以联系我们将其加入到各自语义的起始包中。

    组件库的开发宗旨是汇总资源,更高效地提供业务敏捷开发的能力,后续的迭代也将遵循这一原则。目前,这只是一个起点,是整体规划的一部分,还有许多可以提升的空间。

    目前已有组件如下,可能新增加的组件更新不及时,实际以代码库 /frameworks 目录下为准。

    image-20230916131845712

    业务梳理

    在 12306 铁路购票系统中,包括会员、购票、订单、支付以及网关服务。

    12306_biz_20230720-1

    GatewayServiceApplication<网关服务>

    自定义局部过滤器

    /**
     * SpringCloud Gateway Token 拦截器
     *
     * @公众号:马丁玩编程,回复:加群,添加马哥微信(备注:12306)获取项目资料
     */
    @Component
    public class TokenValidateGatewayFilterFactory extends AbstractGatewayFilterFactory<Config> {
    
        public TokenValidateGatewayFilterFactory() {
            super(Config.class);
        }
    
        /**
         * 注销用户时需要传递 Token
         */
        public static final String DELETION_PATH = "/api/user-service/deletion";
    
        @Override
        public GatewayFilter apply(Config config) {
            return (exchange, chain) -> {
                ServerHttpRequest request = exchange.getRequest();
                String requestPath = request.getPath().toString();
                if (isPathInBlackPreList(requestPath, config.getBlackPathPre())) {
                    String token = request.getHeaders().getFirst("Authorization");
                    // TODO 需要验证 Token 是否有效,有可能用户注销了账户,但是 Token 有效期还未过
                    UserInfoDTO userInfo = JWTUtil.parseJwtToken(token);
                    if (!validateToken(userInfo)) {
                        ServerHttpResponse response = exchange.getResponse();
                        response.setStatusCode(HttpStatus.UNAUTHORIZED);
                        return response.setComplete();
                    }
    
                    ServerHttpRequest.Builder builder = exchange.getRequest().mutate().headers(httpHeaders -> {
                        httpHeaders.set(UserConstant.USER_ID_KEY, userInfo.getUserId());
                        httpHeaders.set(UserConstant.USER_NAME_KEY, userInfo.getUsername());
                        httpHeaders.set(UserConstant.REAL_NAME_KEY, URLEncoder.encode(userInfo.getRealName(), StandardCharsets.UTF_8));
                        if (Objects.equals(requestPath, DELETION_PATH)) {
                            httpHeaders.set(UserConstant.USER_TOKEN_KEY, token);
                        }
                    });
                    return chain.filter(exchange.mutate().request(builder.build()).build());
                }
                return chain.filter(exchange);
            };
        }
    
        private boolean isPathInBlackPreList(String requestPath, List<String> blackPathPre) {
            if (CollectionUtils.isEmpty(blackPathPre)) {
                return false;
            }
            return blackPathPre.stream().anyMatch(requestPath::startsWith);
        }
    
        private boolean validateToken(UserInfoDTO userInfo) {
            return userInfo != null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    Gateway 分类:局部过滤器全局过滤器

    • 局部过滤器(GatewayFilter):应用到单个路由或者一个分组的路由上。
    • 全局过滤器(GlobalFilter):应用到所有的路由上。
  • 相关阅读:
    Spring系列七:JDK 动态代理和 CGLIB 代理
    vue用axios在页面直接调用接口完整版(代码源码)最新(四)
    【论文解析】笔触渲染生成 前沿工作梳理
    Java对象内存结构和创建过程
    2023 版 Java和python开发线性代数探索
    新手面试官需要做好哪些工作
    buildroot添加package包
    红黑树实现map、set基本功能
    基于mediasoup的webrtc server,性能压测时发现带宽利用率偏低(40%)
    Spring:现代Java开发的必备框架
  • 原文地址:https://blog.csdn.net/Bankcary/article/details/134039772