深度优先

这个家伙好懒,除了文章什么都没留下

0%

概述

这篇文章分享 API 接口设计规范,目的是提供给研发人员做参考。

规范是死的,人是活的,希望自己定的规范,不要被打脸。

路由命名规范

动作 前缀 备注
获取 get get{XXX}
获取 get get{XXX}List
新增 add add{XXX}
修改 update update{XXX}
保存 save save{XXX}
删除 delete delete{XXX}
上传 upload upload{XXX}
发送 send send{XXX}

请求方式

请求方式 描述
GET 获取数据
POST 新增数据
PUT 更新数据
DELETE 删除数据

请求参数

Query

url?后面的参数,存放请求接口的参数数据。

请求头,存放公共参数、requestId、token、加密字段等。

Body

Body 体,存放请求接口的参数数据。

公共参数

APP 端请求

参数 说明 备注
network 网络 WIFI、4G
operator 运营商 中国联通/移动
platform 平台 iOS、Android
system 系统 ios 13.3、android 9
device 设备型号 iPhone XR、小米9
udid 设备唯一标示
apiVersion API 版本号 v1.1、v1.2

WEB 端请求

参数 说明 备注
appKey 授权Key 字符串

调用方需向服务方申请 appKey(请求时使用) 和 secretKey(加密时使用)。

安全规范

敏感参数加密处理

登录密码、支付密码,需加密后传输,建议使用非对称加密

其他规范

  • 参数命名规范 建议使用驼峰命名,首字母小写。
  • requestId 建议携带唯一标示追踪问题。

返回参数

参数 类型 说明 备注
code Number 结果码 成功=1
失败=-1
未登录=401
无权限=403
showMsg String 显示信息 系统繁忙,稍后重试
errorMsg String 错误信息 便于研发定位问题
data Object 数据 JSON 格式

若有分页数据返回的,格式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"code": 1,
"showMsg": "success",
"errorMsg": "",
"data": {
"list": [],
"pagination": {
"total": 100,
"currentPage": 1,
"prePageCount": 10
}
}
}

安全规范

敏感数据脱敏处理

用户手机号、用户邮箱、身份证号、支付账号、邮寄地址等要进行脱敏,部分数据加 * 号处理。

其他规范

  • 属性名命名时,建议使用驼峰命名,首字母小写。
  • 属性值为空时,严格按类型返回默认值。
  • 金额类型/时间日期类型的属性值,如果仅用来显示,建议后端返回可以显示的字符串。
  • 业务逻辑的状态码和对应的文案,建议后端两者都返回。
  • 调用方不需要的属性,不要返回。

签名设计

签名验证没有确定的规范,自己制定就行,可以选择使用 对称加密非对称加密单向散列加密 等,分享下原来写的签名验证,供参考。

日志平台设计

日志平台有利于故障定位和日志统计分析。

日志平台的搭建可以使用的是 ELK 组件,使用 Logstash 进行收集日志文件,使用 Elasticsearch 引擎进行搜索分析,最终在 Kibana 平台展示出来。

幂等性设计

我们无法保证接口的每一次调用都是有返回结果的,要考虑到出现网络异常的情况。

举个例子,订单创建时,我们需要去减库存,这时接口发生了超时,调用方进行了重试,这时是否会多扣一次库存?

解决这类问题有 2 种方案:

一、服务方提供相应的查询接口,调用方在请求超时后进行查询,如果查到了,表示请求处理成功了,没查到就走失败流程。

二、调用方只管重试,服务方保证一次和多次的请求结果是一样的。

对于第二种方案,就需要服务方的接口支持幂等性。

大致设计思路是这样的:

  1. 调用接口前,先获取一个全局唯一的令牌(Token)
  2. 调用接口时,将 Token 放到 Header 头中
  3. 解析 Header 头,验证是否为有效 Token,无效直接返回失败
  4. 完成业务逻辑后,将业务结果与 Token 进行关联存储,设置失效时间
  5. 重试时不要重新获取 Token,用要上次的 Token

小结

限流设计、熔断设计、降级设计,这些就不多说了,因为大部分都用不到,当用上了基本上也都在网关中加这些功能。

暂时就想到这么多,规范这东西不是一成不变的,发现有不妥的及时调整吧。

https://www.cnblogs.com/xinliangcoder/p/12327088.html

因为在生产环境会遇到很多问题,那么最快的定位方式莫过于去看日志,我们都知道服务器每天会产生大量的日志,那么如何快速的定位也就是最关键的。

本文介绍六种查看日志的命令:tailheadcatmorelesssed

tail

命令功能

tail 命令从指定点开始将文件写到标准输出。

命令格式

tail[必要参数][选择参数][文件]

命令参数

1
2
3
4
5
6
7
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

使用实例

1
2
3
tail  -n  10   file.log   查询日志尾部最后10行的日志;
tail -n +10 file.log 查询第10行之后的所有日志;
tail -fn 100 file.log 循环实时查看最后100行记录
  • tail一般还会配合着grep
1
tail -fn 1000 file.log | grep '关键字'
  • 如果查询的数据量太大,Ctrl + F 或者 空格键可以翻页查看
1
tail -n 5000  file.log |more -1000

命令功能

headtail是相反,用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。

1
2
head -n  10  file.log   查询日志文件中的头10行日志;
head -n -10 file.log 查询日志文件除了最后10行的其他所有日志;

命令格式

tail[必要参数][选择参数][文件]

命令参数

参考tail

cat

命令功能

  1. 一次显示整个文件:cat filename
  2. 从键盘创建一个文件(只能创建新文件,不能编辑已有文件):cat > filename
  3. 将几个文件合并为一个文件:cat file1 file2 > file

命令格式

cat [选项] [文件]...

命令参数

1
2
3
4
5
6
7
8
9
-A, --show-all           等价于 -vET
-b, --number-nonblank 对非空输出行编号
-e 等价于 -vE
-E, --show-ends 在每行结束处显示 $
-n, --number 对输出的所有行编号,由1开始对所有输出的行数编号
-s, --squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行
-t 与 -vT 等价
-T, --show-tabs 将跳格字符显示为 ^I
-v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外

使用实例

  • file1.log 的文件内容加上行号后输入 file2.log 这个文件里
1
cat -n file1.log file2.log
  • file1.logfile2.log 的文件内容加上行号(空白行不加)之后将内容附加到 file.log
1
cat -b file1.log file1.log file.log
  • file1.log 的文件内容加上行号后输入 file.log 这个文件里
1
cat -n file1.log > file.log

tac 是将 cat 反写过来,所以他的功能就跟 cat 相反

more

命令功能

more命令和cat的功能一样都是查看文件里的内容,但有所不同的是more可以按页来查看文件的内容,还支持直接跳转行等功能。

命令语法

1
more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ]

命令参数

1
2
3
4
5
6
7
8
9
+n      从笫n行开始显示
-n 定义屏幕大小为n行
+/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示
-c 从顶部清屏,然后显示
-d 提示“Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃功能
-l 忽略Ctrl+l(换页)字符
-p 通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
-s 把连续的多个空行显示为一行
-u 把文件内容中的下画线去掉

常用操作命令

1
2
3
4
5
6
7
8
9
Enter 向下n行,需要定义,默认为1行
Ctrl + F 向下滚动一屏
空格键 向下滚动一屏
Ctrl + B 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号
V 调用vi编辑器
!命令 调用Shell,并执行命令
q 退出more

使用示例

  • 显示文件中从第3行起的内容
1
more +3 file.log
  • 从文件中查找第一个出现test字符串的行,并从该处前两行开始显示输出
1
more +/test file.log
  • 设定每屏显示行数
1
more -5 log2012.log

less

命令功能

lessmore类似,使用less可以随意浏览文件,而more仅能向前移动,不能向后移动,而 less 既可以向前移动,也可以向后移动。

命令格式

1
less [参数]  文件

命令参数

1
2
3
4
5
6
7
8
9
10
11
12
-b <缓冲区大小> 设置缓冲区的大小
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
-S 行过长时间将超出部分舍弃
-x <数字> 将“tab”键显示为规定的数字空格

常用操作命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
b 向后翻一页
d 向后翻半页
h 显示帮助界面
Q 退出less 命令
u 向前滚动半页
y 向前滚动一行
空格键 滚动一行
回车键 滚动一页
[pagedown]: 向下翻动一页
[pageup]: 向上翻动一页

less命令在查询日志时,一般流程是这样的

  1. less file.log
  2. shift + G 命令到文件尾部 然后输入 加上你要搜索的关键字例如:?test
  3. n 向上查找关键字
  4. shift + n 反向查找关键字

sed

命令功能

这个命令可以查找日志文件特定的一段 , 根据时间的一个范围查询,可以按照行号和时间范围查询

使用示例

  • 按照行号:只查看文件的第5行到第10
1
sed -n '5,10p' file.log
  • 按照时间段
1
sed -n '/2019-12-17 16:17:20/,/2019-12-17 16:17:36/p'  file.log

平常C#写的脚本和Python编译出来的程序在Windows平台cmd命令行运行会出现一个大黑框 还不能关闭,碍眼不说,关键不能开机自启;

其实Windows也能像Linux那样设置程序为后台运行,就是将其添加为服务;

此处需要使用到winsw 下载地址: https://github.com/kohsuke/winsw/releases

下载解压至任意目录并CD进入;

这里将下载WinSw.Net4.exe重命名为winsw.exe了,以方便后面操作;

创建与winsw同名的配置文件,后缀为xml

此处以配置FRP客户端为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<service>
    <!-- 该服务的唯一标识 -->
    <id>frp</id>
    <!-- 该服务的名称 -->
    <name>frp0.27.1-windows-amd64</name>
    <!-- 该服务的描述 -->
    <description>frpc客户端 这个服务用 frpc 实现内网穿透</description>
    <!-- 要运行的程序路径 -->
    <executable>D:\Software\frp\frp_0.27.1_windows_amd64\frpc.exe</executable>
    <!-- 携带的参数 -->
    <arguments>-c frpc.ini</arguments>
    <!-- 第一次启动失败 60秒重启 -->
    <onfailure action="restart" delay="60 sec"/>
    <!-- 第二次启动失败 120秒后重启 -->
    <onfailure action="restart" delay="120 sec"/>
    <!-- 日志模式 -->
    <logmode>append</logmode>
    <!-- 指定日志文件目录(相对于executable配置的路径) -->
    <logpath>logs</logpath>
</service>

开始使用:
以管理员身份运行PowerShell,注册服务,启动服务

常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
//注册服务
.\winsw.exe install
//卸载服务
.\winsw.exe uninstall
//启动服务
.\winsw.exe start
//停止服务
.\winsw.exe stop
//重启服务
.\winsw.exe restart
//查看状态
.\winsw.exe status

注册服务时如果被某60拦截了需要点允许,如果提示:FATAL - WMI Operation failure: AccessDenied 则需要以管理员方式运行CMD再试;

不出意外的话打开任务管理器就能看到刚刚添加的服务了

从服务里面看 可执行文件的路径是:”D:\Software\frp\frp_0.27.1_windows_amd64\winsw”

实际是 winsw.xml 中 executable 中的路径 不影响功能