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核心特性

  1. 模块化设计:所有功能都以中间件形式提供,可按需组合
  2. 易用性:简洁的API设计,降低学习成本
  3. 高性能:基于gRPC和HTTP2的高性能通信
  4. 可观测性:内置Metrics、Logging和Tracing支持
  5. 配置管理:支持多种配置源和热更新

快速开始

安装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拥有丰富的插件生态系统,可以轻松集成:

  1. 服务发现:Consul, Etcd, Nacos
  2. 配置中心:Apollo, Nacos, Etcd
  3. 链路追踪:Jaeger, Zipkin
  4. 日志:Zap, Fluentd
  5. 监控:Prometheus
  6. 缓存:Redis, Memcached
  7. 消息队列:Kafka, RabbitMQ

最佳实践

  1. 领域驱动设计:遵循DDD原则组织代码结构
  2. 依赖注入:使用Wire进行依赖管理
  3. 错误处理:统一错误码和错误处理
  4. API设计:使用Protobuf定义API契约
  5. 测试:为业务逻辑编写单元测试

Kratos通过其模块化设计和丰富的中间件支持,使得构建和维护微服务变得更加简单高效。它的设计理念是"约定优于配置",开发者可以专注于业务逻辑的实现,而无需过多关注基础设施的搭建。

回到顶部