Go framework-Kratos

news2025/1/22 13:07:41

一、Go framework

框架Github开源时间开源方
Kratoshttps://github.com/go-kratos/kratos2019Bilibili
go-kithttps://github.com/go-kit/kit/2015团队开源
go-zerohttps://github.com/tal-tech/go-zero2020团队开源
TarsGohttps://github.com/TarsCloud/TarsGo2018腾讯
Jupiterhttps://github.com/douyu/jupiter2020斗鱼开源
Istiohttps://github.com/istio/istio2017Google、IBM、Lyft开源
Kitexhttps://github.com/cloudwego/kitex2020字节跳动
Go-micro(m3o)https://github.com/asim/go-micro2015Micro Sercives,Inc
Dubbo-gohttps://github.com/apache/dubbo-go2019阿里

1、Kratos 介绍

        Kratos 是一套由 Bilibili 开源的轻量级 Go 微服务框架,包含大量微服务相关框架及工具。Kratos(奎托斯)是希腊神话中的战神,其主要经历是由凡人成为战神并展开弑神屠杀。

Kratos官网

1.1、Kratos 框架开发依赖安装

1、Go语言环境,All releases - The Go Programming Language

$ go version
go version go1.20.6 windows/amd64

$ go env -w GO111MODULE=on

$ go env -w GOPROXY=https://goproxy.cn,direct

2、protoc,Protocol Compiler 编辑器 下载Releases · protocolbuffers/protobuf · GitHub

下载完直接解压,配置到path环境变量中

$ protoc --version
libprotoc 3.21.6

3、protoc-gen-go,Protoc 的插件,用于生成 Go 代码

go 语言开发的插件,使用 go install 安装

# 安装最新版本
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

# 测试
$ protoc-gen-go --version
protoc-gen-go v1.31.0
$ protoc-gen-go-grpc -version
protoc-gen-go-grpc 1.3.0

4、kratos,kratos 框架配套的脚手架工具

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

# 测试
$ kratos -v
kratos version v2.7.0

2、初始化 Kratos 项目

1、使用 Kratos完成第一个验证码校验服务verifyCode。

D:\GIT_workspace\go-valet-driving-system\backend>kratos new verifyCode
🚀 Creating service verifyCode, layout repo is https://github.com/go-kratos/kratos-layout.git, please wait a moment.

Cloning into 'C:\Users\Administrator\.kratos\repo\github.com\go-kratos/kratos-layout@main'...

[32mCREATED[0m D:\GIT_workspace\go-valet-driving-system\backend\verifyCode\.gitignore (590 bytes)
[32mCREATED[0m D:\GIT_workspace\go-valet-driving-system\backend\verifyCode\Dockerfile (483 bytes)
........
.......
[32mCREATED[0m D:\GIT_workspace\go-valet-driving-system\backend\verifyCode\third_party\validate\validate.proto (32133 bytes)

🍺 Project creation succeeded [32mverifyCode[0m
💻 Use the following command to start the project 👇:

[37m$ cd verifyCode[0m
[37m$ go generate ./...[0m
[37m$ go build -o ./bin/ ./... [0m
[37m$ ./bin/verifyCode -conf ./configs
[0m
                        🤝 Thanks for using Kratos
        📚 Tutorial: https://go-kratos.dev/docs/getting-started/start

该布局提供了最基本的目录结构和一个用于测试的 HTTP 和 gRPC 接口。

2、进入项目目录,拉取依赖

$ go mod tidy

D:\GIT_workspace\go-valet-driving-system\backend>cd verifyCode

D:\GIT_workspace\go-valet-driving-system\backend\verifyCode>go mod tidy
go: downloading github.com/google/wire v0.5.0
go: downloading github.com/go-kratos/kratos/v2 v2.7.0
....

3、运行项目前,需要先生成相应源码,主要是使用了 wire 的依赖注入相关代码:

$ go get github.com/google/wire/cmd/wire
$ go generate ./...

D:\GIT_workspace\go-valet-driving-system\backend\verifyCode>go get github.com/google/wire/cmd/wire
go: downloading github.com/google/subcommands v1.0.1
go: downloading golang.org/x/tools v0.6.0
go: downloading golang.org/x/mod v0.8.0

D:\GIT_workspace\go-valet-driving-system\backend\verifyCode>go generate ./...
wire: verifyCode/cmd/verifyCode: wrote D:\GIT_workspace\go-valet-driving-system\backend\verifyCode\cmd\verifyCode\wire_gen.go

4、运行项目,使用 kratos 工具:

$ kratos run

D:\GIT_workspace\go-valet-driving-system\backend\verifyCode>kratos run
2023/08/24 23:32:51 maxprocs: Leaving GOMAXPROCS=8: CPU quota undefined
DEBUG msg=config loaded: config.yaml format: yaml
INFO ts=2023-08-24T23:32:52+08:00 caller=http/server.go:317 service.id=MS-TGOOFNKABBOB service.name= service.version= trace.id= span.id= msg=[HTTP] server listening on: [::]:8000
INFO ts=2023-08-24T23:32:52+08:00 caller=grpc/server.go:212 service.id=MS-TGOOFNKABBOB service.name= service.version= trace.id= span.id= msg=[gRPC] server listening on: [::]:9000

#以上信息,表示项目运行成功,正在监听 HTTP 8000, gRPC 9000 端口。

测试:http://localhost:8000/helloworld/lwz

helloworld:是kratos生成时默认生成的接口

 使用kratos创建项目的步骤

$ kratos new projectName_xxx
$ cd projectName_xxx
$ go mod tidy
$ go get github.com/google/wire/cmd/wire
$ go generate ./...
$ kratos run

3、使用 Protobuf 、生成 Go 代码

可以看到api\helloworld\v1\greeter.proto文件。

使用 .proto 文件定义接口,基于 .proto 文件生成基础代码。

3.1、增加proto文件模板

$ kratos proto add xxx_path/xxx.proto

D:\GIT_workspace\go-valet-driving-system\backend\verifyCode>kratos proto add api/verifyCode/verifyCode.proto

D:\GIT_workspace\go-valet-driving-system\backend\verifyCode>

3.2、修改proto文件模板

默认生成带增删改查接口,看需求删改。

syntax = "proto3";

package api.verifyCode;

// 生成的go代码所在的包
option go_package = "verifyCode/api/verifyCode;verifyCode";
option java_multiple_files = true;
option java_package = "api.verifyCode";

// 定义 VerifyCode 服务
service VerifyCode {
	rpc CreateVerifyCode (CreateVerifyCodeRequest) returns (CreateVerifyCodeReply);
	rpc UpdateVerifyCode (UpdateVerifyCodeRequest) returns (UpdateVerifyCodeReply);
	rpc DeleteVerifyCode (DeleteVerifyCodeRequest) returns (DeleteVerifyCodeReply);
	rpc GetVerifyCode (GetVerifyCodeRequest) returns (GetVerifyCodeReply);
	rpc ListVerifyCode (ListVerifyCodeRequest) returns (ListVerifyCodeReply);
}

message CreateVerifyCodeRequest {}
message CreateVerifyCodeReply {}

message UpdateVerifyCodeRequest {}
message UpdateVerifyCodeReply {}

message DeleteVerifyCodeRequest {}
message DeleteVerifyCodeReply {}

message GetVerifyCodeRequest {}
message GetVerifyCodeReply {}

message ListVerifyCodeRequest {}
message ListVerifyCodeReply {}

修改,只保留获取验证码

syntax = "proto3";

package api.verifyCode;
// 生成的go代码所在的包
option go_package = "verifyCode/api/verifyCode;verifyCode";
// 定义 VerifyCode 服务
service VerifyCode {
	rpc GetVerifyCode (GetVerifyCodeRequest) returns (GetVerifyCodeReply);
}
// 类型常量
enum TYPE {
	DEFAULT = 0;
	DIGIT = 1;
	LETTER = 2;
	MIXED = 3;
};
// 定义 GetVerifyCodeRequest 消息
message GetVerifyCodeRequest {
	//	验证码长度
	uint32 length = 1;
	// 验证码类型
	TYPE type = 2;
}
// 定义 GetVerifyCodeReply 消息
message GetVerifyCodeReply {
	//	生成的验证码
	string code = 1;
}

3.3、根据修改完的模板文件生成客户端代码

$ kratos proto client xxx_path/xxxx.proto

D:\GIT_workspace\go-valet-driving-system\backend\verifyCode>kratos proto client api/verifyCode/verifyCode.proto
go install github.com/go-kratos/kratos/cmd/kratos/v2@latest
go install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest
go: downloading github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2 v2.0.0-20230823024326-a09f4d8ebba9
go: downloading github.com/go-kratos/kratos/cmd/protoc-gen-go-http v0.0.0-20210217095515-c4e4aa563867
go: downloading google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd
go: downloading google.golang.org/protobuf v1.28.0
go install github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2@latest
go: downloading github.com/go-kratos/kratos/cmd/protoc-gen-go-errors v0.0.0-20210217095515-c4e4aa563867
go: downloading github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2 v2.0.0-20230823024326-a09f4d8ebba9
go: downloading golang.org/x/text v0.3.8
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/google/gnostic/cmd/protoc-gen-openapi@latest
go: downloading github.com/google/gnostic v0.6.9
go: downloading google.golang.org/protobuf v1.27.1
go: downloading google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368
go: downloading gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776
go: downloading github.com/golang/protobuf v1.5.2
proto: api/verifyCode/verifyCode.proto

代码会生成在 api/verifyCode/ 目录中:

# 类型定义代码
api/verifyCode/verifyCode.pb.go
# gRPC服务定义代码
api/verifyCode/verifyCode_grpc.pb.go
# 注意 http 代码只会在 proto 文件中声明了 http 时才会生成。
api/verifyCode/verifyCode_http.pb.go

注意:生成的以上代码不需要手动编辑。

3.4、根据修改完的模板文件生成服务端代码

$ kratos proto server api/verifyCode/verifyCode.proto -t internal/service

# -t 选项指定生成文件所在位置,代码会生成在 internal/service 目录中verifycode.go

D:\GIT_workspace\go-valet-driving-system\backend\verifyCode> kratos proto server api/verifyCode/verifyCode.proto -t internal/service
internal\service\verifycode.go

internal/service/verifycode.go

package service

import (
	"context"

	pb "verifyCode/api/verifyCode"
)

type VerifyCodeService struct {
	pb.UnimplementedVerifyCodeServer
}

func NewVerifyCodeService() *VerifyCodeService {
	return &VerifyCodeService{}
}

func (s *VerifyCodeService) CreateVerifyCode(ctx context.Context, req *pb.CreateVerifyCodeRequest) (*pb.CreateVerifyCodeReply, error) {
	return &pb.CreateVerifyCodeReply{}, nil
}
func (s *VerifyCodeService) UpdateVerifyCode(ctx context.Context, req *pb.UpdateVerifyCodeRequest) (*pb.UpdateVerifyCodeReply, error) {
	return &pb.UpdateVerifyCodeReply{}, nil
}
func (s *VerifyCodeService) DeleteVerifyCode(ctx context.Context, req *pb.DeleteVerifyCodeRequest) (*pb.DeleteVerifyCodeReply, error) {
	return &pb.DeleteVerifyCodeReply{}, nil
}
func (s *VerifyCodeService) GetVerifyCode(ctx context.Context, req *pb.GetVerifyCodeRequest) (*pb.GetVerifyCodeReply, error) {
	return &pb.GetVerifyCodeReply{}, nil
}
func (s *VerifyCodeService) ListVerifyCode(ctx context.Context, req *pb.ListVerifyCodeRequest) (*pb.ListVerifyCodeReply, error) {
	return &pb.ListVerifyCodeReply{}, nil
}

至此,通过编写 .proto 文件来生成接口基础代码的工作就完成了。

接下来还需要将生成的服务代码注册到 gRPC 服务中。

4、将生成的服务代码注册到 gRPC 服务中

4.1、更新 internal/service/service.go 文件

// ProviderSet is service providers.
var ProviderSet = wire.NewSet(NewGreeterService, NewVerifyCodeService)

        在以上的 `wire.NewSet()` 调用中,添加第二个参数 NewVerifyCodeService。这个函数是用来生成 VerifyCodeService 服务的,定义在internal/service/verifycode.go 中。以上代码的意思就是告知 wire 依赖注入系统,如果需要 VerifyCodeService 的话,使用 NewVerifyCodeService 函数来构建。

4.2、更新 internal/server/grpc.go 文件:

在 NewGRPCServer 函数中:
        1.增加一个参数
        2.在函数体中,增加一行代码
用于将 VerifyCodeService 注册到 gRPC 服务中:
internal/server/grpc.go

Web framework-Gin

Go framework-Beego

Golang学习+深入(一)

年轻不怕输!

谁能比别人领先一步掌握新技术,谁就在竞争中赢得了先机。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/925076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费清理电脑:删除垃圾文件以提升电脑性能

求助!电脑上没有可用空间 ​“我只在电脑上存储了大约100张照片,为什么我的硬盘空间已满?电脑运行速度也变得越来越慢,要疯了!现在我想安装更新的驱动程序。我可以释放磁盘空间吗?有免费的Windows电脑清…

数组-C语言(初阶)

目录 一、一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 二、二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 三、数组越界 四、数组作为函数参数 4.1 数组名 4.2 冒泡排序…

FreeRTOS 查找最高优先级的就绪任务源码分析

一、就绪任务列表 就绪列表 pxReadyTasksLists[ configMAX_PRIORITIES ] 是一个数组, 数组里面存的是就绪任务的 TCB(准确来说是 TCB 里面的 xStateListItem 节点) ,数组的下标对应任务的优先级,优先级越低对应的数组…

Android studio 点击按钮 (跳转界面)

Android studio 点击按钮 (跳转界面) 问题描述 首先,我们有两个Java文件和与之绑定的xml文件。此处以HistoryActivity.java,activity_history.xml 和 EventDetail.java,activity_event_detail.xml为例子。我们要实现…

05-Numpy基础-用于数组的文件输入输出

np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的: 如果文件路径末尾没有扩展名.npy,则该扩展名会被自动加上。然后就可以通过np.load读取磁盘上的数组&#xff1…

NAT网关

NAT网关 NAT网关(NAT Gateway)是一种网络地址转换服务,提供NAT代理(SNAT和DNAT)能力。阿里云NAT网关分为公网NAT网关和VPC NAT网关: ■ 公网NAT网关提供公网地址转换服务 ■ VPC NAT网关提供私网地址转换服务 公网NAT网关 公网NAT网关是一款针对公网访…

Matlab分割彩色图像

彩色图像 彩色图像除有亮度信息外,还包含有颜色信息。以最常见的RGB(红绿蓝)彩色空间为例来简要说明彩色图像: 彩色图像可按照颜色的数目来划分。例如,256色图像和真彩色图像(2的16次方=21677…

解决Android Studio中Plugin version和Gradle version不匹配的问题

生命中最艰难的那段路是要自己一个人走过来的,这样,学到更多的是坚强,而不是感动。 《红猪》 前言 导入一个百度云的Demo而已,居然遇到这么多问题,纠结了很久,也查了很多资料,弯弯绕绕了好多路…

Ae 效果:CC Light Wipe

过渡/CC Light Wipe Transition/CC Light Wipe CC Light Wipe(CC 光线擦除)可以为图层添加指定形状(圆形、门形和方形)的光效,并通过光效形状的开合来实现擦除过渡。 可以为要过渡到的图层添加“曝光度”等效果&#x…

记Flask-Migrate迁移数据库失败的两个Bug——详解循环导入问题

文章目录 Flask-Migrate迁移数据库失败的两个Bug1、找不到数据库:Unknown database ***2、迁移后没有效果:No changes in schema detected. Flask-Migrate迁移数据库失败的两个Bug 1、找不到数据库:Unknown database ‘***’ 若还没有创建数…

有哪些前端调试和测试工具? - 易智编译EaseEditing

前端开发调试和测试工具帮助开发人员在开发过程中发现和修复问题,确保网站或应用的稳定性和性能。以下是一些常用的前端调试和测试工具: 调试工具: 浏览器开发者工具: 现代浏览器(如Chrome、Firefox、Safari等&#…

Kali个人初始配置

1、修改root密码 sudo passwd root 2、kali换国内源 vim /etc/apt/sources.list,注释掉默认的官方源 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib# …

JavaScript箭头函数

Arrow Functions(箭头函数)是 ES6 中引入的一种新的函数表达式语法,它可以更简洁地定义函数,并且不需要像普通函数一样使用 function 关键字。 例如我们上节课的代码: const peopleAge function calcAge1(birthYear)…

idea新建Java-maven项目时,出现Dependency‘xxx(jar包名)‘ not found的解决方案

项目场景: 项目场景:使用idea创建maven项目时,导入简单依赖时(本文以mysql-connector-java为例)。 问题描述 问题: 首先,在创建新的maven项目中,出现下列两种情况: &am…

读SQL学习指南(第3版)笔记05_过滤

1. 不需要考虑排除任何列 1.1. 清除数据表中所有的内容 1.2. 暂存新数据仓库的数据 1.3. 向数据表中新添一列后 1.4. 修改数据表中的所有行 1.5. 检索消息队列表中的所有行 2. where子句 2.1. 可以在其中指定一个或多个过滤条件,用于限制SQL语句处理的行数 …

Session 认证机制

什么是 Cookie Cookie 是存储在用户浏览器中的一段不超过 4 KB 的字符串。它由一个名称(Name)、一个值(Value) 和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。 不同域名下的 Cookie 各自独立,每当客户端发起请求时,会自动把当前…

destoon8.0自媒体类型综合资讯门户模板

随着时代发展,自媒体资讯适合当前的互联网情形。呕心沥血开发的一套自媒体综合门户网站模板,本模板采用纯手写开发,带会员中心。首页,列表页,内容页,搜索页面精心编写,非常大气,并配…

【stable-diffusion使用扩展+插件和模型资源(下)】

插件模型魔法图片等资源:https://tianfeng.space/1240.html 书接上文:(上) 插件推荐 1.lobe theme lobe theme是一款主题插件,直接可以在扩展安装 界面进行了重新布局,做了一些优化,有兴趣的…

电商格局大变,刘强东再出重拳力挽狂澜,能挽回用户的心么?

近日中国第三大电商京东宣布将降低免邮门槛,plus用户全年免邮,普通用户免邮门槛从99元降低至59元,显示出创始人刘强东回归后再出重拳,如此做的原因在于国内的电商格局已发生重大变化。 国内的电商格局早已从阿里、京东两强&#x…

webscoket在vue中的使用

项目场景: 提示:项目相关背景: 什么是webscoket?: WebSocket是一种计算机通信协议,通过单个TCP连接提供全双工通信信道。实现了web客户端和服务器之间的实时通信,与传统的HTTP连接相比,允许以…