kratos学习

简介: kratos学习

环境

安装protoc编译器

  1. Releases · protocolbuffers/protobuf (github.com) 下载
  2. 解压
  3. 将可执行文件路径添加到PATH中
  4. 安装Go插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

  安装

go install github.com/go-kratos/kratos/cmd/kratos/v2@latest

创建项目

# 国内拉取失败可使用gitee源
kratos new helloworld -r https://gitee.com/go-kratos/kratos-layout.git
# 亦可使用自定义的模板
kratos new helloworld -r xxx-layout.git
# 同时也可以通过环境变量指定源
KRATOS_LAYOUT_REPO=xxx-layout.git
kratos new helloworld
使用 -b 指定分支
kratos new helloworld -b main
使用 --nomod 添加服务,共用 go.mod ,大仓模式
kratos new helloworld
cd helloworld
kratos new app/user --nomod

  生成pb和wire

# 生成所有proto源码、wire等等
go generate ./...

  运行

kratos run

学习

  • 脚手架使用
  • 项目结构
  • 依赖注入
  • 日志库
  • 配置文件读取

脚手架

# kratos -h
Kratos: An elegant toolkit for Go microservices.

Usage:
  kratos [command]

Available Commands:
  changelog   Get a kratos change log
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  new         Create a service template
  proto       Generate the proto files
  run         Run project
  upgrade     Upgrade the kratos tools

Flags:
  -h, --help      help for kratos
  -v, --version   version for kratos

Use "kratos [command] --help" for more information about a command.
  • changelog: 查看kratos更新日志
  • completion: 可以为bash/fish/powershell/zsh提供命令补全
  • new: 根据模板创建一个服务,默认使用https://github.com/go-kratos/kratos-layout.git
  • proto: 生成proto文件
  • run: 运行项目,实际调用的go run命令

New

# 通过 kratos 命令创建项目模板:
kratos new helloworld

# 使用gitee源
kratos new helloworld -r https://gitee.com/go-kratos/kratos-layout.git

# 使用自定义的模板
kratos new helloworld -r xxx-layout.git

# 同时也可以通过环境变量指定源
KRATOS_LAYOUT_REPO=xxx-layout.git
kratos new helloworld

# 使用 -b 指定分支
kratos new helloworld -b main

# 使用 --nomod 添加服务,共用 go.mod ,大仓模式
kratos new helloworld
cd helloworld
kratos new app/user --nomod

proto

添加proto文件

  kratos-layout 项目中对 proto 文件进行了版本划分,放在了 v1 子目录下

kratos proto add api/helloworld/v1/demo.proto
syntax = "proto3";

package api.helloworld.v1;

option go_package = "helloworld/api/helloworld/v1;v1";
option java_multiple_files = true;
option java_package = "api.helloworld.v1";

service Demo {
   
    rpc CreateDemo (CreateDemoRequest) returns (CreateDemoReply);
    rpc UpdateDemo (UpdateDemoRequest) returns (UpdateDemoReply);
    rpc DeleteDemo (DeleteDemoRequest) returns (DeleteDemoReply);
    rpc GetDemo (GetDemoRequest) returns (GetDemoReply);
    rpc ListDemo (ListDemoRequest) returns (ListDemoReply);
}

message CreateDemoRequest {
   }
message CreateDemoReply {
   }

message UpdateDemoRequest {
   }
message UpdateDemoReply {
   }

message DeleteDemoRequest {
   }
message DeleteDemoReply {
   }

message GetDemoRequest {
   }
message GetDemoReply {
   }

message ListDemoRequest {
   }
message ListDemoReply {
   }

生成 Proto 代码

# 可以直接通过 make 命令生成
make api

# 或使用 kratos cli 进行生成
kratos proto client api/helloworld/v1/demo.proto

  生成两个文件

api/helloworld/v1/demo.pb.go
api/helloworld/v1/demo_grpc.pb.go

生成 Service 代码

  通过 proto 文件,可以直接生成对应的 Service 实现代码:

  使用 -t​ 指定生成目录

kratos proto server api/helloworld/v1/demo.proto -t internal/service
package service

import (
    "context"

    pb "helloworld/api/helloworld/v1"
)

type DemoService struct {
   
    pb.UnimplementedDemoServer
}

func NewDemoService() *DemoService {
   
    return &DemoService{
   }
}

func (s *DemoService) CreateDemo(ctx context.Context, req *pb.CreateDemoRequest) (*pb.CreateDemoReply, error) {
   
    return &pb.CreateDemoReply{
   }, nil
}
func (s *DemoService) UpdateDemo(ctx context.Context, req *pb.UpdateDemoRequest) (*pb.UpdateDemoReply, error) {
   
    return &pb.UpdateDemoReply{
   }, nil
}
func (s *DemoService) DeleteDemo(ctx context.Context, req *pb.DeleteDemoRequest) (*pb.DeleteDemoReply, error) {
   
    return &pb.DeleteDemoReply{
   }, nil
}
func (s *DemoService) GetDemo(ctx context.Context, req *pb.GetDemoRequest) (*pb.GetDemoReply, error) {
   
    return &pb.GetDemoReply{
   }, nil
}
func (s *DemoService) ListDemo(ctx context.Context, req *pb.ListDemoRequest) (*pb.ListDemoReply, error) {
   
    return &pb.ListDemoReply{
   }, nil
}

  ‍

  ‍

参考资料

  Go工程化 - Project Layout 最佳实践

相关文章
|
6月前
|
Go
Golang简易版RPC实现
Golang简易版RPC实现
37 0
|
消息中间件 Go 流计算
Golang微服务框架Kratos应用NATS消息队列详解
Golang微服务框架Kratos应用NATS消息队列详解
349 1
|
11月前
|
XML 编解码 JSON
kratos配置
kratos配置
|
API Go 网络架构
Kratos 大乱炖 —— 整合其他Web框架:Gin、FastHttp、Hertz
Kratos默认的RPC框架使用的是gRPC,支持REST和protobuf两种通讯协议。其API都是使用protobuf定义的,REST协议是通过[grpc-gateway](https://github.com/grpc-ecosystem/grpc-gateway)转译实现的。使用protobuf定义API是具有极大优点的,具有很强的可读性、可维护性,以及工程性。工程再大,人员再多,也不会乱。 一切看起来都是很美好的。那么,问题来了,我们现在使用的是其他的Web框架,迁移就会有成本,有风险,不可能一下子就把历史存在的代码一口气转换过来到Kratos框架。那我可以在Kratos中整合其他
871 0
|
开发框架 JavaScript .NET
Golang微服务框架kratos实现SignalR服务
SignalR 在可用的情况下使用新的 WebSocket 传输,并在必要时回退到旧传输。 虽然当然可以直接使用 WebSocket 编写应用,但使用 SignalR 意味着需要实现的许多额外功能已经为你完成。 最重要的是,这意味着你可以编写应用代码以利用 WebSocket,而无需担心为旧客户端创建单独的代码路径。 SignalR 还可以避免担心 WebSocket 的更新,因为 SignalR 已更新以支持基础传输中的更改,从而为应用程序提供跨 WebSocket 版本的一致接口。
64 0
|
SQL 关系型数据库 Go
Golang微服框架Kratos与它的小伙伴系列 - ORM框架 - GORM
[GORM](https://gorm.io/index.html) 是基于Go语言实现的ORM库,它是Golang目前比较热门的数据库ORM操作库,对开发者也比较友好,使用非常方便简单。
137 0
|
Go API 微服务
Golang微服务框架Kratos轻松集成并使用Swagger UI
在我们的开发当中,调试接口,测试接口,提供接口文档给前端,那都是非常频繁的工作内容。 那么,我们需要用什么方法和工具来实施这些工作内容呢? Swagger,或者说OpenAPI。
262 0
|
机器学习/深度学习 前端开发 Go
Golang微服务框架kratos实现SSE服务
我也是最近才知道SSE的,问了下周围的人,发现知道的人也着实不多的。我是怎么知道SSE的呢?我看了下OpenAI的API,有一个Stream模式,就是使用的SSE实现的。说白了,这就是一个HTTP长连接通过服务端持续发送数据到前端的协议。在网络不稳定的情况下,它比Websocket要更好。
265 0
|
消息中间件 Go 网络性能优化
Golang微服务框架Kratos应用NATS消息队列
NATS是由CloudFoundry的架构师Derek开发的一个开源的、轻量级、高性能的,支持发布、订阅机制的分布式消息队列系统。它的核心基于EventMachine开发,代码量不多,可以下载下来慢慢研究。其核心原理就是基于消息发布订阅机制。每个台服务 器上的每个模块会根据自己的消息类别,向MessageBus发布多个消息主题;而同时也向自己需要交互的模块,按照需要的信息内容的消息主题订阅消息。 NATS原来是使用Ruby编写,可以实现每秒150k消息,后来使用Go语言重写,能够达到每秒8-11百万个消息,整个程序很小只有3M Docker image
157 0
|
存储 中间件 Java
开源 Golang 微服务入门一: HTTP 框架 Hertz
Hertz 是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点
615 0
开源 Golang 微服务入门一: HTTP 框架 Hertz