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

news2024/11/15 9:40:45

仿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;
    }
}

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

  • 局部过滤器(GatewayFilter):应用到单个路由或者一个分组的路由上。
  • 全局过滤器(GlobalFilter):应用到所有的路由上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1132638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红酒种类及更多的红酒基本知识

从法国不拘一格的绿色牧场到北加州的金山&#xff0c;各种不同类型的红葡萄酒从淡色到豪放&#xff0c;从各种不同的种植地区走向世界各地的餐桌。来自云仓酒庄品牌雷盛红酒分享红葡萄酒在味道、酒体、颜色、香味以及它们提供的整体体验方面可以有很大的不同。 为合适的场合选…

amr文件苹果手机怎么打开?四个方法教会你!

Amr格式文件因其资源占用率低、传输方便&#xff0c;通常用作各大手机厂商广泛使用的一种保存录音文件的格式&#xff0c;非常适合制作来电铃声。但是amr音频格式的适用范围有限&#xff0c;很多时候就需要把amr转换成兼容性更好的mp3格式。如何将AMR文件转换为mp3然后在苹果手…

Linux 内核文件系统dentry_path_raw函数

文章目录 一、简介1.1 __dentry_path1.2 prepend_name1.3 d_path 二、dmeo参考资料 一、简介 // linux-5.4.18/fs/d_path.cchar *dentry_path_raw(struct dentry *dentry, char *buf, int buflen) {return __dentry_path(dentry, buf, buflen); } EXPORT_SYMBOL(dentry_path_r…

语雀停服8小时,P0级事故,故障原因和补偿来了。

昨天互联网圈子里发生了一件大事&#xff0c;那就是语雀的 P0 级事故&#xff0c;前后足足停服了 7 个多小时&#xff0c;放眼整个互联网的发展史&#xff0c;都是相当炸裂的表现。 语雀是技术大牛玉伯在蚂蚁金服内部孵化出来的一个云端知识库&#xff0c;整体的界面非常清爽&…

[SQL开发笔记]IN操作符: 在WHERE子句中规定多个值

上一实例我们在where子句使用(year2022 or year2020)&#xff0c;如果我们需要在WHERE子句中规定多个值呢&#xff1f;这时我们将学习IN操作符 一、功能描述&#xff1a; 在WHERE子句中规定多个值。 二、IN操作符语法详解&#xff1a; IN操作符语法&#xff1a; SELECT col…

【Linux】MAC帧协议 + ARP协议

文章目录 &#x1f4d6; 前言1. 数据链路层2. MAC帧格式3. 再谈局域网4. ARP协议4.1 路由器的转发过程&#xff1a;4.2 ARP协议格式&#xff1a; 5. 如何获得目的MAC地址 &#x1f4d6; 前言 在学完网络层IP协议之后&#xff0c;本章我们将继续向下沉一层&#xff0c;进入到数…

STM32-通用定时器

通用定时器 通用定时器由一个可编程预分频器驱动的16位自动重新加载计数器组成。应用&#xff1a;测量输入的脉冲长度信号&#xff08;输入捕获&#xff09;、产生输出波形&#xff08;输出比较和PWM&#xff09;。 脉冲长度和波形周期可以从几微秒调制到几毫秒&#xff0c;使用…

记录隐藏挖矿木马rcu_tasked的查杀

记录一次项目中挖矿病毒的经历 这是黑客使用的批量蔓延病毒的工具&#xff0c;通过如下脚本 [rootServer .cfg]# cat /home/pischi/.bash_history cd /root/ nvidia-smi;ls -a;cd .cfg;ls -a;wc -l ip ./key 20 -f ip pass 22 "nproc;nvidia-smi;rm -rf .cfg;mkdir .cfg…

怎么做好网络软文推广?媒介盒子为你揭秘

不管是初创公司还是成熟公司&#xff0c;都需要打响品牌知名度&#xff0c;而有些公司在网络推广中的预算不是很高&#xff0c;这个时候就可以利用软文进行推广&#xff0c;今天媒介盒子就来告诉大家&#xff0c;如何写好网络推广软文。 一、 明确推广目标 确定推广目标有助于…

【备考网络工程师】如何备考2023年网络工程师之常见考点篇(1)

文章目录 写在前面涉及知识点1、NSLOOKUP命令设置的几个类型&#xff08;DNS服务器资源记录类型&#xff09;2、结构化综合布线系统的组成3、xDSL及相关概念4、私有地址及A-E类地址4.1 、私有地址4.2 、A-E类地址 总结 写在前面 其实做模拟或真题时候&#xff0c;总是会在关键…

建联合作1000+达人,如何高效管理?

随着社交媒体的发展&#xff0c;达人营销已成为品牌营销重要的方式之一&#xff0c;甚至可以说是必选项。 对于很多品牌商家来说&#xff0c;一次合作几百个不同类型、不同社媒平台的达人&#xff0c;已屡见不鲜。在电商大促前、主推单品爆品时&#xff0c;同时合作上千个达人&…

通过js来实现用身份证号来判断性别和出生年月

html: <input type"text" id"shenfenzhenghao" oninput"hao()" placeholder"证件号"><input type"text" id"xingbie" disabled"disabled" placeholder"性别"><input type&qu…

CVPR 2024 延期!

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【计算机视觉和Transformer】交流群 扫码加入CVer知识星球&#xff0c;可以最快学习到最新顶会顶刊上的论文idea和CV从入门到精通资料&#xff0c;以及最前沿项目和应用&…

『第五章』二见痴心:初识小雨燕(中)

在本篇博文中,您将学到如下内容: 7. 值类型与引用类型8. OOP与POP9. 协议与扩展10. 函数与闭包11. 泛型和宏总结相逢情便深,恨不相逢早 玲珑骰子安红豆,入骨相思知不知。 7. 值类型与引用类型 在 Swift 中我们可以将之前介绍的那些数据类型分为两大类:值类型和引用类型。 …

做好微信私域,一定要知道的5大触点

越来越多人意识到私域的重要性&#xff0c;也有越来越多人在私域中获益。 把用户私有化&#xff0c;只是第一步。 我们还要和用户建立联系&#xff0c;要一直互动。 也就是说&#xff0c;我们必须高频地和用户互动&#xff0c;要不断去触达他们。而触达&#xff0c;就需要触点。…

科大讯飞发布讯飞星火 3.0;开源AI的现状

&#x1f680; 科大讯飞发布讯飞星火 3.0&#xff0c;综合能力超越ChatGPT&#xff08;非GPT-4版&#xff09; 摘要&#xff1a;科大讯飞在2023全球1024开发者节上宣布讯飞星火 3.0正式发布&#xff0c;号称综合能力已超越ChatGPT。据介绍&#xff0c;星火认知大模型 V3.0在文…

2023年中国临床决策支持系统发展趋势分析:综合性决策系统将成市场主流[图]

临床决策支持系统是一种利用人工智能原理与方法为医疗工作者提供合理解决方案的计算机系统。通过将医疗信息处理、解决方案智能推荐等AI技术与多年临床经验、循证医学有机结合&#xff0c;临床决策支持系统能够在疾病诊断、医学检查、疗法推荐、用药监测等各个环节提供决策支持…

禁止拷贝文件到U盘的解决办法

禁止拷贝文件到U盘的解决办法 安企神U盘管理系统下载使用 说到这问题&#xff0c;大多情况下是企业的需求&#xff0c;很多公司电脑中都保存着极为重要的数据&#xff0c;这些数据往往是不能传播的&#xff0c;所以此时就需要禁止拷贝文件到U盘来防止公司数据被泄密。 禁止拷…

Go学习第八章——面向“对象”编程(结构体与方法)

Go面向“对象”编程&#xff08;结构体与方法&#xff09; 1 结构体1.1 快速入门1.2 内存解析1.3 创建结构体四种方法1.4 注意事项和使用细节 2 方法2.1 方法的声明和调用2.2 快速入门案例2.3 调用机制和传参原理2.4 注意事项和细节2.5 方法和函数区别 3 工厂模式 Golang语言面…

代码随想录打卡第五十天|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍 题目&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 …