Kratos代码审查清单:质量与安全检查要点
1. 架构设计检查
1.1 应用入口规范
- 验证
app.NewApp()初始化时是否正确加载必要模块(配置、日志、服务注册) - 检查
Run()方法是否包含优雅关闭逻辑:
// 正确示例
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
if err := app.Run(ctx); err != nil {
log.Errorw("app run failed", "err", err)
os.Exit(1)
}
1.2 服务注册与发现
- 确认使用
registry.Registry接口而非具体实现(依赖注入原则) - 检查服务注册元数据是否包含版本信息:
// 推荐写法
metadata := map[string]string{
"version": "v1.0.0",
"env": "production",
}
2. 核心组件检查
2.1 中间件链配置
- 验证中间件注册顺序是否合理(恢复->日志->认证->业务):
// 正确顺序示例
srv := http.NewServer(
http.Middleware(
recovery.Recovery(),
logging.Logging(),
jwt.Server(jwt.WithSigningKey([]byte("secret"))),
validate.Validator(),
),
)
- 检查是否为敏感接口单独配置限流中间件:
// 推荐实现
srv.Use("/user/payment/*", ratelimit.NewServer())
2.2 错误处理机制
- 验证是否使用
errors.New()或errors.Wrap()创建错误:
// 正确示例
return nil, errors.BadRequest("USER_NOT_FOUND", "user %s not found", id).WithCause(err)
- 检查错误是否包含业务错误码(非HTTP状态码):
// 错误示例(仅使用HTTP状态码)
return nil, errors.New(404, "", "not found")
// 正确示例(包含业务错误码)
return nil, errors.NotFound("RESOURCE_NOT_FOUND", "resource not found")
3. 安全检查清单
3.1 认证与授权
- 验证JWT中间件配置:
// 安全配置
jwt.Server(
jwt.WithSigningKey([]byte(os.Getenv("JWT_SECRET"))),
jwt.WithExpire(1*time.Hour),
jwt.WithIssuer("kratos-app"),
)
- 检查是否禁用不安全的HTTP方法(PUT/DELETE需特殊权限)
3.2 传输安全
- 确认HTTP服务启用TLS:
// 正确配置
http.Server(
http.TLSConfig(&tls.Config{
MinVersion: tls.VersionTLS12,
CipherSuites: []uint16{
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
},
}),
)
- 检查是否设置安全响应头:
// 推荐配置
w.Header().Set("Content-Security-Policy", "default-src 'self'")
w.Header().Set("X-XSS-Protection", "1; mode=block")
4. 代码质量检查
4.1 配置管理
- 验证敏感配置是否使用环境变量:
// 错误示例(硬编码)
config := &Config{
DBPassword: "password123",
}
// 正确示例
config := &Config{
DBPassword: os.Getenv("DB_PASSWORD"),
}
- 检查配置是否支持动态更新:
// 推荐实现
watcher, err := config.Watch("database")
if err != nil {
return err
}
go func() {
for {
select {
case <-watcher.Changed():
// 处理配置变更
case <-ctx.Done():
return
}
}
}()
4.2 日志规范
- 验证是否使用结构化日志(
log.Infow()而非log.Info()):
// 正确示例
log.Infow("user login success", "user_id", userID, "ip", ip)
- 检查敏感操作日志是否脱敏:
// 错误示例(包含敏感信息)
log.Infow("payment success", "card_no", "6222021234567890")
// 正确示例(脱敏处理)
log.Infow("payment success", "card_no", maskCardNo("6222021234567890"))
5. 性能与可靠性
5.1 资源管理
- 验证所有外部资源(数据库连接、缓存)是否使用连接池:
// 正确配置示例
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
sqlDB, _ := db.DB()
sqlDB.SetMaxOpenConns(100)
sqlDB.SetMaxIdleConns(20)
- 检查是否正确关闭goroutine(避免泄漏):
// 正确示例(使用context控制生命周期)
ctx, cancel := context.WithCancel(ctx)
defer cancel()
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
case data := <-ch:
// 处理数据
}
}
}(ctx)
5.2 负载均衡
- 验证服务发现是否配置合适的负载均衡策略:
// 推荐配置
selector := selector.NewSelector(
selector.WithBalancer(wrr.NewBalancer()),
selector.WithFilter(filter.Version("v1")),
)
- 检查是否启用健康检查:
// 正确配置
registry := consul.NewRegistry(
registry.WithHealthCheck(true),
registry.WithCheckInterval(30*time.Second),
)
6. 安全加固检查清单
| 检查项 | 风险等级 | 处理措施 |
|---|---|---|
| 未验证JWT签名算法 | 高 | 使用jwt.WithSigningMethod(jwt.SigningMethodHS256)显式指定 |
| 配置文件包含明文密钥 | 高 | 使用config.Get("db.password").String()配合加密存储 |
| HTTP服务未设置超时 | 中 | 配置http.Timeout(3*time.Second) |
| 日志包含用户密码 | 高 | 使用log.Mask("password")进行脱敏 |
| 未验证请求来源IP | 中 | 添加IP白名单中间件 |
7. 测试覆盖率要求
7.1 单元测试
- 核心业务逻辑覆盖率≥80%
- 工具函数覆盖率≥90%
- 中间件必须包含异常场景测试
7.2 集成测试
- 验证服务启动流程(配置加载、服务注册)
- 测试中间件链完整调用流程
- 模拟服务依赖超时场景
8. 代码提交前自检清单
附录:常见问题修复指南
Q1: 如何修复"循环依赖"问题?
- 引入接口抽象依赖:
// 错误示例(直接依赖)
import "project/service/user"
// 正确示例(依赖接口)
type UserService interface {
GetUser(ctx context.Context, id string) (*User, error)
}
Q2: 如何优化高频接口性能?
- 添加本地缓存层:
func (s *UserService) GetUser(ctx context.Context, id string) (*User, error) {
key := fmt.Sprintf("user:%s", id)
var user *User
if err := cache.Get(ctx, key, &user); err == nil {
return user, nil
}
// 数据库查询逻辑...
cache.Set(ctx, key, user, 5*time.Minute)
return user, nil
}
使用说明:此清单基于Kratos v2.x版本设计,团队可根据项目特性添加自定义检查项。建议集成到CI流程中自动执行基础检查项,关键节点需人工复核。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



