【华为云技术分享】刚填了一个奇怪的坑

最近写了一个 API Token 的校验服务,想要增加时效性控制,比如一个 API,超过一段时间(比如 10s)之后,用同样的参数再请求就会被服务器禁掉,无法获取正常数据,这样可以保证数据的安全。

怎么增加时效性控制呢?加一个时间的信息就好了,我们可以把时间信息包含在一个 API URL 的额外的参数 token 里面。比如最简单的,把前端获取的时间戳进行 Base64 编码之后作为 token,这个 token 会传递给后端,后端会对获取到的 token 进行解码,对获取到的时间戳进行校验,如果 Token 里面的时间戳和 Server 端的时间戳相差不超过一定的时间阈值(比如 10s),那就正常返回结果。如果超过一定的时间,服务器就直接返回 401 状态码,不会返回正常数据,这样可以保证接口的实时性,进一步保证安全。

但是现在遇到了一个问题,我一开始把二者的时间差阈值设置成了 10 秒,在本地测试没有问题,完全 OK,接口可以正常获取数据。怪的问题来了,我把项目部署到服务器上,发现怎么着都不行,一直返回 401 状态码。经过调试发现是前后端在同一时间获取到的时间戳是不一样的,足足相差了有 16 秒,服务器获取的时间戳比客户端慢了 16s,这导致在同一时刻二者并不能达到阈值条件,导致接口一直不能获取正常数据。

这到底是是为什么?为啥部署到服务器上之后,时间戳差别这么大呢?

原因

其实原因在于,服务器没有对时间进行校准,时间有偏差,我也是醉了。。

为了校准时间,我搜寻了过一些相关的知识,找到了 NTP 服务器相关问题,这里将时间和 NTP 相关问题记录一下。

时间

接下来我们先看看时间和时区相关的内容吧。

时区

按照常识来说,一天被划分 24 小时,近似球体的地球是 360 度,所以我们使用经纬度为坐标,将全球划分为 24 个时区。

国际上规定,每隔 15 度划分一个时区,全球可分为 24 个时区。以本初子午线为基准,从西经 7.5° 至东经 7.5°,划分为中时区,或叫零时区,每时区区时相差一小时,东加西减。

下面看看图,估计大家地理上也学过。

东八区

格林尼治时间为世界标准时间,即中时区的时间。又因为东半球(格林尼治以东)的时间比较早,中国的经度在 120°E,是位于第八个时区,所以我们是在东八区,我们国家统一也用的东八区时间作为北京时间。

UTC 时间

UTC,全称为 Coordinated Universal Time,表示协调通用时间,根据原子振荡周期所计算的物理时钟,这种计算方式对于时间的计算误差时很小的。

GMT 时间

GMT,全称为 Greenwich Mean Time,表示的是格林尼治时间,是根据地球的自转周期计算的标准时间,由于各种不稳定因素的影响,计时不是很理想。

软件时钟

表示的是 Linux 操作系统从 1970 年 01 月 01 日(中时区)开始计算的时间。

硬件时钟

主机硬件上面的时钟,主要是 BIOS 内部时间的记录的时间。

时间戳

时间戳是指格林威治时间 1970 年 01月 01日 00 时 00 分 00 秒(北京时间 1970 年 01 月 01 日 08 时 00 分 00 秒)起至现在的总毫秒数。

时间戳不区分时区,全世界一样。

NTP 服务器

了解了一些时间的定义之后,我们再来了解下 NTP 服务器相关的内容。

NTP 服务器是干嘛的?

来看看官方定义:

NTP(Network Time Protocol)服务器,是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS 等等)做同步化,它可以提供高精准度的时间校正(LAN 上与标准间差小于 1 毫秒,WAN 上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。时间按 NTP 服务器的等级传播。按照离外部 UTC 源的远近把所有服务器归入不同的 Stratum(层)中。

懂了吧,NTP 服务器就是提供时间信息的,我们通过 NTP 服务器可以获取当前时间。

NTP 服务器怎样同步时间

那世界上肯定有很多 NTP 服务器吧,它们怎么同步时间的呢?

下面我们再来看看 NTP 服务器的特性:

NTP 提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间 UTC。NTP 获得 UTC 的时间来源可以是原子钟、天文台、卫星,也可以从 Internet 上获取。这样就有了准确而可靠的时间源。时间按 NTP 服务器的等级传播。按照离外部 UTC 源的远近将所有服务器归入不同的 Stratum(层)中。Stratum-1 在顶层,有外部 UTC 接入,而 Stratum-2 则从 Stratum-1 获取时间,Stratum-3 从 Stratum-2 获取时间,以此类推,但 Stratum 层的总数限制在 15 以内。所有这些服务器在逻辑上形成阶梯式的架构相互连接,而 Stratum-1 的时间服务器是整个系统的基础。

计算机主机一般同多个时间服务器连接, 利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源来校正主机时间。即使主机在长时间无法与某一时间服务器相联系的情况下,NTP 服务依然有效运转。

为防止对时间服务器的恶意破坏,NTP 使用了识别(Authentication)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制。

所以,可以看到,经过 Stratum 的层层传播,各个 NTP 服务器实现了时间同步。

各个 NTP 服务器的时间基本都是很精确的,我们可以从 NTP 服务器来获取时间,但由于网络时延问题,可能相差一点点。

NTP 服务器列表

NTP 全球太多太多了,比如全球、每个大洲、大公司、高校都会有自己的 NTP 服务器。

例如:

•全球:pool.ntp.org•亚洲:asia.pool.ntp.org•北美洲:north-america.pool.ntp.org•中国教育网:edu.ntp.org.cn•上交:ntp.sjtu.edu.cn•微软:time.windows.com•苹果:time.apple.com

等等,当然我们也可以自己设置自己想用的 NTP 服务器。

NTP 服务器校准

那么回到我的问题,我的服务器的时间没有经过校准,导致时间差距这么大。所以我可以使用 NTP 服务器对时间进行校准就好了。

服务器是 Ubuntu 系统,校准流程如下。

首先服务器上安装 ntpdate:

sudo apt install ntpdate

然后校准时间,输入任意一个 NTP 服务器地址就行了:

sudo ntpdate time.apple.com

经过校准之后,发现时间就一致了,问题解决。

参考

•https://baike.baidu.com/item/%E4%B8%AD%E6%97%B6%E5%8C%BA/339115

•https://baike.baidu.com/item/NTP%E6%9C%8D%E5%8A%A1%E5%99%A8/8633994

•https://blog.csdn.net/qq_36294875/article/details/79491614

•https://segmentfault.com/q/1010000021645848/a-1020000021645987

•https://www.weibo.com/ttarticle/p/show?id=2309403955443172016290

作者:华为云云享专家 崔庆才静觅

原文地址:https://www.cnblogs.com/huaweicloud/p/12384556.html

时间: 2024-10-06 17:14:31

【华为云技术分享】刚填了一个奇怪的坑的相关文章

【华为云技术分享】如何做一个优秀软件-可扩展的架构,良好的编码,可信的过程

1.可信软件的基础是软件优秀 可信突破是阶段性工作,可信只是优秀软件的一部分,单独追求可信是缘木求鱼. 2.什么是优秀软件 要系统的考虑如何开发优秀软件 对外:功能多,性能好,用户体验好,生态丰富 内部:逻辑简洁清晰,可扩展性好,可维护性好,过程可视 3.怎么做——软件没有银弹 3.1首先要做好架构.骨架好了,才能画好美人 3.1.1架构是每个人的事情,不只是架构师的事情 业务各个环节的人都要有架构思维,架构思维包括两种思维: 系统性思维:系统性是指所有与业务相关的事情都要考虑.例如: 1.设计

王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019【华为云技术分享】

演讲嘉宾 | 王晶(华为云人工智能高级算法工程师王晶) 出品 | AI科技大本营(ID:rgznai100) 近期,由 CSDN 主办的 2019 中国AI 开发者大会(AI ProCon 2019)在北京举办.在计算机视觉技术专题,华为云OCR人工智能高级算法工程师王晶分享了“文字识别服务的技术实践.底层框架及应用场景”的主题演讲. 演讲的第一部分,他分享了文字检测和识别的基础知识以及难点和最新进展.第二部分是华为云文字识别服务关键能力.关键技术,以及落地过程中遇到的“坑”,这对其他人工智能产

华为云实战开发】5.如何快速创建免费Git代码仓库【华为云技术分享】

1 文章目的 本文主要帮助已经掌握或者想要掌握Git的开发者,如何更好的应用Git,以及更好的将Git与DevCloud结合应用. 2 概述 2.1 版本控制系统介绍 从狭义上来说,版本控制系统是软件项目开发过程中管理代码所有修订版本的软件,能够存储.追踪文件的修改历史,记录多个版本的开发和维护,事实上我们可以将任何对项目有帮助的文档交付版本控制系统进行管理.版本控制系统(Version Control Systems)主要分为两类,集中式和分布式. 2.1.1 集中式版本控制系统 集中式版本控

【华为云技术分享】如何设计高质量软件-领域驱动设计DDD(Domain-Driven Design)学习心得

DDD做为软件设计方法于2004年提出,一直不温不火,最近几年突然火起来了,为啥呢?正所谓机会给有准备的人,因为微服务的流行,大家都跃跃欲试把传统单体软件转成微服务架构,但理论很丰满,现实很骨感,光是分解微服务就让人找不到北,而DDD是歪打正着也好,富有远见也好,正好适合微服务转型设计,不火都难. 最近学习了领域驱动设计(Domain-Driven Design),感觉受益匪浅,那到底啥是DDD呢?这里分享一下学习心得.网上有很多详细的资料,感兴趣可以看看这个https://www.infoq.

【华为云技术分享】漫谈LIteOS-物联网操作系统介绍

[摘要] 本文主要对于目前物联网操作系统的定义以及主要特点进行了分析,最后介绍了几个常见的物联网操作系统. 1简介 提到操作系统,可能首先想到的就是苹果操作系统,windows,Linux,Unix,Android,IOS等,显然目前比较为人熟知的操作系统基本都是一些手机或者电脑端的操作系统.而随着互联网技术的不断发展,硬件的体积越来越小,物联网技术也迎来了爆棚式的发展.物理网不同于 互联网的不同在于后者更关注的是人与人的互联,而前者是更加强调人与物,物与物的连接,从而实现万物互联(IOT).显

【我的物联网成长记3】如何开发物联网应用?【华为云技术分享】

[摘要] 物联网应用是设备管理.故障监测.数据分析的重要工具.本文介绍如何基于物联网平台开发应用,包括API.SDK和图形化开发三种方式. -------------------整体方案------------------- 物联网应用是企业和开发者进行设备管理.告警&故障监测.业务监控.数据分析的重要工具.物联网平台屏蔽了设备接入的复杂性和协议的差异性,解耦应用与设备,为上层应用提供统一格式的数据,简化终端厂商开发的同时,也让应用提供商聚焦于自身的业务开发.基于华为物联网平台的应用开发方案如下

MarkDown添加图片的三种方式【华为云技术分享】

Markdown插图片有三种方法,各种Markdown编辑器的插图方式也都包含在这三种方法之内. 插图最基础的格式就是: ![Alt text](图片链接 "optional title") 插入本地图片 只需要在基础语法的括号中填入图片的位置路径即可,支持绝对路径和相对路径. 例如: ![avatar](/home/picture/1.png) 插入网络图片 只需要在基础语法的括号中填入图片的网络链接即可,现在已经有很多免费/收费图床和方便传图的小工具可选. 例如: ![avatar

华为云流媒体性能测试解决方案 轻松应对流量危机【华为云技术分享】

背景 随着带宽提速和互联网发展,内容丰富.形式多样的视频正成为碎片化时代娱乐消费的新宠,短视频.视频直播.在线钢琴陪练.合唱直播一系列新玩法层出不穷,涉及电竞.社交.电商.教育等各个行业.网络视频快速发展对系统性能带来了巨大的考验. 流媒体业务场景 下面是用户与流媒体服务器的简化交互关系,主要分为推流和拉流2大类. 推流就是从外界采集数据后利用流媒体协议将文件推流至流媒体服务器端,拉流就是将文件从流媒体服务器拉取至本地播放的过程,流媒体的文件主要是由音频和视频2个部分组成,youtube.土豆.

【华为云技术分享】技术探秘:华为云瑶光何以定方向

作为北斗第七星,瑶光自古就可用来判断四季更迭.引向定时.而作为全新发布的智能云操作系统,瑶光智慧云脑又是如何做到统领云上各类资源.实现租户需求与资源供应之间最佳匹配的呢?在华为云瑶光实验室.华为云算法创新实验室里,我们找到了答案. #初识资源调度# 云OS:我太“南”了 依托虚拟化技术,我们得以将数据中心海量的计算.存储资源以云服务的形式对外提供.而随着数据中心规模扩展.边缘计算带来的算力延伸,承担着高效.精准资源调度的云操作系统面临着三大挑战: 第一个挑战是云计算的资源消耗/售卖模式带来的.云