golang模块化设计易用的微服务框架插件库Kratos的使用
Golang模块化设计易用的微服务框架插件库Kratos的使用
关于Kratos
Kratos是一个基于Golang实现的微服务治理框架,其名称灵感来源于希腊神话游戏"战神"。它提供了便捷的能力帮助您快速构建健壮的应用程序,包括:
- 基于Protobuf定义的HTTP/gRPC通信协议
- 抽象的传输层支持:HTTP/gRPC
- 强大的中间件设计,支持:Tracing(OpenTelemetry)、Metrics(默认Prometheus)、Recovery等
- 可通过插件连接各种集中式注册表的注册接口
- 标准日志接口,便于与第三方日志库集成
- 自动支持通过Accept和Content-Type选择内容编码
- 支持多种数据源的配置和动态配置
- 在HTTP/gRPC协议中使用统一的元数据传输方式
- 可以在protos中定义错误并通过protoc-gen-go生成枚举
- 可以在Protobuf中定义验证规则,支持HTTP/gRPC服务
- 自动生成Swagger API,通过添加Swagger插件可以启动嵌入式Swagger UI端点
Kratos设计原则
- 简单:适当的设计,代码简洁易懂
- 通用:涵盖业务开发的各种实用工具
- 高效:加速业务升级效率
- 稳定:经过生产环境验证的基础库
- 健壮:通过高质量基础库消除误用
- 高性能:在不使用unsafe的情况下优化性能
- 可扩展性:设计合理的接口,可以扩展基础库以满足进一步需求
- 容错性:针对故障设计,增强对SRE的理解和实践
- 工具链:包含广泛的工具链,如缓存代码生成、lint工具等
快速开始
创建Kratos项目
# 安装kratos命令行工具
go install github.com/go-kratos/kratos/cmd/kratos/v2@latest
# 创建新项目
kratos new helloworld
# 进入项目目录并整理依赖
cd helloworld/ && go mod tidy
# 运行项目
kratos run
示例代码
以下是一个简单的Kratos服务示例:
// main.go
package main
import (
"context"
"github.com/go-kratos/kratos/v2"
"github.com/go-kratos/kratos/v2/log"
"github.com/go-kratos/kratos/v2/transport/grpc"
"github.com/go-kratos/kratos/v2/transport/http"
)
func main() {
// 创建HTTP服务
httpSrv := http.NewServer(
http.Address(":8000"),
)
// 创建gRPC服务
grpcSrv := grpc.NewServer(
grpc.Address(":9000"),
)
// 创建应用
app := kratos.New(
kratos.Name("helloworld"),
kratos.Server(
httpSrv,
grpcSrv,
),
)
// 运行应用
if err := app.Run(); err != nil {
log.Fatal(err)
}
}
定义API接口
// api/helloworld/v1/helloworld.proto
syntax = "proto3";
package helloworld.v1;
option go_package = "github.com/go-kratos/kratos/examples/helloworld/helloworld/v1;helloworldv1";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
实现服务
// internal/service/helloworld.go
package service
import (
"context"
"github.com/go-kratos/kratos/v2/log"
pb "github.com/go-kratos/kratos/examples/helloworld/helloworld/v1"
)
type GreeterService struct {
pb.UnimplementedGreeterServer
log *log.Helper
}
func NewGreeterService(logger log.Logger) *GreeterService {
return &GreeterService{
log: log.NewHelper(logger),
}
}
func (s *GreeterService) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
s.log.Infof("Received: %v", req.GetName())
return &pb.HelloReply{Message: "Hello " + req.GetName()}, nil
}
注册服务
// main.go
package main
import (
"github.com/go-kratos/kratos/v2"
"github.com/go-kratos/kratos/v2/log"
"github.com/go-kratos/kratos/v2/transport/grpc"
"github.com/go-kratos/kratos/v2/transport/http"
"helloworld/internal/service"
pb "helloworld/api/helloworld/v1"
)
func main() {
logger := log.NewStdLogger(log.WithLevel(log.LevelInfo))
// 创建服务实例
greeter := service.NewGreeterService(logger)
// 创建HTTP服务
httpSrv := http.NewServer(
http.Address(":8000"),
)
// 创建gRPC服务
grpcSrv := grpc.NewServer(
grpc.Address(":9000"),
)
// 注册服务
pb.RegisterGreeterHTTPServer(httpSrv, greeter)
pb.RegisterGreeterServer(grpcSrv, greeter)
// 创建应用
app := kratos.New(
kratos.Name("helloworld"),
kratos.Logger(logger),
kratos.Server(
httpSrv,
grpcSrv,
),
)
// 运行应用
if err := app.Run(); err != nil {
log.Fatal(err)
}
}
中间件使用示例
Kratos提供了强大的中间件支持,以下是一个添加日志和恢复中间件的示例:
// main.go
package main
import (
"github.com/go-kratos/kratos/v2/middleware/logging"
"github.com/go-kratos/kratos/v2/middleware/recovery"
"github.com/go-kratos/kratos/v2/transport/http"
)
func main() {
// 创建HTTP服务并添加中间件
httpSrv := http.NewServer(
http.Address(":8000"),
http.Middleware(
recovery.Recovery(), // 恢复中间件
logging.Server(logger), // 日志中间件
),
)
// ... 其他代码
}
配置管理示例
Kratos支持多种配置源,以下是一个使用文件配置的示例:
// config/config.yaml
server:
http:
addr: ":8000"
grpc:
addr: ":9000"
// main.go
package main
import (
"github.com/go-kratos/kratos/v2/config"
"github.com/go-kratos/kratos/v2/config/file"
)
type ServerConfig struct {
Http struct {
Addr string `yaml:"addr"`
} `yaml:"http"`
Grpc struct {
Addr string `yaml:"addr"`
} `yaml:"grpc"`
}
func main() {
// 加载配置文件
c := config.New(
config.WithSource(
file.NewSource("config/config.yaml"),
),
)
if err := c.Load(); err != nil {
panic(err)
}
var bc ServerConfig
if err := c.Scan(&bc); err != nil {
panic(err)
}
// 使用配置创建服务
httpSrv := http.NewServer(
http.Address(bc.Server.Http.Addr),
)
grpcSrv := grpc.NewServer(
grpc.Address(bc.Server.Grpc.Addr),
)
// ... 其他代码
}
Kratos框架提供了丰富的功能和模块化设计,使得构建微服务变得更加简单高效。通过上述示例,您可以快速了解如何使用Kratos构建您的微服务应用。
更多关于golang模块化设计易用的微服务框架插件库Kratos的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang模块化设计易用的微服务框架插件库Kratos的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Kratos微服务框架使用指南
Kratos是Bilibili开源的一款轻量级Go微服务框架,专注于模块化设计和易用性。下面我将详细介绍Kratos的核心特性、模块化设计理念以及如何使用它构建微服务。
Kratos核心特性
- 模块化设计:所有功能都以中间件形式提供,可按需组合
- 易用性:简洁的API设计,降低学习成本
- 高性能:基于gRPC和HTTP2的高性能通信
- 可观测性:内置Metrics、Logging和Tracing支持
- 配置管理:支持多种配置源和热更新
快速开始
安装Kratos
go get -u github.com/go-kratos/kratos/cmd/kratos/v2@latest
kratos new helloworld
cd helloworld
go mod tidy
项目结构
典型的Kratos项目结构如下:
helloworld/
├── api/ # API定义
├── cmd/ # 入口文件
├── configs/ # 配置文件
├── internal/ # 业务逻辑
│ ├── biz/ # 业务逻辑
│ ├── data/ # 数据访问
│ ├── service/ # 服务实现
│ └── conf/ # 配置结构体
└── pkg/ # 公共库
核心模块使用示例
1. HTTP服务
// internal/service/greeter.go
package service
import (
"context"
v1 "helloworld/api/helloworld/v1"
"helloworld/internal/biz"
)
type GreeterService struct {
v1.UnimplementedGreeterServer
uc *biz.GreeterUsecase
}
func NewGreeterService(uc *biz.GreeterUsecase) *GreeterService {
return &GreeterService{uc: uc}
}
func (s *GreeterService) SayHello(ctx context.Context, in *v1.HelloRequest) (*v1.HelloReply, error) {
g, err := s.uc.CreateGreeter(ctx, &biz.Greeter{Hello: in.Name})
if err != nil {
return nil, err
}
return &v1.HelloReply{Message: "Hello " + g.Hello}, nil
}
2. gRPC服务
// cmd/server/main.go
package main
import (
"helloworld/internal/conf"
"helloworld/internal/server"
"helloworld/internal/service"
"github.com/go-kratos/kratos/v2"
"github.com/go-kratos/kratos/v2/log"
"github.com/go-kratos/kratos/v2/transport/grpc"
"github.com/go-kratos/kratos/v2/transport/http"
)
func newApp(gs *grpc.Server, hs *http.Server) *kratos.App {
return kratos.New(
kratos.Name("helloworld"),
kratos.Server(
gs,
hs,
),
)
}
func main() {
// 加载配置
bc, err := conf.Load()
if err != nil {
panic(err)
}
// 初始化服务
greeterService := service.NewGreeterService()
// 创建HTTP和gRPC服务器
httpSrv := server.NewHTTPServer(bc.Server, greeterService)
grpcSrv := server.NewGRPCServer(bc.Server, greeterService)
app := newApp(grpcSrv, httpSrv)
if err := app.Run(); err != nil {
log.Fatal(err)
}
}
3. 中间件使用
Kratos提供了丰富的中间件:
// server/http.go
package server
import (
"github.com/go-kratos/kratos/v2/middleware/logging"
"github.com/go-kratos/kratos/v2/middleware/recovery"
"github.com/go-kratos/kratos/v2/middleware/tracing"
"github.com/go-kratos/kratos/v2/transport/http"
)
func NewHTTPServer(c *conf.Server, greeter *service.GreeterService) *http.Server {
srv := http.NewServer(
http.Address(c.Http.Addr),
http.Middleware(
recovery.Recovery(), // 恢复中间件
tracing.Server(), // 链路追踪
logging.Server(logger), // 日志
),
)
v1.RegisterGreeterHTTPServer(srv, greeter)
return srv
}
4. 配置管理
// internal/conf/conf.go
package conf
import (
"github.com/go-kratos/kratos/v2/config"
"github.com/go-kratos/kratos/v2/config/file"
)
type Config struct {
Server *Server `json:"server"`
Data *Data `json:"data"`
}
type Server struct {
Http *Server_HTTP `json:"http"`
Grpc *Server_GRPC `json:"grpc"`
}
type Server_HTTP struct {
Addr string `json:"addr"`
}
type Server_GRPC struct {
Addr string `json:"addr"`
}
type Data struct {
Database *Data_Database `json:"database"`
}
type Data_Database struct {
Driver string `json:"driver"`
Source string `json:"source"`
}
func Load() (*Config, error) {
c := config.New(
config.WithSource(
file.NewSource("configs/config.yaml"),
),
)
if err := c.Load(); err != nil {
return nil, err
}
var conf Config
if err := c.Scan(&conf); err != nil {
return nil, err
}
return &conf, nil
}
5. 数据库集成
// internal/data/data.go
package data
import (
"gorm.io/gorm"
"helloworld/internal/conf"
"helloworld/internal/data/ent"
"github.com/go-kratos/kratos/v2/log"
"github.com/google/wire"
)
// ProviderSet 是数据提供者集合
var ProviderSet = wire.NewSet(
NewData,
NewGreeterRepo,
)
// Data 是数据访问结构体
type Data struct {
db *gorm.DB
ent *ent.Client
}
func NewData(c *conf.Data, logger log.Logger) (*Data, func(), error) {
// 初始化数据库连接
db, err := gorm.Open(mysql.Open(c.Database.Source), &gorm.Config{})
if err != nil {
return nil, nil, err
}
// 初始化Ent
client, err := ent.Open(c.Database.Driver, c.Database.Source)
if err != nil {
return nil, nil, err
}
// 返回Data实例和清理函数
return &Data{
db: db,
ent: client,
}, func() {
sqlDB, _ := db.DB()
sqlDB.Close()
client.Close()
}, nil
}
插件生态系统
Kratos拥有丰富的插件生态系统,可以轻松集成:
- 服务发现:Consul, Etcd, Nacos
- 配置中心:Apollo, Nacos, Etcd
- 链路追踪:Jaeger, Zipkin
- 日志:Zap, Fluentd
- 监控:Prometheus
- 缓存:Redis, Memcached
- 消息队列:Kafka, RabbitMQ
最佳实践
- 领域驱动设计:遵循DDD原则组织代码结构
- 依赖注入:使用Wire进行依赖管理
- 错误处理:统一错误码和错误处理
- API设计:使用Protobuf定义API契约
- 测试:为业务逻辑编写单元测试
Kratos通过其模块化设计和丰富的中间件支持,使得构建和维护微服务变得更加简单高效。它的设计理念是"约定优于配置",开发者可以专注于业务逻辑的实现,而无需过多关注基础设施的搭建。