该工具适用于在 Micro 框架中基于 Protobuf 文件生成服务代码
# 在项目根目录下运行
go get -u github.com/micro/protoc-gen-micro# 根据你自己的系统下载对应的源码包 (比如我这里使用的是 mac book,我就要下载 osx 压缩包)
cd ~/go-tools && wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.1/protoc-3.19.1-osx-x86_64.zip
# 解压缩
unzip protoc-3.19.1-osx-x86_64.zip
# 编辑配置文件
vim ~/.zshrc
# 写入以下配置信息
export PATH="/Users/pudongping/go-tools/protoc-3.19.1-osx-x86_64/bin:$PATH"
source ~/.zshrc
# 该依赖包是 protobuf 的 Go 语言实现
go get -u github.com/golang/protobuf/protoc-gen-go注意需要将 $GOPATH/bin 也放到系统路径下
# 编辑配置文件
vim ~/.zshrc
# 写入以下配置信息
export PATH="$GOPATH/bin:$PATH"
source ~/.zshrc# 根据你自己的系统下载对应的源码包(比如我这里使用的是 mac book,我就要下载 etcd-v3.5.1-darwin-amd64.zip 包)
cd ~/go-tools && wget https://github.com/etcd-io/etcd/releases/download/v3.5.1/etcd-v3.5.1-darwin-amd64.zip
unzip unzip etcd-v3.5.1-darwin-amd64.zip
# 进入 etcd 解压缩后的文件夹中
cd etcd-v3.5.1-darwin-amd64
# 启动 etcd 服务器
./etcd
# 然后新开一个命令行窗口,通过 etcdctl 指令进行客户端测试
./etcdctl put alex "hello" # output: OK
./etcdctl get alex # output: alex hello在项目根目录下执行以下命令
protoc -I. --go_out=plugins=micro:. proto/meet.proto
# 亦或者可以在项目根目录下直接执行以下指令 (详情可见项目根目录下的 Makefile 文件)
make build如果在执行上述 protoc 命令时出错,提示 micro 插件不存在时,可以执行以下命令
protoc --proto_path=. --micro_out=. --go_out=. proto/meet.proto在项目根目录下运行如下命令自动下载服务实现代码中的依赖
go mod tidy启动服务
你也可以设置
MICRO_REGISTRY=etcd环境变量,这样每次启动的时候就不需要带上--registry=etcd参数 了,直接使用go run main.go
go run main.go --registry=etcd# 启动服务时:如果出现如下报错
panic: qtls.ConnectionState not compatible with tls.ConnectionState那么解决方式是:要么你将 go 的版本降到 1.15 以下,要么使用 go-micro v1.16.1 的版本。 但是貌似如果是 M1 芯片的 Mac 的话,还不能将 go 降版本到 1.16 以下,具体的我没有操作, 如果你操作了,发现可以,希望你也告知我一下,谢谢。
这里感谢 修复 go-micro 框架在高版本 Go 编译的运行时错误 提供的解决方案。
还有一种方式就是直接更新包,操作方式如下:
直接将以下复制到 go.mod 文件中,然后执行 go mod tidy
replace (
github.com/micro/go-micro => github.com/Lofanmi/go-micro v1.16.1-0.20210804063523-68bbf601cfa4
github.com/golang/protobuf => github.com/golang/protobuf v1.3.2
google.golang.org/genproto => google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1
google.golang.org/grpc v1.30.0 => google.golang.org/grpc v1.26.0
google.golang.org/protobuf => google.golang.org/protobuf v1.25.0
)
重新启动服务,我们可以看到 etcd 控制台有类似于如下的输出内容
{"level":"info","ts":"2021-11-16T02:23:01.727+0800","caller":"traceutil/trace.go:171","msg":"trace[214976224] put","detail":"{key:/micro/registry/Meet/Meet-ee5b8119-4ed0-474b-b948-86ee166325a2; req_size:614; response_revision:3; }","duration":"102.469459ms","start":"2021-11-16T02:23:01.623+0800","end":"2021-11-16T02:23:01.725+0800","steps":["trace[214976224] 'process raft request' (duration: 25.521542ms)","trace[214976224] 'marshal mvccpb.KeyValue' (duration: 76.424667ms)"],"step_count":2}
注意要先开启 etcd 服务
go run main.go --registry=etcd
# output
# 2021-11-16 03:10:54.791556 I | Transport [http] Listening on [::]:52109
# 2021-11-16 03:10:54.791613 I | Broker [http] Connected to [::]:52110
# 2021-11-16 03:10:54.791761 I | Registry [mdns] Registering node: Meet-900756d9-e27f-4fc8-b720-f0a2238c2ee4
go run client.go
# output
# response ==> 你好,Alex