kratoscore

package module
v0.0.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 15, 2026 License: MIT Imports: 27 Imported by: 0

README

kratos-core

简体中文 | 繁體中文 | English | 日本語

kratos-core 是 Kratos 服务的通用运行时。宿主项目负责业务 Case、Service、API 和进程入口;Core 负责基础设施、传输层、资源注册以及应用生命周期。

Core 不是完整的业务模板。宿主通过一个 module.Module 把业务服务和构建期资源交给 Core,再由 NewApp 统一装配和启动。

Core 负责什么

  • bootstrap.Context 解析数据库、Redis、队列、OSS、JWT、翻译器和性能分析配置。
  • 按模块资源创建多数据源 GORM 客户端、缓存、队列、OSS、翻译器和共享 biz.BaseCase
  • 按配置创建 HTTP、gRPC、MCP、SSE、队列和持久化定时任务运行时,并把模块服务注册到对应传输层。
  • 启动时按顺序执行数据库迁移、OpenAPI 接口同步、租户角色菜单同步和 Casbin 策略重建。
  • 统一启动、停止 Kratos 服务,并返回应用清理函数。

公共边界

跨项目可以依赖的 Go 代码分为四个入口:

  • 根包提供 ProviderSetNewApp。宿主通常只需要把 ProviderSet 放入自己的 Wire 图。
  • pkg 提供 bizconfigconstdtoerrorsxmodule 公共包。
  • api 是独立 Go 模块,api/proto 保存 Core 的 protobuf 定义,api/gen/go 保存生成的 Go 类型。
  • client 是独立 Go 模块,提供基于 kratos-kit 配置的 gRPC 连接和进程内 gRPC 连接。

internal 下的代码只属于 Core 实现,不是跨项目 API。Core 创建的缓存、队列、OSS、翻译器和多数据源 GORM 客户端会注入 biz.BaseCase,同时写入 kratos-kit/sdk.Runtime,业务代码可以按需从 BaseCase 或 SDK 获取。

Wire 接入

宿主在自己的 Wire 组合根中提供一个实现 module.Module 的业务模块,并使用 Core 唯一公开的 ProviderSet

//go:build wireinject

package main

import (
	"github.com/go-kratos/kratos/v3"
	"github.com/google/wire"
	core "github.com/liujitcn/kratos-core"
	"github.com/liujitcn/kratos-core/pkg/module"
	"github.com/liujitcn/kratos-kit/bootstrap"
)

func initializeApp(ctx *bootstrap.Context) (*kratos.App, func(), error) {
	panic(wire.Build(
		core.ProviderSet,
		newHostModule,
		wire.Bind(new(module.Module), new(*hostModule)),
	))
}

Core 的 ProviderSet 只负责把 NewApp 接入宿主的 Wire 图;它不会把 BaseCaseJobDocsOpenAPISSE 作为宿主 Wire 输出。宿主自己的业务 Case 仍应按需引入 pkg/biz.ProviderSetpkg/config.ProviderSet 和业务 Provider,但不应直接依赖 Core 的 internal 包。wire_gen.go 只能通过 make wire 或项目自己的 Wire 命令生成,不能手工维护。

模块契约

业务模块实现 pkg/module.Module。模块自己持有业务 Service,并在协议注册方法中完成注册:

type hostModule struct{}

func (*hostModule) RegisterGRPC(grpc.ServiceRegistrar) {}
func (*hostModule) RegisterHTTP(*kratosHTTP.Server)    {}
func (*hostModule) RegisterMCP(*mcpserver.Server)      {}
func (*hostModule) RegisterQueue(*queueTransport.Server) {}
func (*hostModule) RegisterCron(*cronTransport.Server) error { return nil }
func (*hostModule) RegisterSSE(*sseTransport.Server) error    { return nil }
func (*hostModule) Resources() module.Resources                { return module.Resources{} }

各方法的职责如下:

方法 作用
RegisterGRPC 注册生成的 gRPC Service。未配置 gRPC 服务时不会创建 Core gRPC Server。
RegisterHTTP 注册 HTTP Service 和路由。未配置 HTTP 服务时不会创建 Core HTTP Server。
RegisterMCP 注册 MCP 工具。MCP 可以独立监听,也可以挂载到 HTTP。
RegisterQueue 注册队列消费者;Core 同时注册内置日志和任务日志消费者。
RegisterCron 注册数据库持久化任务执行器,通常调用 server.RegisterTask。返回错误会中止装配。
RegisterSSE 注册业务 SSE 流,通常调用 server.RegisterStream。返回错误会中止装配。
Resources 返回模型、迁移、OpenAPI、项目文档和 I18n 等静态资源。

多个业务模块可以作为 NewApp 的多个参数传入。Core 会按传入顺序收集资源并转发协议注册;重复文档路径、冲突的 OpenAPI 文档、内容不同的 I18n 消息键或重复 SSE 流标识会在装配时被拒绝。

构建期资源

module.Resources 是每个模块的一次性资源快照:

字段 内容与约束
ProjectKey 项目稳定标识,用于文档和 OpenAPI 命名;为空时使用 kratos-core
ProjectName 项目展示名称;为空时回退到 ProjectKey
Models 按数据源名称分组的 GORM 模型。含模型的数据源必须在配置中存在,默认数据源必须配置。
Migrations 版本化迁移列表。每项 module.Migration 声明 NameFSPathDependencies,Core 按依赖顺序执行。
OpenAPI 包含 openapi.yamlopenapi.ymlopenapi.jsonfs.FS。启用 Swagger 后,Core 会为每个项目挂载原文和 Swagger UI。
Docs 通常包含 docs.jsonfs.FS,用于构建项目文档树并通过 biz.Docs 查询。
I18n 包含 zh-CN.jsonzh-TW.jsonen-US.jsonja-JP.json 等语言文件的 fs.FS。Core 会与内置文案合并。

资源通常由宿主通过 embed.FS、代码生成器或 fstest.MapFS 提供:

func NewModuleResources() module.Resources {
	return module.Resources{
		ProjectKey:  "host",
		ProjectName: "Host Service",
		Models:      map[string][]interface{}{defaultDataSource: models.Models()},
		Docs:        docsFS,
		OpenAPI:     openAPIFS,
		I18n:        i18nFS,
		Migrations: []module.Migration{
			{Name: "host", FS: migrationFS, Path: "."},
		},
	}
}

运行时能力

基础上下文

pkg/biz.BaseCase 是宿主业务共用的基础上下文,包含 bootstrap.Context、缓存、队列、OSS、翻译器和多数据源 GORM 客户端,并提供 GetAuthInfo 读取当前认证用户。

Core 还向宿主暴露以下能力接口:

  • biz.Job:启动、停止或立即运行数据库中的持久化任务。
  • biz.Docs:查询合并后的项目文档树和文档正文。
  • biz.OpenAPI:按服务、HTTP 操作查询 OpenAPI 信息。
  • biz.SSE:建立 SSE 订阅并发布 JSON 事件。
服务与中间件

HTTP 和 gRPC 服务会按配置挂载 request ID、I18n、日志、认证授权和参数校验中间件。HTTP 还支持本地 OSS 静态文件、SPA 回退和 Swagger;启用进程内 MCP 或 SSE 时,对应端点会挂载到 HTTP 服务,因此必须同时配置 HTTP。

队列运行时负责消费 Core 的日志消息和任务日志消息,并转发宿主注册的消费者。Cron 运行时从数据库重载启用的 BaseJob,按模块在 RegisterCron 中注册的执行器执行任务。

启动顺序

NewApp 的主要装配顺序如下:

  1. 解析启动配置并收集模块资源,根据模块模型创建数据源和迁移注册表。
  2. 执行数据库迁移,随后在同一事务中同步 OpenAPI 接口、租户角色菜单和 Casbin 数据库规则;事务提交后刷新内存策略。
  3. 创建共享基础服务、认证授权、HTTP/gRPC/MCP/SSE、队列和 Cron 运行时,并调用模块注册方法。
  4. 组装 Kratos App;应用运行时统一启动和停止传输服务,返回的清理函数负责释放其余基础资源。

目录职责

api/
  proto/common/v1/      Core 公共 protobuf 定义
  gen/go/common/v1/     protobuf 生成的 Go 代码

client/
  connection.go         远程或进程内 gRPC 连接适配
  localgrpc/             进程内 gRPC 服务注册与调用

pkg/
  biz/                   BaseCase 和 Core 能力接口
  config/                启动配置解析
  const/                 公共常量
  dto/                   文档和 OpenAPI 查询 DTO
  errorsx/               统一错误构造
  module/                宿主模块、资源和协议注册契约

internal/
  biz/                   Core 内置业务用例
  data/                  Core 模型、事务和仓储
  job/                   Cron 注册、持久化任务和运行时
  queue/                 队列消费者与生命周期适配
  resource/              文档、I18n、迁移、OpenAPI 和启动资源同步
  server/                HTTP、gRPC、MCP 和中间件
  sse/                   SSE 流注册、传输和发布

bootstrap.go             对外 ProviderSet 和应用生命周期装配
wire.go                  Core 内部 Wire 组合根
wire_gen.go              Wire 生成产物
Makefile                 生成、格式化、测试和静态检查命令

开发命令

make api       # 生成 api/gen/go
make wire      # 生成 wire_gen.go
make fmt       # goimports 格式化 Go 代码
make test      # go test ./...
make vet       # go vet ./...
make lint      # 当前等同于 make vet

发布版本 tag

scripts/tag_release.py 参照 kratos-kit 按 Go module 独立发布版本。执行前先提交并推送代码,脚本只检查远程默认分支上的提交,不会提交工作区改动:

git add -A
git commit -m "提交说明"
git push origin main

make tag

默认扫描根模块、apiclient,只有模块自上一个 tag 后存在已推送的代码更新时才创建并推送下一个 patch tag:

模块 tag 格式
根模块 vX.Y.Z
api api/vX.Y.Z
client client/vX.Y.Z

也可以只处理指定模块:

MODULE=api make tag              # 从 api 目录开始递归扫描
MODULE=api EXACT=1 make tag      # 只处理 api 模块

脚本会自动跳过没有代码更新或 tag 已存在的模块;根模块的变更检测会排除 apiclient 子模块,避免子模块改动重复触发根模块 tag。

项目要求 Go 1.26.5apiclient 是独立 Go 模块,修改它们时还应分别执行 cd api && go test ./...cd client && go test ./...。修改公共模块契约后,应额外编译依赖 Core 的宿主项目。

客户端连接的独立说明见 client/README.md

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ProviderSet = wire.NewSet(NewApp)

ProviderSet 是 Core 对外唯一的 Wire 注入入口。

Functions

func NewApp added in v0.0.3

func NewApp(ctx *bootstrap.Context, modules ...module.Module) (*kratos.App, func(), error)

NewApp 通过 Core ProviderSet 装配多个业务模块。

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL