01 go-zero入门--单体服务demo
官方文档:
https://go-zero.dev/cn/docs/introduction
视频地址:
https://space.bilibili.com/387126464/channel/series
系统环境:
linux debain
配置环境:
1. golang安装
配置go环境变量:
vim /home/haima/.bashrc
export GOROOT="/usr/local/go" #go源码包
export GOPATH=/home/go # go工作路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
source /home/haima/.bashrc
2. go module配置
go env -w GO111MODULE="on"
go env -w GOPROXY=https://goproxy.cn
go env -w GOMODCACHE=$GOPATH/pkg/mod
3. goctl安装
参考:
https://go-zero.dev/cn/docs/goctl/installation
goctl一键安装
Go 1.16 及以后版本
安装(mac&linux)
GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest
查看版本
haima@haima-PC:~$ goctl -v
goctl version 1.3.4 linux/amd64
安装(windows)
$ go install github.com/zeromicro/go-zero/tools/goctl@latest
$ goctl -v
goctl version 1.4.0 windows/amd64
4.protoc,protoc-gen-go,protoc-gen-go-grpc安装
方式一:
如果goctl安装的版本是>=1.3.3版本的,执行以命令就可以自动安装protoc,protoc-gen-go,protoc-gen-go-grpc三个依赖
haima@haima-PC:~/Desktop$ goctl -v
goctl version 1.3.3 linux/amd64
$ goctl env check -i -f --verbose
[goctl-env]: preparing to check env
[goctl-env]: looking up "protoc"
[goctl-env]: "protoc" is not found in PATH
[goctl-env]: preparing to install "protoc"
"protoc" installed from cache
[goctl-env]: "protoc" is already installed in "/Users/keson/go/bin/protoc"
[goctl-env]: looking up "protoc-gen-go"
[goctl-env]: "protoc-gen-go" is not found in PATH
[goctl-env]: preparing to install "protoc-gen-go"
"protoc-gen-go" installed from cache
[goctl-env]: "protoc-gen-go" is already installed in "/Users/keson/go/bin/protoc-gen-go"
[goctl-env]: looking up "protoc-gen-go-grpc"
[goctl-env]: "protoc-gen-go-grpc" is not found in PATH
[goctl-env]: preparing to install "protoc-gen-go-grpc"
"protoc-gen-go-grpc" installed from cache
[goctl-env]: "protoc-gen-go-grpc" is already installed in "/Users/keson/go/bin/protoc-gen-go-grpc"
[goctl-env]: congratulations! your goctl environment is ready!
方式二: 源文件安装
goctl版本小于 1.3.3 参考以下面源文件安装,单个手动安装protoc,protoc-gen-go,protoc-gen-go-grpc三个依赖
1. protoc&protoc-gen-go安装
1.1 protoc安装
进入 protobuf release 页面,选择适合自己操作系统的压缩包文件下载,这里我选择
protoc-3.19.4-linux-x86_64.zip
https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-linux-x86_64.zip解压出来后进入该目录下的bin目录中,将protoc直接copy到你的gopath/bin目录下即可。
如$GOPATH/bin,这里不建议直接将其和系统的以下path放在一起。export PATH=$PATH:$GOPATH/bin注意:$GOPATH/bin要加入到系统PATH中,如已加入可跳过
查看版本
haima@haima-PC:~$ protoc --version
libprotoc 3.19.4
1.2 protoc-gen-go 安装
如果goctl 版本已经是1.2.1以后了,可以忽略此步骤。
GOPROXY=https://goproxy.cn/,direct go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
查看$GOPATH/bin下是否有protoc-gen-go即可
【注】:如果后续在使用goctl生成代码时候,遇到以下问题
protoc --proto_path=/Users/seven/Developer/goenv/go-zero-looklook/app/usercenter/cmd/rpc/pb usercenter.proto --go_out=plugins=grpc:/Users/seven/Developer/goenv/go-zero-looklook/app/usercenter/cmd/rpc --go_opt=Musercenter.proto=././pb
goctl: generation error: unsupported plugin protoc-gen-go which installed from the following source:
google.golang.org/protobuf/cmd/protoc-gen-go,
github.com/protocolbuffers/protobuf-go/cmd/protoc-gen-go;
Please replace it by the following command, we recommend to use version before v1.3.5:
go get -u github.com/golang/protobuf/protoc-gen-go
goctl version: 1.3.0 darwin/amd64
直接执行
$ GOPROXY=https://goproxy.cn/,direct go get -u github.com/golang/protobuf/protoc-gen-go 下载包
查看版本
haima@haima-PC:~/Desktop$ protoc-gen-go --version
protoc-gen-go v1.27.1
1.3 protoc-gen-go-grpc 安装
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
查看版本
haima@haima-PC:~$ protoc-gen-go-grpc -version
protoc-gen-go-grpc 1.2.0
单体服务
创建greet服务
$ cd ~/go-zero-single_demo
$ go mod init go-zero-single_demo
$ goctl api new greet
$ go mod tidy
目录结构
cd ~/go-zero-single_demotree
服务的目录结构:
.
├── go.mod
├── go.sum
├── etc
│ └── greet-api.yaml
├── greet.api
├── greet.go
└── internal
├── config
│ └── config.go
├── handler
│ ├── greethandler.go
│ └── routes.go
├── logic
│ └── greetlogic.go
├── svc
│ └── servicecontext.go
└── types
└── types.go
编写逻辑
vim go-zero-single_demo/greet/internal/logic/greetlogic.go
func (l *GreetLogic) Greet(req types.Request) (*types.Response, error) {
return &types.Response{
Message: "Hello go-zero""+req.Name,
}, nil
}
启动并访问服务
- 启动服务
$ cd ~/go-zero-single_demo/greet
$ go run greet.go -f etc/greet-api.yaml
- 访问服务
$ curl -i -X GET \
http://localhost:8888/from/you
返回
HTTP/1.1 200 OK
Content-Type: application/json
Date: Sun, 07 Feb 2021 04:31:25 GMT
Content-Length: 27
{"message":"Hello go-zero name:you"}
goland启动配置:
greet.go -f etc/greet-api.yaml



修改GET入参
去除options限制的入参值
- 修改greet/greet.api 文件
type Request {
Name string `path:"name,options=you|me"`
}
修改为
type Request {
Name string `path:"name"`
}
- 重新生成代码
$ cd ~/go-zero-single_demo/greet
$ goctl api go -api greet.api -dir . -style gozero
文件greet/internal/types/types.go 会被重新生成

- 重启服务
$ cd ~/go-zero-single_demo/greet
$ go run greet.go -f etc/greet-api.yaml
- 访问服务
$ curl -i -X GET \
http://localhost:8888/from/haima
返回
{
"message": "Hello go-zero name:haima"
}
添加post请求
- 修改
greet/greet.api文件
type RequestJson {
Name string `json:"name"`
}
service greet-api {
......
@handler GreetPostHandler
post /from/:name(RequestJson) returns (Response)
}
- 重新生成代码
$ cd ~/go-zero-single_demo/greet
$ goctl api go -api greet.api -dir . -style gozero
会成生以下两个文件
- greet/internal/handler/greetposthandler.go
- greet/internal/logic/greetpostlogic.go
文件greet/internal/types/types.go里会自动添加如下代码
type RequestJson struct {
Name string `json:"name"`
}
- 修改
greet/internal/logic/greetpostlogic.go文件
func (l *GreetPostLogic) GreetPost(req types.RequestJson) (resp *types.Response, err error) {
// todo: add your logic here and delete this line
return &types.Response{
Message: "Hello go-zero name:"+req.Name,
}, nil
}
- 重启服务
$ cd ~/go-zero-single_demo/greet
$ go run greet.go -f etc/greet-api.yaml
- post请求
新建test.http请求文件
###
GET http://127.0.0.1:8888/from/haima HTTP/1.1
###
POST http://127.0.0.1:8888/from/haima HTTP/1.1
Content-Type: application/json
{
"name":"post haima"
}
返回
{
"message": "Hello go-zero name:post haima"
}
01 go-zero入门--单体服务demo的更多相关文章
- Java生鲜电商平台-微服务入门与服务的拆分架构实战
Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在“强大”的JSP上面,那时候SOA已经算是新技术了 ...
- 前端学习 node 快速入门 系列 —— 服务端渲染
其他章节请看: 前端学习 node 快速入门 系列 服务端渲染 在简易版 Apache一文中,我们用 node 做了一个简单的服务器,能提供静态资源访问的能力. 对于真正的网站,页面中的数据应该来自服 ...
- Go单体服务开发最佳实践
单体最佳实践的由来 对于很多初创公司来说,业务的早期我们更应该关注于业务价值的交付,并且此时用户体量也很小,QPS 也非常低,我们应该使用更简单的技术架构来加速业务价值的交付,此时单体的优势就体现出来 ...
- PHP接入阿里云市场 阿里短信服务DEMO
阿里短信服务:支持三大运营商短信.智能管道等优质能力,产品特点:3秒可达.99%到达率.超低资费. 使用阿里短信服务步骤: 1.购买服务 到https://market.aliyun.com/prod ...
- Tensoflw.js - 01 - 安装与入门(中文注释)
Tensoflw.js - 01 - 安装与入门(中文注释) 参考 W3Cschool 文档:https://www.w3cschool.cn/tensorflowjs/ 本文主要翻译一些英文注释,添 ...
- PHP入门及服务环境配置(Nginx+PHP)
PHP入门及服务环境配置(Nginx+PHP) PHP入门 PHP维基百科: PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一 ...
- 带你入门SpringCloud服务发现 | Eurka搭建和使用
前言 服务注册与发现是微服务中最为基础的环节,而 Eureka 就是一个可以帮助你实现服务注册与发现的选择之一.如果你对 Eureka 和服务发现了解甚少,那么该篇博客将会帮助到你.文中通过具体操作带 ...
- Linux入门(服务)
LInux入门之 服务 服务介绍 常驻在内存中的程序,且可以提供一些系统或网络功能,那就是服务.比如: apache提供web服务 ftp提供文件下载上传服务 ssh提供了远程连接服务 防火墙提供了安 ...
- Java自动化测试框架-01 - TestNG之入门篇 - 大佬的鸡肋,菜鸟的盛宴(详细教程)
TestNG是什么? TestNG按照官方的定义: TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便. TestNG是一个开源自动化测试框 ...
- vue入门 0 小demo (挂载点、模板、实例)
vue入门 0 小demo (挂载点.模板) 用直接的引用vue.js 首先 讲几个基本的概念 1.挂载点即el:vue 实例化时 元素挂靠的地方. 2.模板 即template:vue 实例化时挂 ...
随机推荐
- 京东一面挂在了CAS算法的三大问题上,痛定思痛不做同一个知识点的小丑
写在开头 在介绍synchronized关键字时,我们提到了锁升级时所用到的CAS算法,那么今天我们就来好好学一学这个CAS算法. CAS算法对build哥来说,可谓是刻骨铭心,记得是研二去找实习的时 ...
- MySQL数据库维护和改善性能
备份数据 由于MySQL数据库是基于磁盘的文件,普通的备份系统和例程就能备份MySQL的数据.但是,由于这些文件总是处于打开和使用状态,普通的文件副本备份不一定总是有效.下面列出这个问题的可能解决 ...
- 从零开始学Spring Boot系列-集成MyBatis-Plus
在Spring Boot应用开发中,MyBatis-Plus是一个强大且易于使用的MyBatis增强工具,它提供了很多实用的功能,如代码生成器.条件构造器.分页插件等,极大地简化了MyBatis的使用 ...
- 5 个编写高效 Makefile 文件的最佳实践
在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动化构建.编译.测试和部署.然而,编写高效的Makefile文件并不是一件容易的事情.在本文中,我们将讨论如何编写高效的Make ...
- HarmonyOS远端状态订阅开发实例
IPC/RPC提供对远端Stub对象状态的订阅机制, 在远端Stub对象消亡时,可触发消亡通知告诉本地Proxy对象.这种状态通知订阅需要调用特定接口完成,当不再需要订阅时也需要调用特定接口取消.使 ...
- Python2同时输出中文和变量时中文乱码
Python2同时输出中文和变量时中文乱码 一.问题描述 最近在学习tensorflow时,突然发现一个问题,python2在输出中文和变量时会出现一点问题,如下图: 可以看到,输出并不是想要的结果, ...
- 有用的JavaScript技巧
首次为变量赋值时务必使用var关键字 变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量. 使用===取代== ==和!=操作符会在需要的情况下自动转换数据类型.但===和 ...
- 大数据ETL开发之图解Kettle工具入门到精通(经典转载)
大数据ETL开发之图解Kettle工具(入门到精通) 置顶 袁袁袁袁满 文章目录 第0章 ETL简介 第1章 Kettle简介 1.1 Kettle是什么 1.2 Kettle的两种设计 1.3 Ke ...
- 深度解读《深度探索C++对象模型》之返回值优化
接下来我将持续更新"深度解读<深度探索C++对象模型>"系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表. 没有启用返回值优 ...
- ASP.NET Core Web API下基于Keycloak的多租户用户授权的实现
在上文<Keycloak中授权的实现>中,以一个实际案例介绍了Keycloak中用户授权的设置方法.现在回顾一下这个案例: 服务供应商(Service Provider)发布/Weathe ...