开发环境搭建
安装
golang
参见:源码安装 golang开启
go module
go env -w GO111MODULE=on
使用代理镜像
go env -w GOPROXY=https://goproxy.cn,direct
安装
goctl
(版本1.4.0)go install github.com/zeromicro/go-zero/tools/goctl@latest # 使用 golang安装 # 二进制下载地址 https://github.com/zeromicro/go-zero/releases
安装
protoc & protoc-gen-go
goctl env check -i -f --verbose
安装
mysql
、redis
、etcd
(略)
常用命令
生成
api
goctl api go -api myapi.api -dir .
生成
rpc
goctl rpc protoc myrpc.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
生成
model
(可选)goctl model mysql ddl -src tables.sql -dir . -c
启动
api
或rpc
go run myprj.go 或 go run myprj.go -f etc/myprj.yaml
示例用法(api服务端—rpc服务端)
目录结构:
|—— demo/ // 根目录 ****|—— api/ ********|—— test.api/ ****|—— rpc/ ********|—— test.proto/
文件内容:
demo/api/test.api
:type ( Req { Id string `path:"id"` } Resp { Id string `json:"id"` Name string `json:"name"` } ) service test { @handler testGet get /test/:id (Req) returns (Resp) }
demo/rpc/test.proto
:syntax = "proto3"; package test; option go_package = "./test"; service Test { rpc test(Req) returns(Resp); } message Req { uint32 id = 1; } message Resp { uint32 id = 1; string name = 2; }
初始化
go module
:cd demo go mod init demo
生成
api
:cd demo/api goctl api go -api test.api -dir .
生成
rpc
:cd demo/rpc goctl rpc protoc test.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
代码地址:
点击访问启动
rpc
:cd demo/rpc go run test.go
启动
api
:cd demo/api go run test.go
访问测试:
localhost:8888/test/1
示例用法(api客户端—api服务端 / rpc客户端—rpc服务端)
目录结构:
|—— demo/ // 根目录 ****|—— api/ ********|—— client/ ************|—— main.go ********|—— server/ ************|—— test.api ****|—— rpc/ ********|—— client/ ************|—— main.go ********|—— server/ ************|—— test.proto
文件内容:
demo/api/server/test.api
type ( Req { Id string `path:"id"` } Resp { Id string `json:"id"` Name string `json:"name"` } ) service test { @handler testGet get /test/:id (Req) returns (Resp) }
demo/api/client/main.go
package main import ( "fmt" "io" "io/ioutil" "net/http" ) func HTTP_GET(url string) (string, error) { resp, err := http.Get(url) if resp != nil { defer resp.Body.Close() } if err != nil { return "", err } else { if resp.StatusCode == 200 { var bodyReader io.ReadCloser = resp.Body body, err := ioutil.ReadAll(bodyReader) if err != nil { return "", err } else { return string(body), nil } } else { return "", fmt.Errorf("服务器异常") } } } func main() { url := "http://localhost:8888/test/1" ret, err := HTTP_GET(url) fmt.Println(ret, err) }
demo/rpc/server/test.proto
syntax = "proto3"; package test; option go_package = "./test"; service Test { rpc test(Req) returns(Resp); } message Req { uint32 id = 1; } message Resp { uint32 id = 1; string name = 2; }
demo/rpc/client/main.go
etcd
版package main import ( "context" "demo/rpc/server/testclient" "fmt" "github.com/zeromicro/go-zero/core/discov" "github.com/zeromicro/go-zero/zrpc" ) func main() { client := zrpc.MustNewClient(zrpc.RpcClientConf{ Etcd: discov.EtcdConf{ Hosts: []string{"127.0.0.1:2379"}, Key: "test.rpc", }, }) t := testclient.NewTest(client) resq, err := t.Test(context.Background(), &testclient.Req{Id: 1}) fmt.Println(resq, err) }
grpc
版package main import ( "demo/rpc/server/types/test" "fmt" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/grpclog" ) const ( Address = "127.0.0.1:8080" ) func main() { conn, err := grpc.Dial(Address, grpc.WithInsecure()) if err != nil { grpclog.Fatalln(err) } defer conn.Close() c := test.NewTestClient(conn) req := &test.Req{Id: 1111} res, err := c.Test(context.Background(), req) if err != nil { grpclog.Fatalln(err) } fmt.Println(res) }
初始化go module:
cd demo go mod init demo
生成api服务端代码:
cd demo/api/server goctl api go -api test.api -dir .
生成rpc服务端代码:
cd demo/rpc/server goctl rpc protoc test.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
代码地址:
点击访问
启动api服务:
cd demo/api/server go run test.go
调用api客户端:
cd demo/api/client go run main.go
启动rpc服务:
cd demo/rpc/server go run test.go
调用rpc客户端:
cd demo/rpc/client go run main.go
集成jaeger(链路追踪)
jaeger搭建:
docker run -d --name jaeger \ -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \ -e COLLECTOR_OTLP_ENABLED=true \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778 \ -p 16686:16686 \ -p 4317:4317 \ -p 4318:4318 \ -p 14250:14250 \ -p 14268:14268 \ -p 14269:14269 \ -p 9411:9411 \ jaegertracing/all-in-one:1.37
jaeger-ui访问地址:
http://localhost:16686
go-zero集成jaeger:
修改
api
服务的配置文件:vim demo/api/etc/test.yaml
Name: test ... Telemetry: Name: test.api Endpoint: http://localhost:14268/api/traces Sampler: 1.0 Batcher: jaeger
修改
rpc
服务的配置文件:vim demo/rpc/etc/test.yaml
Name: test.rpc ... Telemetry: Name: test.rpc Endpoint: http://localhost:14268/api/traces Sampler: 1.0 Batcher: jaeger