Go framework-Kratos

目录

一、Go framework

1、Kratos 介绍

1.1、Kratos 框架开发依赖安装

2、初始化 Kratos 项目

3、使用 Protobuf 、生成 Go 代码

3.1、增加proto文件模板

3.2、修改proto文件模板

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

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

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

4.3、生成依赖注入代码

4.4、运行项目

4.5、使用 Apipost 测试接口


一、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 tidyD:\GIT_workspace\go-valet-driving-system\backend>cd verifyCodeD:\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.0D:\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 runD:\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.protoD:\GIT_workspace\go-valet-driving-system\backend\verifyCode>kratos proto add api/verifyCode/verifyCode.protoD:\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.protoD:\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.goD:\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 serviceimport ("context"pb "verifyCode/api/verifyCode"
)type VerifyCodeService struct {pb.UnimplementedVerifyCodeServer
}func NewVerifyCodeService() *VerifyCodeService {return &VerifyCodeService{}
}func (s *VerifyCodeService) GetVerifyCode(ctx context.Context, req *pb.GetVerifyCodeRequest) (*pb.GetVerifyCodeReply, error) {return &pb.GetVerifyCodeReply{}, nil
}

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

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

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

使用Golang软件打开代码编辑,方便导入包信息。

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

package serverimport (v1 "verifyCode/api/helloworld/v1""verifyCode/api/verifyCode""verifyCode/internal/conf""verifyCode/internal/service""github.com/go-kratos/kratos/v2/log""github.com/go-kratos/kratos/v2/middleware/recovery""github.com/go-kratos/kratos/v2/transport/grpc"
)// NewGRPCServer new a gRPC server.
func NewGRPCServer(c *conf.Server, greeter *service.GreeterService,// 增加下行,传递一个参数verifyCodeService *service.VerifyCodeService,logger log.Logger) *grpc.Server {var opts = []grpc.ServerOption{grpc.Middleware(recovery.Recovery(),),}if c.Grpc.Network != "" {opts = append(opts, grpc.Network(c.Grpc.Network))}if c.Grpc.Addr != "" {opts = append(opts, grpc.Address(c.Grpc.Addr))}if c.Grpc.Timeout != nil {opts = append(opts, grpc.Timeout(c.Grpc.Timeout.AsDuration()))}srv := grpc.NewServer(opts...)v1.RegisterGreeterServer(srv, greeter)// 增加下行,将 VerifyCodeService 注册到 srv 中verifyCode.RegisterVerifyCodeServer(srv, verifyCodeService)return srv
}

4.3、生成依赖注入代码

$ go generate ./...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.4、运行项目

$ kratos runD:\GIT_workspace\go-valet-driving-system\backend\verifyCode>kratos run
2023/08/26 00:38:34 maxprocs: Leaving GOMAXPROCS=8: CPU quota undefined
DEBUG msg=config loaded: config.yaml format: yaml
INFO ts=2023-08-26T00:38:35+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
INFO ts=2023-08-26T00:38:35+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

4.5、使用 Apipost 测试接口

Apipost官网

Apipost可以测试grpc协议接口

新建grpc接口测试,导入proto文件, 测试地址,调用。返回值信息。

上面有返回信息代表正常调用

{"code": ""
}

Apipost也可以测试http协议接口

 

Web framework-Gin

Go framework-Beego

Golang学习+深入(一)

年轻不怕输!

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows平台Unity下播放RTSP或RTMP如何开启硬解码?

我们在做Windows平台Unity播放RTMP或RTSP的时候,遇到这样的问题,比如展会、安防监控等场景下,需要同时播放多路RTMP或RTSP流,这样对设备性能,提出来更高的要求。 虽然我们软解码,已经做的资源占有非常低了…

在外SSH远程连接macOS服务器

文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …

MySQL—MySQL的NULL值是怎么存放的

一、引言 1、MySQL数据存放在哪个文件? 创建一个数据库会产生三种格式的文件,分别是.opt格式、.frm格式、.ibd格式。 opt格式:用来存储当前数据库的默认字符集和字符校验规则。 frm格式:该文件是用来保存每个表的元数据信息的&…

ChatGPT⼊门到精通(1):ChatGPT 是什么

⼀、直观感受 1、公司 OpenAI(美国) 2、官⽅⽹站 3、登录ChatGPT ![在这里插入图片描述](https://img-blog.csdnimg.cn/26901096553a4ba0a5c88c49b2601e6a.png 填⼊帐号、密码,点击登录。登录成功,如下 3、和ChatGPT对话 开始…

Llama-2大模型本地部署研究与应用测试

最近在研究自然语言处理过程中,正好接触到到大模型,特别是在年初chatgpt引来的一大波AIGC热潮以来,一直都想着如何利用大模型帮助企业的各项业务工作,比如智能检索、方案设计、智能推荐、智能客服、代码设计等等,总得感…

四信5G智慧交通方案

5G是第五代移动通信技术的简称,是具有高速率低时延和大连接特点的新一代宽带移动通信技术,是实现智慧交通中的“车、路、人、环境”等交通要素互联互通的网络基础设施。相比以往的移动通信网络,5G网络以一种灵活部署的架构提供10Gbps以上的带…

Python中的API构建指南:在Flask中进行API开发

原文:Python中的API构建指南:在Flask中进行API开发 - 知乎 如何实现从一个软件与另一个软件的通信交互?就像我们的APP,如何实现微信支付、苹果支付? 其实,我们只需要一个API。 API(应用程序编…

4G模组EC20 网卡udhcpc获取IP但是没有设置IP

使能网卡: ifconfig usb0 up dhcp获取ip,虽然没有报error,但是很显然没有设置进配置 获取ip命令:udhcpc -i usb0 非正常现象: 正常现象: 解决方法: (1)rootfs 创建文件夹…

Qt应用开发(基础篇)——富文本浏览器 QTextBrowser

一、前言 QTextBrowser类继承于QTextEdit,是一个具有超文本导航的富文本浏览器。 框架类 QFramehttps://blog.csdn.net/u014491932/article/details/132188655 滚屏区域基类 QAbstractScrollAreahttps://blog.csdn.net/u014491932/article/details/132245486 文…

保姆级使用vmware安装Ubuntu-server版

保姆级VMware安装Ubuntu20服务器版 文章目录 保姆级VMware安装Ubuntu20服务器版前期准备一、安装vmware二、下载Ubuntu镜像 VMware安装Ubuntu201. 启动Workstation Pro或者Workstation Player,进入软件后新建一个虚拟机2. 进入引导界面选择默认的即可3. 点击下一步即可4. 选择操…

AIGC人工智能涉及三十六职业,看看有没有你的职业(二)

文章目录 如何生成IP盲盒 设计儿童节海报 制作商用矢量插画 设计徽章 图片融合 后缀参数 Stylize 风格化 赛博朋克头像 中国风瓷娃娃 生成线稿 制作时尚音乐唱片封面 T恤图案设计-告白气球 引领时尚潮流的服装设计之旅 独一无二的包包奇迹 手机壳设计探险 如何生…

Flink源码之Checkpoint执行流程

Checkpoint完整流程如上图所示: JobMaster的CheckpointCoordinator向所有SourceTask发送RPC触发一次CheckPointSourceTask向下游广播CheckpointBarrierSouceTask完成状态快照后向JobMaster发送快照结果非SouceTask在Barrier对齐后完成状态快照向JobMaster发送快照结…

Linux:权限

目录 一、shell运行原理 二、权限 1.权限的概念 2.文件访问权限的相关设置方法 三、常见的权限问题 1.目录权限 2.umsk(权限掩码) 3.粘滞位 一、shell运行原理 1.为什么我们不是直接访问操作系统? ”人“不善于直接使用操作系统如果让人直接访问操作系统&a…

【网络安全】防火墙知识点全面图解(三)

本系列文章包含: 【网络安全】防火墙知识点全面图解(一)【网络安全】防火墙知识点全面图解(二)【网络安全】防火墙知识点全面图解(三) 防火墙知识点全面图解(三) 39、什…

vscode 与 C++

序 具体流程的话,官方文档里都有的:C programming with Visual Studio Code 浏览器下载一个mingw64,解压,配置环境变量vscode里安装c相关的插件没了 第一步只看文字,可能有点抽象,相关视频: …

git介绍+集成到IDEA中+使用gitee

目录 git介绍 本地工作流程 IDEA集git 添加到暂存区 添加到本地仓库 gitee使用 添加到远程仓库 git介绍 git是一个开源的分布式版本控制工具,效率高。可以记录历史代码,多人代码共享 知识小点: 集中式版本控制:使用中央存…

RabbitMQ集群搭建和测试总结_亲测

RabbiMQ简介 RabbitMQ是用Erlang开发的,集群非常方便,因为Erlang天生就是一门分布式语言,但其本身并不支持负载均衡。 RabbitMQ模式 RabbitMQ模式大概分为以下三种: (1)单一模式。 (2)普通模式(默认的集群模式)。 (3)镜像模式(把需要的队列…

【力扣每日一题】2023.8.26 汇总区间

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个有序数组,让我们把数组内的元素汇总区间,也就是说有一串数字是连续的,比如是 1 2 3 4…

空时自适应处理用于机载雷达——元素空间空时自适应处理(Matla代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Spring Cloud Alibaba-Sentinel-Sentinel入门

1 什么是Sentinel Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel 具有以下特征: 丰富的应用场景:Sentinel 承接了阿里…