Kratos代码审查清单:质量与安全检查要点

Kratos代码审查清单:质量与安全检查要点

【免费下载链接】kratos Your ultimate Go microservices framework for the cloud-native era. 【免费下载链接】kratos 项目地址: https://gitcode.com/gh_mirrors/krato/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. 代码提交前自检清单

mermaid

附录:常见问题修复指南

Q1: 如何修复"循环依赖"问题?

  1. 引入接口抽象依赖:
// 错误示例(直接依赖)
import "project/service/user"

// 正确示例(依赖接口)
type UserService interface {
    GetUser(ctx context.Context, id string) (*User, error)
}

Q2: 如何优化高频接口性能?

  1. 添加本地缓存层:
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流程中自动执行基础检查项,关键节点需人工复核。

【免费下载链接】kratos Your ultimate Go microservices framework for the cloud-native era. 【免费下载链接】kratos 项目地址: https://gitcode.com/gh_mirrors/krato/kratos

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值