go-zero超强工具goctl的常用命令api,rpc,model及其构建的服务解析

news2024/9/23 23:29:56

goctl api

详情移步:

go-zero的路由机制解析
基于go-zero的api服务刨析并对比与gin的区别

goctl rpc

goctl支持多种rpc,较为流行的是google开源的grpc,这里主要介绍goctl rpc protoc的代码生成与使用。

protoc是grpc的命令,作用是将proto buffer文件转化为相应语言的代码。这里gocrl集成了proto buffer。

在这里插入图片描述

--go_out--go-grpc_out分别是生成的pb文件和_grpc.pb文件的目录。

使用protoc命令的前提条件是要有proto文件,如下:

syntax = "proto3";

package pb;

option go_package = "./pb";

//获取某用户的认证详细信息
message IdentifyDetailReq{
  string Id = 1;
}

message Detail{
  string Id = 1;            //客户id
  string Contacts = 2;      //企业联系人
  string Corporation = 3;   //企业联系人身份证号
  int64 Status = 4;         //认证状态 0-待审核;1-已通过;2-未通过
  string CompanyName = 5;   //企业名称
  string Phone = 6;         //企业联系人电话
  string Address = 7;       //通讯录地址
  string Reason = 8;        //认证不通过理由
  int64 Type = 9;           //企业证件类型 0-营业执照三证合一;1-营业执照非三证合一;2-非营业执照
  string qualifications = 10;//企业资质信息
}
message IdentifyDetailResp{
  Detail IdentifyInfo = 1;
}

service Identify{
  rpc IdentifyDetail(IdentifyDetailReq) returns (IdentifyDetailResp);
}

初始项目目录如下:
在这里插入图片描述
执行命令:
goctl rpc protoc test.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=.

在这里插入图片描述
生成目录文件
在这里插入图片描述
grpc最主要的文件是pb文件,rpc远程调用都基于这两个文件。

goctl rpc 生成的go文件和grpc不并不一样,zero对grpc进一步分装,且封装的库放在github.com/zeromicro/go-zero/zrpc中。

原生grpc
和原生grpc使用不同的是:

  1. 开发者自定义UnimplementedXXXServer的实现类

  2. 重写指向UnimplementedXXXServer实现类的所有方法。

  3. 编写服务端代码并注册所有实现的方法

  4. 客户端调用方法。

在proto文件生成的_grpc.pb文件自定义的接口:
在这里插入图片描述
需要新建该类的实现类并重写所有方法,完成特定功能。由于返回值参数都是在pb文件中,具备任何两个pb文件的够可以构建该同名称函数的rpc远程调用,并返回参数后序列化。

另外还需的注意的是grpc只生成的pb文件客户端与服务端都需要开发者来编写。

gRPC远程调用服务端与客户端连接详解

zero的grpc

在go-zero对grpc进一步封装,并将封装的,完成pb文件的生成与服务端的代码生成。如下自动生成的目录:

在这里插入图片描述

grpc原生命令只生成两个pb文件。

goctl rpc proto生成4个目录和一个rpc服务端启动程序。其中第二个目录是对grpc客户端代码的进一步封装,自定义的客户端。

在使用goctl rpc proto生成的代码是可以快速的构建rpc应用,方便的使用rpc客户端,另外zero还对etcd进行了集成,无需开发者操作,任然可以使用goctl一键生成。

pb文件就不再赘述了,这是看grpc使用的第二步,实现接口方法并注册方法,方法的实现zero也是使用服务层与逻辑层的调用方式,如下:

  1. server目录实现了_grpc.pb的所有方法,但是在方法中并没有写具体实现,而是直接调用了logic层。
    在这里插入图片描述
  2. logic层具体实现

在这里插入图片描述

此次封装只是隐藏了一个入参,当然也可以直接使用logic实现完整的代码,直接在服务点调用,跳过server也是可以的。

唠叨grpc第三步,服务端代码编写与接口注册,这一步也是由goctl生成的。在grpc中一般是调用_grpc.pb中的RegisterXXXServer方法参数为一个初始化的grpc服务端,可以接口。

在这里插入图片描述
第一个参数来自grpc目录(zero集成了grpc),第二个参数也在_grpc.pb为包含自定义方法的接口。
在这里插入图片描述

在go-zero中也是直接实现了服务端编写,查看源码都可以发现实现服务端构建都是使用了zrpc.MustNewServer方法,源码如下:

// A RpcServer is a rpc server.
type RpcServer struct {
	server   internal.Server
	register internal.RegisterFn
}

// MustNewServer returns a RpcSever, exits on any error.
func MustNewServer(c RpcServerConf, register internal.RegisterFn) *RpcServer {
	server, err := NewServer(c, register)
	logx.Must(err)
	return server
}

该方法传入了RpcServerConf服务端配置,肯定是必须的,要设置ip监听端口等;第二个参数呢是一个是一个参数为grpc.Server的函数,显然安装常规的构建服务端方法,就差一个接口了。

在这里插入图片描述
那么主要在这个方法内部调用pb的注册方法就可以了,看到zero的代码

在这里插入图片描述
调用了_grpc.pb方法注册,但不同的是第二个参数,并不是_grpc.pb的接口,而是server目录的封装的方法。

注册方法的参数是两个接口,可以是任意类型,但是第一个参数必须是grpc.Server

这里zero有一次并没有传入接口,而是自定义的结构体,结构体的方法被注册到grpc服务端。
在这里插入图片描述
pb.UnimplementedIdentifyServer构建grpc服务端的关键,重写了其方法,将其子类通过注册的方式注册到grpc服务端。

以上就zero对grpc的封装过程,goctl直接实现了构建grpc服务的前三个步骤,开发者只需要编写实现逻辑和少量配置即可。也就是说通过goctl生成的rpc服务只需要两个简单的步骤:

  1. 在yaml配置文件配置zrpc.RpcServerConf所需要的参数

在这里插入图片描述
2. logic层编写方法实现的具体逻辑

在这里插入图片描述

以上就是go-zero rpc服务端了。

其实客户端goctl也生成了,对于原生的grpc创建实现客户端包含连个步骤:1. 配置客户端连接参数;2. 实例化客户端对象。

源码也在_grpc.pb文件中:

在这里插入图片描述

图片上的转换过程有点复杂,出现了不少接口与接口的变化,不太好懂,当下只知道如何使用即可。

//配置连连接参数(无加密)
dial, err := grpc.Dial("localhost:1099", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
	println("failed grpc connect", err)
}
defer dial.Close()
//创建客户端连接
client := protoInterface.NewInterfaceClient(dial)
//通过客户端调用方法
res, err := client.GetProduct(context.Background(), &protoInterface.Request{
	ParamString: "hello",
})

在上述代码中最核心的就是grpc.Dial这步,创建grpc连接,后续调用pb的NewXXXClient传入该参数就得到了一个客户端对象就可以调用方法了。

go-zero客户端

zero中进一步封装,看zero源码(一般是生成文件的第二个目录即在etc下面的目录文件是对客户端的封装)。

在这里插入图片描述

第一个表示接口方法就是pb客户端的方法,第二个是对客户端的封装,第三个是创建客户端方法,第四个是方法实现,其实这都可上一小结原生pb的grpc客户端一模一样,就是换了个名字。

那么显然不能再用gprc原生的内容了,使用这些包装的rpc客户端也很简单,显然NewIdentify是构建客户端实例的方法,就差连接对象了。查看zrpc.Client源码如下:

在这里插入图片描述
再查看internal.Client源码:

在这里插入图片描述
巧了吗这不是,到头来还是自己,却有三个名。
在这里插入图片描述
到此思路就清晰了。

实例化一个zrpc.Client或者直接使用grpc.Dial需要注意的是zrpc.Client类型和同款类型是一个接口啊,没法像接口那样直接实例化,需要通过另一个方法实例化

直接在zrpc库中找即可

在这里插入图片描述

官方推荐

conn := zrpc.MustNewClient(zrpc.RpcClientConf{
	Target: "dns:///127.0.0.1:8080",
})

zrpc.MustNewClient方法可以实例化,其参数是一个zrpc.RpcClientConf结构体。这个参数可以配置在config目录下额文件中,通过配置获取。

到此也可以明白这莫多层的封装的意义了把,就是把下面这些配置集成了grpc中,并能通过yaml文件配置。
在这里插入图片描述

客户端对象实例获取后,如何可以直接调用方法获取服务端返回的数据库,保证服务端启动者即可。

在这里插入图片描述

etcd的整合

上述过程还未使用etcd的服务注册与发现功能,可以看到上之前的一些配置类中如服务端zrpc.RpcServerConfzrpc.RpcClientConf均出现了Etcd的配置类,在go-zero中使用etcd也是十分方便。一般有如下几个步骤:

  1. 安装etcd,确保其正常运行
  2. rpc服务端构建etcd心跳客户端持续发送心跳,并上传数据
  3. rpc客户端构建etcd普通客户端获取数据。

go-zero中使用etcd和单独使用区别不大,主要是配置文件那块。

详情请移步go-zero微服务实战——etcd服务注册与发现

goctl model

goctl model支持多种数据库,较为常用的是mysql,这里主要介绍goctl mode mysql的代码生成与使用。

在这里插入图片描述
参考

goctl model mysql datasource -url="user:password@tcp(127.0.0.1:3306)/database" -table="table1,table2"  -dir="./model"

运行命令后会在指定的目录下生成三个文件
在这里插入图片描述
其中usermodel.go是用户自定义的DML,DQL,开发者可在此处定义自己编写的sql查询语句;usermodel_gen.go是goctl自动生成的DML,DQL实现了数据库的基本操作即CRUD操作;第三个var.go就是自定义的数据库操作失败的返回值和其他参数。

goclt自动生成数据库引擎,在goctl model mysql命令的datasource参数就是配置数据库引擎的参数。接下来会参数如何使用。

可以看到user_mode_gen.go的userModel接口定义了很多方法:

在这里插入图片描述

而这些接口最终都指向了defaultUserModel

在这里插入图片描述
转到defaultUserModel的定义

defaultUserModel struct {
	sqlc.CachedConn
	table string
}

结构体定义了缓存和表名,后者由命令参数传递。

同源文件下也提供了实例化的方法:

func newUserModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) *defaultUserModel {
	return &defaultUserModel{
		CachedConn: sqlc.NewConn(conn, c, opts...),
		table:      "`user`",
	}
}

通过该方法创建一个defaultUserModel的实例,那么通过该方法创建实例,就可以调用接口的所有方法了。但是可以看到这个方法是私有的。

在这里插入图片描述
xxxmodel.go文件下也有一个NewUserModel方法是公开的,如下:

// NewUserModel returns a model for the database table.
func NewUserModel(conn sqlx.SqlConn) UserModel {
	return &customUserModel{
		defaultUserModel: newUserModel(conn),
	}
}

该方法对defaultUserModel进行了多次封装会有返回以newUserModel构建的defaultUserModel。开发者可以使用 NewUserModel来调用model生成的方法。

在这里插入图片描述

在对defaultUserModel多次封装的过程中出现了如下的接口和结构体:

在这里插入图片描述
UserModel接口内嵌userModel显然是其子接口,继承了userModel的方法且是公开的。customeUserModel也是defaultUserModel子类,并只能通过NewUserModel方法调用。显然该层继承是为了方便开发者拓展model层,实现自定义sql操作数据库。

自定义model的一般步骤包括:1. xxxmodel的接口中定义方法;2. 在同包下实现方法,并指向defaultUserModel的实现类。

在这里插入图片描述

如下使用NewUserModel就可以直接调用自定义的方法了

在这里插入图片描述

自定义方法操作数据库

除了上述使用goctl的model规范操作数据库外,也可以通过自定义的方法操作数据库。会看model的的代码,其中操作数据库的核心就是sqlx.SqlConn

这里的sqlx来源与zero的库"github.com/zeromicro/go-zero/core/stores/sqlx"

在sqlx中有一个NewMysql方法返回sqlx.SqlConn实例,就可以直接通过该方法返回的对象直接操作数据库。

var mysql = sqlx.NewMysql(datasource)

func Test2(t *testing.T) {
	mysql := sqlx.NewMysql("username:password@tcp(ip:3306)/databasename?charset=utf8mb4&parseTime=True")
	sql_ := "select * from user"
	user := User{}
	mysql.QueryRowCtx(context.Background(), &user, sql_)
	fmt.Println(user)
}

直接调用sqlx.SqlConn实例操作数据库的方法即可。

整合第三方框架

也可以整合一些第三方框架如gorm,xorm等,这就比较简单了,go get [address]安装。1. 封装工具类,暴露数据库引擎实例;2. 通过实例方法操作数据库。

可gin,iris,beego等框架整合xorm一样的方式,就不再过多叙述。

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

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

相关文章

SpringBoot的pom文件、容器、组件

一、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4…

springboot-mybatis的增删改查

目录 一、准备工作 二、常用配置 三、尝试 四、增删改查 1、增加 2、删除 3、修改 4、查询 五、XML的映射方法 一、准备工作 实施前的准备工作&#xff1a; 准备数据库表 创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动…

基于springboot的课程作业管理系统【附开题|ppt|万字文档(LW)和搭建文档】

主要功能 学生登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、个人信息管理等 ②公告信息管理、课程信息管理、学生选课管理、作业布置管理、作业提交管理、作业评分管理、课程评价管理、课程资源管理 教师登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、…

操作系统专栏4-网络专题from小林coding

网络专题 文件传输mmapwritesend file大文件传输过程 文件传输 传统的文件传输过程 在这个过程中发生了4次用户态与内核态之间的切换,4次数据拷贝分别是 read系统调用陷入内核,read完成返回write调用陷入内核,write返回 4次数据拷贝分别是 磁盘->内核缓冲区->用户缓冲…

改进正弦算法引导的蜣螂优化算法(MSADBO)

概述 蜣螂优化算法由于其寻优速度和收敛精度&#xff0c;自2023年问世以来&#xff0c;热度一直很高。本篇文章对蜣螂算法进行改进&#xff0c;改进思路是参考2023年6月25号发表在知网的一篇文献&#xff08;文献放在了文章末尾&#xff09;。 改进的蜣螂优化算法融合了改进的正…

Redis 变慢了 解决方案

一、Redis为什么变慢了 1.Redis真的变慢了吗&#xff1f; 对 Redis 进行基准性能测试 例如&#xff0c;我的机器配置比较低&#xff0c;当延迟为 2ms 时&#xff0c;我就认为 Redis 变慢了&#xff0c;但是如果你的硬件配置比较高&#xff0c;那么在你的运行环境下&#xff…

Cloud Keys Delphi Edition Crack

Cloud Keys Delphi Edition Crack 云密钥使基于云的密钥和秘密管理与任何支持的平台或开发技术轻松集成。这些易于使用的组件可用于与流行的云密钥管理提供商安全集成&#xff0c;如Amazon KMS、Amazon AWS Secrets、Azure key Vault、Google cloud KMS和Google Secret Manager…

自动化测试工具在软件测试中扮演了重要的角色

随着软件开发行业的发展和变革&#xff0c;软件测试变得愈发重要。在传统的软件测试过程中&#xff0c;测试人员需要手动执行测试用例&#xff0c;耗费大量时间和资源。然而&#xff0c;随着自动化测试工具的出现&#xff0c;软件测试的效率和质量得到了极大的提升。 自动化测试…

用Python自制软件,看视频畅通无阻

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 一个账号只能登录一台设备&#xff1f;涨价就涨价&#xff0c;至少还能借借朋友的&#xff0c;谁还没几个朋友&#xff0c;搞限制登录这一出&#xff0c;瞬间不稀罕了 这个年头谁还不会点技术了&#xff0c;直接拿python自制一…

Excel中——日期列后添加星期

需求&#xff1a;在日期列中添加星期几&#xff1f; 第一步&#xff1a;打开需要添加星期的Excel文件&#xff0c;在日期后面添加日期 第二步&#xff1a;选择日期列&#xff0c;点击鼠标右键&#xff0c;在下拉列表中&#xff0c;选择“设置单元格格式” 第三步&#xff1a; 在…

Miniled透明屏:超薄、轻便,还有哪些特点?

Miniled透明屏是一种新型的显示屏技术&#xff0c;它采用了微小的LED灯珠作为显示单元&#xff0c;通过透明的材料进行封装&#xff0c;使得整个屏幕具有透明的特性。Miniled透明屏具有以下几个特点&#xff1a; 首先&#xff0c;Miniled透明屏具有高亮度和高对比度的特点。 由…

TypeScript实战篇 - TS实战: 服务层开发-令牌

目录 接口说明 服务设计 WHY NOT Socket&#xff1f; huatian/svc【node.js 接口服务端】 huatian-svc/package.json huatian-svc/tsconfig.json huatian-svc/src/main.ts huatian-svc/nodemon.json huatian-svc/src/context/AccountContext.ts huatian-svc/src/repo…

软件测试面试真题 | 什么是PO设计模式?

面试官问&#xff1a;UI自动化测试中有使用过设计模式吗&#xff1f;了解什么是PO设计模式吗&#xff1f; 考察点 《page object 设计模式》&#xff1a;PageObject设计模式的设计思想、设计原则 《web自动化测试实战》&#xff1a;结合PageObject在真实项目中的实践与应用情…

活动目录密码更改

定期更改密码是一种健康的习惯&#xff0c;因为它有助于阻止使用被盗凭据的网络攻击&#xff0c;安全专家建议管理员应确保用户使用有效的密码过期策略更改其密码。 管理员可以通过电子邮件通知用户在密码即将过期时更改其密码&#xff0c;但在许多组织中&#xff0c;用户只能…

举个栗子!Tableau 技巧(256):灵活折叠文本表的多级数据行

通常&#xff0c;Tableau 默认的图表分层结构是统一打开或关上&#xff0c;有什么办法可以按需选择展开或折叠&#xff1f;如下示例&#xff1a;单击“”展开层级&#xff0c;单击“-“收起层级。 可以试试集操作&#xff01;今天的栗子&#xff0c;就来分享具体实现方法吧~ 本…

解读Spring的context:property-placeholder

在spring中&#xff0c;如果要给程序定义一些参数&#xff0c;可以放在application.properties中&#xff0c;通过<context:property-placeholder>加载这个属性文件&#xff0c;然后就可以通过value给我们的变量自动赋值&#xff0c;如果你们的程序可能运行在多个环境中&…

什么是头脑风暴法,有哪些原则?

1. 什么是头脑风暴法&#xff1f; 头脑风暴法&#xff08;Brainstorming&#xff09;是一种用于创造性思维和问题解决的方法。它旨在通过集体讨论和思维碰撞&#xff0c;激发团队成员的创造力和想象力&#xff0c;从而产生新的创意和解决方案。 在头脑风暴会议中&#xff…

数据结构 10-排序4 统计工龄 桶排序/计数排序(C语言)

给定公司名员工的工龄&#xff0c;要求按工龄增序输出每个工龄段有多少员工。 输入格式: 输入首先给出正整数&#xff08;≤&#xff09;&#xff0c;即员工总人数&#xff1b;随后给出个整数&#xff0c;即每个员工的工龄&#xff0c;范围在[0, 50]。 输出格式: 按工龄的递…

【福建事业单位-推理判断】01图形推理(位置,样式、属性、特殊)

【福建事业单位-推理判断】01图形推理 一、位置规律&#xff08;&#xff08;元素组成相同&#xff09;&#xff09;1.1平移旋转翻转1.1.1先判定方向&#xff0c;再确定路径1.1.2分内外圈走 1.2 旋转1.3翻转左右翻只有左右变&#xff0c;上下翻只有上下变&#xff0c;旋转180全…

真的不想知道如何进行语音翻译才简单吗

郑希&#xff1a;嘿&#xff0c;王浩&#xff01;我听说你最近去了日本旅游&#xff0c;怎么样&#xff1f;体验如何&#xff1f; 王浩&#xff1a;哈哈&#xff0c;太棒了&#xff01;日本真是一个充满魅力的国家。不过&#xff0c;要说令我惊喜的还是语音翻译技术&#xff0…