为什么使用go-zero

你还在手撕微服务?快试试 go-zero 的微服务自动生成神器,这可能是我见过最简单好用的微服务框架。

还有比它更简单好用的吗?欢迎留言评论和推荐。

几分钟搞定个接口和微服务,还不用担心稳定性和高并发,这不香吗?还有比这更简单和高效的吗?

工具大于约定和文档的理念编码自动化,大幅度的提高效率和生产力,这会是个趋势,让精力更多的放在业务和创新上

推荐下go-zero 微服务框架,致力于打造国内最简单好用的框架。

为什么使用go-zero?

可以有第三个选择

  • golang圈子不大,微服务框架框架屈指可数:除了go-micro、go-kit,几乎没有其他选择。go-zero为此提供第三个可能。
  • go-micro 对webapi支持并不友好,需要运行micro指令,难以定制

需要一款支持业务成长的框架

我们到底需要什么样的框架?

我们需要一款可以支持业务成长的框架!产品运营初期,比如需求验证阶段,我们并不需要采取微服务架构,因为运营成本太高,一款单体应用足以应付。随着业务发展,微服务成为必要,此时我们又希望不进行太多的代码编写工作,柔性升级。这正是go-zero价值所在。

go-zero是什么

以下安利是copy的的,具体参考https://github.com/tal-tech/go-zero
go-zero是一个集成了各种工程实践的包含web和rpc框架,有如下主要特点:

  • 强大的工具支持,尽可能少的代码编写
  • 极简的接口
  • 完全兼容net/http
  • 支持中间件,方便扩展
  • 高性能
  • 面向故障编程,弹性设计
  • 内建服务发现、负载均衡
  • 内建限流、熔断、降载,且自动触发,自动恢复
  • API参数自动校验
  • 超时级联控制
  • 自动缓存控制
  • 链路跟踪、统计报警等
  • 高并发支撑,稳定保障了晓黑板疫情期间每天的流量洪峰

怎么用

在阅读本文档前,请将golang 升级到go14及以上版本,并开启go module支持,GO14以上只是为了支持Gorm

export GOPROXY=https://goproxy.io,direct
export GO111MODULE=on

安装goctl

goctl是go-zero配套的代码生成器,偷懒神器,毕竟写代码大多时间是体力活
如何安装呢?先把源代码下载下来吧!

git clone https://github.com/tal-tech/go-zero
cd go-zero/tools/goctl
go build goctl.go

最后生成goctl.exe 复制到$gopath/bin

goctl指令说明

自行浏览文档吧https://github.com/tal-tech/go-zero/blob/master/tools/goctl/goctl.md

本文用到指令如下

goctl api    go    -api       open.api   -dir    .
#代码说明如下
goctl  api      go       -api             open.api            -dir                     .|      |        |         |                 |                  |                      | 生成api  go语言     指定api模板文件   模板文件名称         指定生成代码存放路径     当前文件夹

创建项目

生成go.mod文件

输入如下指令,创建项目

mkdir hello
cd hello
go mod init  hello

定义hello.api

本文设计API如下

描述 格式 方法 参数 返回
用户注册 /open/register post mobile:手机号,passwd:密码,code:图片验证码 id:用户ID,token:用户token
用户登录 /open/authorization post mobile:手机号,passwd:密码,code:图片验证码 id:用户ID,token:用户token
图片验证码请求 /open/verify get ticket:图片验证码的id data:base64格式的图片

根据以上描述,书写api的模板文件如下

type (UserOptReq struct {mobile string `json:"mobile"`passwd string `json:"passwd"`code   string `json:"code"`}UserOptResp struct {id    uint   `json:"id"`token string `json:"token"`}//图片验证码支持VerifyReq struct {ticket string `json:"ticket"`}//图片验证码支持VerifyResp struct {data string `json:"data"`}
)service open-api {@doc(summary: 公开的api函数desc: >register 用户注册,authorization 用户登录,verify 图片验证码接口)@server(handler: registerHandlerfolder: open)post /open/register(UserOptReq) returns(UserOptResp)@server(handler: authorizationHandlerfolder: open)post /open/authorization(UserOptReq) returns(UserOptResp)@server(handler: verifyHandlerfolder: open)post /open/verify(VerifyReq) returns(VerifyResp)}

注意

  • 一个文件里面只能有一个service
  • 工具最后会以type里面模型为样板生成各种结构体,所以参数和结构体保持一致即可
  • 如果我们需要分文件夹管理业务, 可以用folder属性来定义

生成代码

采用如下指令生成代码

goctl api  go   -api   open.api   -dir  .

最后代码结构如下

#tree /F /A
|   go.mod
|   go.sum
|   hello.api
|   open.go
|
+---etc
|       open-api.yaml
|
\---internal+---config|       config.go|+---handler|   |   routes.go|   ||   \---open|           authorizationhandler.go|           registerhandler.go|           verifyhandler.go|+---logic|   \---open|           authorizationlogic.go|           registerlogic.go|           verifylogic.go|+---svc|       servicecontext.go|\---typestypes.go

运行一下

go run open.go

测试一下

curl http://127.0.0.1:8888/open/register -X POST -H "Content-Type: application/json" -d {\"mobile\":\"15367151352\",\"passwd\":\"testpwd\",\"code\":\"asdf\"}
{"id":0,"token":""}

集成明星产品Gorm V2

金珠大佬升级了Gorm V2,集成测试一下吧

配置文件

配置文件在etc/open-api.yaml

Name: open-api
Host: 0.0.0.0
Port: 8888
DataSourceName: root:1D007648b4f8@(127.0.0.1:3306)/gozero?charset=utf8

etc/open-api.yaml中添加参数DataSourceName,
internal/config/config.go中添加DataSourceName

type Config struct {rest.RestConfDataSourceName string
}

关于配置文件,系统内置了一部分关键字 如Cache,资料不多;

基本上可以随便配置,然后在Conf中定义同名变量即可。

启动Gorm支持

修改svc/servicecontext.go代码如下

package svcimport ("hello/internal/config""hello/internal/models""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/schema"
)type ServiceContext struct {Config  config.ConfigDbEngin *gorm.DB
}func NewServiceContext(c config.Config) *ServiceContext {//启动Gorm支持db, err := gorm.Open(mysql.Open(c.DataSourceName), &gorm.Config{NamingStrategy: schema.NamingStrategy{TablePrefix:   "tech_", // 表名前缀,`User` 的表名应该是 `t_users`SingularTable: true,    // 使用单数表名,启用该选项,此时,`User` 的表名应该是 `t_user`},})//如果出错就GameOver了if err != nil {panic(err)}//自动同步更新表结构,不要建表了O(∩_∩)O哈哈~db.AutoMigrate(&models.User{})return &ServiceContext{Config: c, DbEngin: db}
}

新建模型文件

新建models\models.go文件

//models\models.go文件
package modelsimport ("errors""hello/internal/utils""gorm.io/gorm"
)type User struct {gorm.ModelMobile string `gorm:"index:mobile;type:varchar(13)"`Passwd string `gorm:"type:varchar(64)"`
}
//在创建前检验验证一下密码的有效性
func (u *User) BeforeCreate(db *gorm.DB) error {if len(u.Passwd) < 6 {return errors.New("密码太简单了")}//对密码进行加密存储u.Passwd = utils.Password(u.Passwd)return nil
}

utils.Password是我们编写的工具包,代码如下

package utilsimport ("fmt""golang.org/x/crypto/bcrypt"
)//密码加密
func Password(plainpwd string) string {//谷歌的加密包hash, err := bcrypt.GenerateFromPassword([]byte(plainpwd), bcrypt.DefaultCost) //加密处理if err != nil {fmt.Println(err)}encodePWD := string(hash) // 保存在数据库的密码,虽然每次生成都不同,只需保存一份即可return encodePWD
}
//密码校验
func CheckPassword(plainpwd, cryptedpwd string) bool {err := bcrypt.CompareHashAndPassword([]byte(cryptedpwd), []byte(plainpwd)) //验证(对比)return err == nil
}

实现业务逻辑

logic\open\registerlogic.go中修改代码如下

package logicimport ("context""hello/internal/models""hello/internal/svc""hello/internal/types""github.com/tal-tech/go-zero/core/logx"
)type RegisterLogic struct {ctx context.Contextlogx.LoggersvcCtx *svc.ServiceContext
}func NewRegisterLogic(ctx context.Context, svcCtx *svc.ServiceContext) RegisterLogic {return RegisterLogic{ctx:    ctx,Logger: logx.WithContext(ctx),svcCtx: svcCtx,}
}func (l *RegisterLogic) Register(req types.UserOptReq) (*types.UserOptResp, error) {user := models.User{Mobile: req.Mobile,Passwd: req.Passwd,}result := l.svcCtx.DbEngin.Create(&user)return &types.UserOptResp{Id: user.ID,}, result.Error
}
  • RegisterLogic中添加svcCtx *svc.ServiceContext,因为需要用到里面的DbEngin
  • NewRegisterLogic 配置svcCtx
  • 在Register函数中实现逻辑result := l.svcCtx.DbEngin.Create(&user)

测试一下

>curl http://127.0.0.1:8888/open/register -X POST -H "Content-Type: application/json" -d {\"mobile\":\"15367151352\",\"passwd\":\"testpwd\"}
{"id":3,"token":""}

期待更新的功能点

go-zero

接口定义希望支持多种content-type

UserOptReq struct {mobile string `json:"mobile" form:"mobile" xml:"mobile"`passwd string `json:"passwd" form:"passwd" xml:"passwd"`code   string `json:"code" form:"code" xml:"code"`
}

一种可能的解决方法是
修改github.com/tal-tech/go-zero/rest/httpx/requests.go中的Parse成如下模型

func Parse(r *http.Request, v interface{}) error {if err := ParsePath(r, v); err != nil {return err}if strings.Contains(r.Header.Get(ContentType), multipartFormData) {return ParseForm(r, v)} else if strings.Contains(r.Header.Get(ContentType), urlencodeformdata) {return ParseForm(r, v)} else if strings.Contains(r.Header.Get(ContentType), applicationjson) {return ParseJsonBody(r, v)} else {return errors.New("不支持的请求类型")}
}

支持一个文件多个方法

比如如下写法,则生成俩个方法在verifyHandler.go文件中

 @server(handler: verifyHandlerfolder: open)post /open/verify(VerifyReq) returns(VerifyResp)post /open/authorization(UserOptReq) returns(UserOptResp)

支持类似Swagger的文档和Api接口自动生成和自动化测试

gorm v2

建议默认SingularTable属性为true

NamingStrategy: schema.NamingStrategy{TablePrefix:   "tech_", // 表名前缀,`User` 的表名应该是 `t_users`SingularTable: true,    // 使用单数表名,启用该选项,此时,`User` 的表名应该是 `t_user`},

建议增强缓存功能

建议提供缓存如redis/memcache/内存缓存支持

本文代码获取

关注公众号betaidea 输入gozero或者gormv2即可获得

转自:https://blog.csdn.net/yyz_1987/article/details/108367692

go-zero微服务框架入门教程相关推荐

  1. Seneca :NodeJS 微服务框架入门指南

    Seneca :NodeJS 微服务框架入门指南 原文:http://onmr.com/press/getting-started-seneca.html Seneca 是一个能让您快速构建基于消息的 ...

  2. Seneca:NodeJS 微服务框架入门(一)

    Seneca是什么? (1)官网是这样介绍的: Seneca is a microservices toolkit for Node.js. It helps you write clean, org ...

  3. Dubbo系列之微服务框架整合教程

    文章目录 一.分布式基本知识 1.1) 架构演变 1.2).分布式基本概念 二.RPC简介 2.1) RPC概念 2.2) RPC核心模块 三.Dubbo原理简介 3.1) Dubbo简介 3.2) ...

  4. go web框架_golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

    micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  5. Spring Boot如何在最短时间里快速搭建微服务框架,详细教程贡上

    前言: Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置. 简单来说,它提供了一堆依赖打包,并 ...

  6. Surging 微服务框架使用入门

    前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...

  7. B站微服务框架Kratos详细教程(1)- 安装搭建

    Kratos Kratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具. 名字来源于:<战神>游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成 ...

  8. Spring Cloud构建微服务架构:消息驱动的微服务(入门)【Dalston版】

    之前在写Spring Boot基础教程的时候写过一篇<Spring Boot中使用RabbitMQ>.在该文中,我们通过简单的配置和注解就能实现向RabbitMQ中生产和消费消息.实际上我 ...

  9. 最新微服务框架SpringCloud Alibaba介绍,搭建

    微服务和SpringCloud Alibaba详细介绍(一),手把手搭建微服务框架 PS:本博客是本人参照B站博主:JAVA阿伟如是说 的视频讲解手敲整理的笔记 跟着一起手动搭建的框架 供大家一起学习 ...

最新文章

  1. 【组队学习】十一月微信图文索引
  2. 基于SSM实现在线课程学习及作业提交系统
  3. STC89C52单片机 使用定时器使LED灯闪烁
  4. 具有N个量子存储位的计算机,未来世界是科技的世界,未来的计算机也会有这几类...
  5. 一道3G门户的面试题 (Java)
  6. 51nod1220-约数之和【莫比乌斯反演,杜教筛】
  7. Windows 与 Linux 通过Xshell 文件互传
  8. Oracle flashback之传统恢复vs.重现数据库
  9. c 语言程序设计(清华大学郑莉),清华大学 C++程序设计语言 45 郑莉 视频教程
  10. 算法设计与分析课后习题答案
  11. 单纯形法的代码实现与退化算例
  12. 管理“项目”之人际关系篇
  13. 第三部分PaddleX模型集_3.1 图像分类
  14. 互联网虚拟大脑的结构全景图
  15. ⭐算法入门⭐《动态规划 - 串匹配》困难02 —— LeetCode 72. 编辑距离
  16. 花店小程序商城开发,开展线上引流渠道
  17. 分享一个横向打印二叉树图形的方法
  18. mysql eav设计模型_Magento 2数据库EAV模型结构
  19. 互联网职场常用逼格词汇
  20. Keil uvision 5 安装和使用

热门文章

  1. 数据库设计之第一范式、第二范式、第三范式
  2. python教程菜鸟教程学习路线
  3. python通过命令升级pip出错解决方法
  4. c语言图形函数linerel,C语言图形函数库总结graphics.h
  5. 盘点5款超棒的电脑软件
  6. Word文档如何压缩?这几个方法压缩率超高,不破坏排版
  7. 用Python学数学之Sympy代数符号运算
  8. 计算机通信工程培训,通信工程师培训有没有比较好的视频网站?
  9. BT656/BT601/BT1120协议以及DM365/DM355/DM6467上使用的YUV颜色空间说明
  10. webm和mp4的重要区别