• 欢迎来到本博客,希望可以y一起学习与分享

go-zero 入门

笔记 benz 1个月前 (11-02) 15次浏览 0个评论 扫描二维码
文章目录[隐藏]

前言

go-zero完整工程目录结构示例如下:

最主要是api网关和rpc服务间的通讯api对外提供访问,rpc对内微服务间进行通讯。
还有一个goctl代码生成工具,这是一个很重要的工具。

api网关

首先要写一个xxx.api后缀为api的文件,来定义api网关。主要定义有:

1、定义路由并与handler(可理解为controller)进行关联。
2、定义每个路由的request(请求)和response(响应)的结构体。
3、定义使用的中间件。
定义好以后使用goctl根据api文件,自动生成代码,目录结构如下:

如果要对外提供服务,要在api目录下,指定配置文件启动:

rpc

首先要写一个xxx.proto后缀为proto的文件,来定义rpc。主要定义有:
1、定义提供调用的方法。
2、proto3格式定义调用方法的request与response。
定义好以后使用goctl根据proto文件,自动生成代码,目录结构如下:

 

安装GO环境,并安装go-zero

项目官网:https://go-zero.dev
项目地址:https://github.com/zeromicro/go-zero

安装Go环境自己找。
创建一个项目文件夹micro,这个项目文件夹里以后会创建多个微服务。在micro目录下执行以下命令

GO111MODULE=on:开启模块化。
GOPROXY:Go设置代理,用于使用国内镜像下载module。
go mod init 项目名称:初始化项目。
初始化后会在项目下生成go.mod文件

安装go-zreo

安装完后go.mod下会生成 go.sum的文件

所以go.modgo.sum是用来记录管理安装的依赖模块。如果import模块变红,可以来这里看一下对应的模块是否安装了。

安装 goctl 工具

这个工具可以快速生成代码

安装protoc
到这里下载Githubprotoc。以Windows为例,下载protoc-3.18.1-win64.zip,并解压,把bin文件夹里的protoc.exe放到Go安装路径的bin文件夹里。go的bin目录要添加到系统的环境变量里

查看是否安装成功

安装protoc-gen-go
用于生成proto代码

安装grpc

需求:
有两个服务,一个是用户服务,另一个是订单服务。
用户有增删改查,订单也有增删改查的功能,订单的查询与新增都需要获取用户的信息。

API网关

在micro项目下新建文件夹user,作为用户微服务。

生成网关模板

接着在user文件夹下新建api文件夹,在api文件夹下使用goctl生成api模板文件,即用户服务的网关模板

在 api模板里你只需要做两件事:
1、定义handler与路由

2、每个路由的request与response

根据模板生成网关代码

使用goctl根据api模板生成Gateway代码

会生成如下目录结构

etc/user-api.yaml配置

如果没有什么需求,直接在logic里完善业务逻辑即可。
例如,完善micro\user\api\internal\logic\getuserlogic.go

同理创建一个order微服务。

启动api网关

就是记得在order/api/etc/order-api.yaml文件修改端口,不要和user服务的端口冲突了。
启动user和order两个api网关

分别访问 http://localhost:8881/order/id/1 http://localhost:8888/users/id/1即可得到结果。

RPC

创建rpc,用于服务间调用

创建RPC模板

在user文件夹下创建rpc文件夹,user/rpc就存放着rpc的代码。然后使用goctl创建rpc模板:

根据模板生成代码

使用goctl生成rpc的代码

生成的目录与文件如下

user/rpc/etc配置文件

填充业务代码 user/rpc/internal/logic

user/rpc/internal/config/config.go

以同样的方式创建order订单服务rpc服务。

配置依赖关系

假设order服务的api网关的getOrder方法,需要获取user服务的RPC提供的getUser方法,来获取user信息。
1、order在配置中添加user服务的RPC配置order/api/internal/config/config.go

2、配置etcd,发现服务 order/api/etc/order-api.yaml

3、创建服务的RPC实例到ServiceContext(服务上下文)。order/api/internal/svc/servicecontext.go

4、调用RPC完成业务逻辑

启动rpc

注意:如果api网关依赖了RPC,要RPC先启动,注册到etcd上。

order的api网关服务也要启动起来,通过地址访问http://localhost:8881/order/id/1,返回的username是rpc获取到的数据。

model

在user服务文件夹下新建model文件夹。
在model创建的user服务数据库sql文件。(一个微服务有一个对应的数据库)

使用goctl命令生成CRUD+cache代码

配置

1、配置yaml
api和rpc 那个需要数据库就在对应的etc/xxx.yaml配置数据库
例如:rpc需要用到数据库,就在user/rpc/etc/user.yaml添加数据库配置。

2、到user/rpc/internal/config/config.go配置实例配置

3、注册到服务上下文中 user/rpc/internal/svc/servicecontext.go

4、 业务使用数据库 user/rpc/internal/logic/getuserlogic.go

启动rpc去查询即可。

 

集成gorm

先安装gorm 以及 对应数据库的驱动

1、在etc/xxx.yaml配置数据库连接。api网关和rpc那个需要就到对应的etc文件夹下配置。
这里是在API网关下配置的 user/api/etc/user-api.yaml

2、配置结构体

3、注册到服务上下文 user/api/internal/svc/servicecontext.go

4、新建user模型文件 user/model/user.go

5、实现业务逻辑user/api/internal/logic/getuserlogic.go

user/api/internal/logic/createuserlogic.go

jwt

go-zero自带jwt.

1、编写api网关模板 user/api/user.api

生成代码

2、配置yaml user/api/etc/user-api.yaml
配置Auth标签。

3、配置config user/api/internal/config/config.go

4、编写登录逻辑 user/api/internal/logic/loginlogic.go

启动访问

获取jwt token中携带的信息

go-zero从jwt token解析后会将用户生成token时传入的kv原封不动的放在http.RequestContext中,因此我们可以通过Context就可以拿到你想要的值。

获取用户信息时,获取token携带的信息 user/api/internal/logic/getuserlogic.go

token必须在header以Authorization:bearer 携带

中间件

go-zero的中间件有路由中间件全局中间件

路由中间件

1、编写api网关模板,声明中间件 user/api/user.api

生成代码

生成完后会在internal目录下多一个middleware的目录,这里即中间件文件,后续中间件的实现逻辑也在这里编写。
2、把中间件注册到服务上下文ServiceContext user/api/internal/svc/servicecontext.go

3、编写中间件逻辑 user/api/internal/middleware/mymiddleware.go

运行

访问http://localhost:8888/users/id/1(因为定义了在这个路由上应用中间件),在控制台会输出中间里写的业务

全局中间件

在api网关入口文件中 user/api/user.go, 通过rest.Server提供的Use方法即可。

启动

访问任意路由,在控制台输出全局中间件的提示

错误处理

go-zero错误信息都是以plain text形式返回的,现在以json响应体来进行响应。

1、在项目新建common文件夹,与各个服务文件夹同级,是各个服务的公共文件夹。

common文件夹下新建errorx文件夹,用于存放自定义错误。并在errorx文件夹下添加一个baseerror.go文件,并填入代码。
路径:common/errorx/baseerror.go

2、逻辑中错误用CodeError自定义错误替换
比如,改造登录逻辑 user/api/internal/logic/loginlogic.go

3、在服务入口处,开启自定义错误 user/api/user.go

启动

访问login路由,输错密码,会返回如下信息

参考

go-zero微服务框架入门教程
go-zero官方文档


文章 go-zero 入门 转载需要注明出处
喜欢 (1)

您必须 登录 才能发表评论!