就这么一个简单的校验,80%的程序员却做不到,更不理解!

在学生管理系统里,其中会有学生信息采集的功能。程序结构不外乎下面的分层实现方式。

就这么一个简单的校验,80%的程序员却做不到,更不理解!

开发出来这个功能,我觉得大家都易如反掌了。

当然易如反掌。

OK,我要说的是数据校验,以最简单的非空校验(例如:学生姓名不可为空)来说:

首先,前端页面的表单要校验,为空则不允许提交,非空则调用后端api接口来post数据。

其次,后端程序的controller里要校验,为空则直接返回错误提示,非空则调用StudentService类。

再次,StudentService类要校验,为空则直接返回错误提示,非空则在其他校验通过后,进行数据的持久化。

上面的”再次”,在单体应用内不做校验也可————而一旦是在RPC调用的情况下,是必须要做的。

那么,聪明的你,有没有,或者曾经有没有,忽视上面的几处校验呢?

你也许会说 No, of course not. ————肯定会做校验呀。

你也许还会说 But why?————为什么要这么多处校验呢?一个地儿校验住不就完了吗?

First,为什么前端要校验?

–> 前端页面校验不通过时,则直接在页面提示给用户了,好处:①响应快,因为无须调用后端api,也减少了网络通信;②用户体验会好一些。

Second,前端已经校验了,为什么后端还要校验?

–> 正常情况下是不需要后端再校验了。 非正常情况下呢?例如,前端没拦住,再例如,请求不是前端发过来的…

Third,为什么service类还要校验?

–> 上面说了,如果是单体应用,你不校验也行。而如果是局域网RPC服务之间调用的话,你还真要加上这个校验。也是为了防止 非正常情况的。

在实际企业应用开发中,因为 非正常情况的概率性事件存在,所以,我们需要”重复地”来做这些校验。类似的需要多处”重复”做的校验包括:数据合法性校验、数据重复校验、幂等校验(幂等控制)、数据唯一性校验(数据防重控制)。

你也许会继续追问:哪有那么多 非正常情况呀????

你可以不”重复”做这些校验,而simply依靠请求链路里的only一个节点的校验来cover。那么,你这种”半裸奔”的系统没出现问题,只能说明你比较幸运。一直没出现问题,说明你一直比较幸运。

最近我们系统碰巧又出现了这样的事故。一个中台dubbo服务提供了数据的新增接口,供下游业务线调用。系统运行了大半年也没出现问题,而最近却翻车了。一个业务线在特定的分支逻辑里缺乏有效的防重控制,致使在业务高峰期不停地重复刷这个接口(传递同样的数据),而这个dubbo接口里没有做业务防重。瞬时的高频调用,不仅让dubbo服务出现故障,还造成了大量的重复数据。随之而来的是运营的催促,客户的投诉,我们在处理重复数据时,耗费了大量的人力和时间成本。这一张多米诺骨牌,让我们付出了惨痛的代价。

我是因为遇到了这么一个事故才写这个blog吗?

不是!许多大的事故往往就是类似小疏忽导致的。我遇到的这样的事故简直太多了。

你没有遇到这样的事故吗?

我不信!So,一番碎碎念,愿小伙伴们别再为这样的疏忽而翻车。

Original: https://www.cnblogs.com/buguge/p/16526829.html
Author: buguge
Title: 就这么一个简单的校验,80%的程序员却做不到,更不理解!

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616948/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Nginx配置https 之 找不到 ./configure

    Nginx配置https 之 找不到 ./configure 需求 要配置个https 问题 找不到文件在哪里 教程很简单,发现就是找不到 ./configure 这个文件这个文件…

    Java 2023年5月30日
    078
  • JAVA基础学习第五天!

    精华笔记: 1.循环结构: -for结构:应用率高、与次数相关的循环 1 )语法: // 1 2 3 for (要素1;要素2;要素3){ 语句块/循环体————-…

    Java 2023年6月13日
    064
  • Java集合框架之List

    1.List集合概要 2.Iterable接口 1.概要 2.重要方法 forEach方法:对Collection集合中的每个对象进行消费 List<student> …

    Java 2023年6月15日
    063
  • SpringBoot日志配置

    pom.xml org.projectlombok lombok true logback.xml(直接放在src/main/resources下) class="ch….

    Java 2023年5月30日
    073
  • ArrayList

    ArrayList与数组的区别: 1. 数组和ArrayList的本质区别在于前者是类型安全的,而后者是类型不安全的.2. ArrayList为了兼容所有类型对象,使用了Objec…

    Java 2023年6月6日
    074
  • 程序员的10个好习惯

    我总结了 10 个程序员的好习惯,今天分享给大家。 1. 引入新的技术栈的时候,要以官方文档为主 在项目里,无论使用新的 jar 包,还是用新的中间件,一定要去看官方文档。 现在网…

    Java 2023年6月7日
    066
  • 队列内存限制思路防止OOM

    前几天在一个开源项目的 github 里面看到这样的一个 pr: 光是看这个名字,里面有个 MemorySafe,我就有点陷进去了。 我先给你看看这个东西: 这个肯定很眼熟吧?我是…

    Java 2023年6月13日
    076
  • java Math类

    java.lang.Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单 常用…

    Java 2023年5月29日
    070
  • Hibernate获取数据java.lang.StackOverflowError

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年5月29日
    075
  • Linux 学习笔记(一)

    Linux学习笔记(一) 1.1Linux的文件权限 Linux一般将文件的可读写身份分为三个类别:拥有者(owner)、所属群组(group)、其他人(others),并且三种身…

    Java 2023年6月7日
    069
  • java1

    1. 自我介绍2. 讲一件你印象最深刻的事没事怎么解决的3. JAVA垃圾回收机制怎么工作的4. AOP是怎么实现的,有几种方式,分别说说5. TCP/UDP的区别是什么,怎么实现…

    Java 2023年5月29日
    063
  • Spring AOP

    一、AOP的概念 1、AOP:面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分的耦合度降低。提高程序的可重用性,同时提高了开发效率 2、AOP通俗…

    Java 2023年6月7日
    059
  • BlockingQueue阻塞队列

    BlockingQueue阻塞队列 BlockingQueue的四组API undefined public static void test01(){ ArrayBlocking…

    Java 2023年6月5日
    071
  • “OneNote由于某种原因,无法连接到服务器。请尝试检查您的连接以查看服务器是否可用。”的解决方案

    最近开始新的学习生活,使用OneNote做笔记。作为一个强迫症,无法创建新的笔记的问题让我很是难受。在这里看到了一个解决的方法→解决办法 更改DNS:1.打开控制面板-网络共享中心…

    Java 2023年6月5日
    074
  • Springboot中多层object嵌套转换类的处理方法?

    当springboot写后端接口时需要 传入一个多层嵌套的大类 UpdateAll (或者object)时,需要进行每一层object到类的转化,传入的前端参数形式为: {&#82…

    Java 2023年5月30日
    062
  • 数据库工具类

    数据库连接的工具类 数据库工具类 通过学习我们知道,连接一个数据库很麻烦,代码很多,而且像注册驱动这些代码我们在项目的启动后只需要执行一次。所以我们能不能写一个数据库连接的工具类呢…

    Java 2023年6月5日
    057
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球