- 引入链路追踪和 APM 工具 skywalking
- 针对个服务模块,制定统一的验签、权限设计
- demo 演示 APM 工具效果
- 根据 kratos 框架的架构封装 go2sky 的 tracer 用于上下游追踪
SkyWalking 架构
SkyWalking 逻辑上分为四部分,分别为探针, 平台后端, 存储和用户界面。
SkyWalking 提供了 Go、PHP、Node.js、Python、Java、dotnet等语言的探针客户端。客户端采用 gRPC 协议和OAP Server(Observability Analysis Platform) 进行通信,将客户端的请求链路发送至平台后端。
内部服务调用的验签设计
公共请求参数
参数名 | 参数描述 | 参数类型 | 是否必须 |
---|---|---|---|
service_id | 服务调用方的应用统称描述 | string | 是 |
request_at | 服务调用方请求时的时间,时间格式为 yyyy-mm-dd HH:ii:ss。示例:2020-10-11 06:06:30 | string | 是 |
sign | 签名串 | string | 是 |
服务名对应的统一描述
服务名 | 统一描述 | |
---|---|---|
SaaS 基础服务 | saas-base-svc | |
SaaS 随访就诊服务 | saas-consulation-svc | |
SaaS 问卷调查服务 | saas-survey-svc |
签名串生成和验签规则
1. 构造规范化签名字符串
1.1 排序参数。排序规则以首字母顺序排序,排序参数包括公共请求参数和接口自定义参数,不包括公共请求参数中的 sign 参数。
当使用GET方法提交请求时,这些参数就是请求URL中的参数部分,即URL中
?
之后由&
连接的部分。
1.2 编码参数。使用UTF-8字符集按照RFC3986规则编码请求参数和参数取值,编码规则如下:
- 字符A~Z、a~z、0~9以及字符
-
、_
、.
、~
不编码。 - 其它字符编码成
%XY
的格式,其中XY
是字符对应ASCII码的16进制。示例:半角双引号("
)对应%22
。 - 扩展的UTF-8字符,编码成
%XY%ZA…
的格式。 - 空格( )编码成
%20
,而不是加号(+
)。
1.3 使用等号(=
)连接编码后的请求参数和参数取值。
1.4 使用与号(&
)连接编码后的请求参数,注意参数排序与步骤1一致。
2. 使用 HMAC-SHA1 哈希算法和签名秘钥对待签名字符串进行计算并使用Base64得到签名
2.1 按照如下伪代码的方法使用合适的语言实现来完成计算出最后的签名字符串。其中 StringToSign 是上一步得到的待签名字符串。secret 是签名秘钥。
sign = base64( hmac-sha1( secret, utf-8-encoding-of(StringToSign) ) )