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 最佳实践

相关文章
|
开发框架 Go 微服务
Golang 语言怎么使用 go-micro 和 gin 开发微服务?
Golang 语言怎么使用 go-micro 和 gin 开发微服务?
398 0
|
前端开发 Go API
Gin vs Beego: Golang的Web框架之争
Gin vs Beego: Golang的Web框架之争
|
消息中间件 存储 Go
Golang微服务框架Kratos应用NSQ消息队列
NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,由bitly公司开源出来的一款简单易用的消息中间件。 NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其设计目标是为在分布式环境下运行的去中心化服务提供一个强大的基础架构。 NSQ具有分布式、去中心化的拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。NSQ非常容易配置和部署,且具有最大的灵活性,支持众多消息协议。
107 1
|
消息中间件 Go 流计算
Golang微服务框架Kratos应用NATS消息队列详解
Golang微服务框架Kratos应用NATS消息队列详解
388 1
|
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中整合其他
901 0
|
XML 编解码 JSON
kratos配置
kratos配置
|
机器学习/深度学习 前端开发 Go
Golang微服务框架kratos实现SSE服务
我也是最近才知道SSE的,问了下周围的人,发现知道的人也着实不多的。我是怎么知道SSE的呢?我看了下OpenAI的API,有一个Stream模式,就是使用的SSE实现的。说白了,这就是一个HTTP长连接通过服务端持续发送数据到前端的协议。在网络不稳定的情况下,它比Websocket要更好。
295 0
|
开发框架 JavaScript .NET
Golang微服务框架kratos实现SignalR服务
SignalR 在可用的情况下使用新的 WebSocket 传输,并在必要时回退到旧传输。 虽然当然可以直接使用 WebSocket 编写应用,但使用 SignalR 意味着需要实现的许多额外功能已经为你完成。 最重要的是,这意味着你可以编写应用代码以利用 WebSocket,而无需担心为旧客户端创建单独的代码路径。 SignalR 还可以避免担心 WebSocket 的更新,因为 SignalR 已更新以支持基础传输中的更改,从而为应用程序提供跨 WebSocket 版本的一致接口。
76 0
|
Go API 微服务
Golang微服务框架Kratos轻松集成并使用Swagger UI
在我们的开发当中,调试接口,测试接口,提供接口文档给前端,那都是非常频繁的工作内容。 那么,我们需要用什么方法和工具来实施这些工作内容呢? Swagger,或者说OpenAPI。
301 0
|
SQL 关系型数据库 Go
Golang微服框架Kratos与它的小伙伴系列 - ORM框架 - GORM
[GORM](https://gorm.io/index.html) 是基于Go语言实现的ORM库,它是Golang目前比较热门的数据库ORM操作库,对开发者也比较友好,使用非常方便简单。
161 0