go-zero一键生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,并经受了充分的实战检验(好未来-晓黑板)。
go-zero 包含极简的 API 定义和生成工具 goctl(go control),可以根据定义的 api 文件一键生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行。
![](https://pic4.zhimg.com/80/v2-198c36e5de1feb9a737046a3618a067f_720w.webp)
项目特点
go-zero 是一个集成了各种工程实践的包含 web 和 rpc 框架,有如下主要特点:
- 强大的工具支持,尽可能少的代码编写
- 极简的接口
- 完全兼容 net/http
- 支持中间件,方便扩展
- 高性能
- 面向故障编程,弹性设计
- 内建服务发现、负载均衡
- 内建限流、熔断、降载,且自动触发,自动恢复
- API 参数自动校验
- 超时级联控制
- 自动缓存控制
- 链路跟踪、统计报警等
- 高并发支撑,稳定保障了疫情期间每天的流量洪峰
安装
项目安装
GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/go-zero
项目验证
安装goctl工具
GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/go-zero/tools/goctl
如果使用 go1.16 版本, 可以使用 go install
命令安装
GOPROXY=https://goproxy.cn/,direct go install http://github.com/tal-tech/go-zero/tools/goctl@latest |
快速生成api服务
goctl api new greet cd greet go mod init go mod tidy go run greet.go -f etc/greet-api.yaml . |____go.mod |____etc //存放配置文件 | |____greet-api.yaml |____internal | |____handler // 路由与处理器 | | |____routes.go | | |____greethandler.go | |____types //中间类型 | | |____types.go | |____config // 配置-对应etc下配置文件 | | |____config.go | |____logic //逻辑处理 | | |____greetlogic.go | |____svc //依赖资源 | | |____servicecontext.go |____go.sum |____greet.api //api接口与类型定义 |____greet.go //main.go 入口 |
默认侦听在 8888 端口(可以在配置文件里修改),可以通过 curl 请求:
curl -i http://localhost:8888/from/you //此处接口是预定义接口,作为验证使用。 |
返回如下:
HTTP/1.1 200 OK Content-Type: application/json Date: Thu, 22 Oct 2020 14:03:18 GMT Content-Length: 14 {"message":""} |
快速生成rpc服务
goctl rpc new greet tree . ├── etc // yaml配置文件 │ └── greet.yaml ├── go.mod ├── greet // pb.go文件夹① │ └── greet.pb.go ├── greet.go // main函数 ├── greet.proto // proto 文件 ├── greetclient // call logic ② │ └── greet.go └── internal ├── config // yaml配置对应的实体 │ └── config.go ├── logic // 业务代码 │ └── pinglogic.go ├── server // rpc server │ └── greetserver.go └── svc // 依赖资源 └── servicecontext.go 方式2: 通过定义好的proto文件,生成相应的rpc服务 goctl rpc template -o=user.proto |
快速生成model服务
方式1:通过ddl生成 goctl mysql goctl model mysql ddl -src="./*.sql" -dir="../" -c=true(是否加缓存) . |____tdfsubscriptionmodel.go |____vars.go |____sql | |____sub.sql 方式2:通过datasource生成 goctl model mysql datasource -url="user:password@tcp(127.0.0.1:3306)/database" -table="*" -dir="./" . |____tdfsubscriptionmodel.go |____vars.go |____diversionrulesmodel.go |____sql | |____sub.sql |
快速添加api接口定义
vim greet.api type Request { Name string `path:"name,options=you|me"` } type Response { Message string `json:"message"` } type ARequest { UserId string `path:"userId"` } type AResponse { UserId string `json:"userId"` UserName string `json:"userName"` Age int64 `json:"age"` } service greet-api { @handler GreetHandler get /from/:name(Request) returns (Response); @handler UserHandler get /userInfo/:userId(ARequest) returns (AResponse); } 执行api命令 goctl api go -api greet.api -dir . . |____go.mod |____etc | |____greet-api.yaml |____internal | |____handler | | |____userhandler.go // 新增handler | | |____routes.go | | |____greethandler.go | |____types | | |____types.go // 新增type都在这里 | |____config | | |____config.go | |____logic | | |____userlogic.go //具体逻辑 | | |____greetlogic.go | |____svc | | |____servicecontext.go |____go.sum |____greet.api |____greet.go |
快速生成Dockerfile
goctl docker -go greet.go . |____go.mod |____Dockerfile // 当前服务的Dockerfile文件 |____etc | |____greet-api.yaml |____internal | |____handler | | |____userhandler.go | | |____routes.go | | |____greethandler.go | |____types | | |____types.go | |____config | | |____config.go | |____logic | | |____userlogic.go | | |____greetlogic.go | |____svc | | |____servicecontext.go |____go.sum |____greet.api |____greet.go |
快速生成k8s部署文件
goctl kube deploy -name redis -namespace adhoc -image redis:6-alpine -o redis.yaml -port 6379 生成的yaml文件如下: apiVersion: apps/v1 kind: Deployment metadata: name: redis namespace: adhoc labels: app: redis spec: replicas: 3 revisionHistoryLimit: 5 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:6-alpine lifecycle: preStop: exec: command: ["sh","-c","sleep 5"] ports: - containerPort: 6379 readinessProbe: tcpSocket: port: 6379 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: tcpSocket: port: 6379 initialDelaySeconds: 15 periodSeconds: 20 resources: requests: cpu: 500m memory: 512Mi limits: cpu: 1000m memory: 1024Mi volumeMounts: - name: timezone mountPath: /etc/localtime volumes: - name: timezone hostPath: path: /usr/share/zoneinfo/Asia/Shanghai --- apiVersion: v1 kind: Service metadata: name: redis-svc namespace: adhoc spec: ports: - port: 6379 selector: app: redis --- apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: redis-hpa-c namespace: adhoc labels: app: redis-hpa-c spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: redis minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: name: cpu targetAverageUtilization: 80 --- apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: redis-hpa-m namespace: adhoc labels: app: redis-hpa-m spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: redis minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: name: memory targetAverageUtilization: 80 |
参考:
https://zeromicro.github.io/go-zero/
https://github.com/tal-tech/go-zero
https://github.com/tal-tech/zero-doc
发布于 2022-03-01 19:36