记一下学习上古Go-Micro手配环境踩到的坑
由于已经配过了go-proxy,所以跑go get没任何问题,因此解决了大半难题
具体环境如下:
- Windows 10 20H2 19042.1237
- GoLand 2021.2.1
- GOVERSION=go1.16.7
- GO111MODULE=on
- GOPROXY=https://goproxy.cn
- Consul v1.10.2
- mingw32-gcc.exe (tdm-1) 4.9.2
历史背景
首先是Go-Gicro的架构,老教程都是所谓micro/v1或者v2的api,现在(2021)已经被弃用了,micro公司主推v3版本,也就是micro/micro又叫m3o,参考。老的go-micro库被移动至了公司CEO个人git库下面了,现在叫asim/go-micro。
但是我们仍然可以使用go get github.com/micro/go-micro,他会自动重定向至新库。
就像这样:
1 |
|
开工
好了,现在源码已经get到了,写个helloword吧。
1 |
|
ETCD给我们的第一个惊喜
直接点goland提供给我们的运行
报:
1 |
|
好吧,查了之后是etcd使用了老版本的grpc,但依赖中指定的是latest,所以我们要手指一下依赖版本:
在项目的go.mod底部replace
中追加一行,如:
1 |
|
go版本给我们的第二个惊喜
现在我们同步一下依赖关系,点运行。
报:
1 |
|
好吧,搜过之后发现给了俩解决方案
- 降到go1.15之下
- 升级至micro/v3
那我们跟课肯定没办法升级micro了,所以只能选择降级go版本,人懒了,直接在goland里新开了个版本号文件->设置->Go->GOROOT
中右侧点加号选下载
选择go1.14.15,新建个目录丢进去,等进度条跑完,然后点编译。
第一阶段结束
终于成功了:
1 |
|
长舒一口气~
使用micro工具创建工程
micro new -type=srv microsrv
注意:名称中不能有下划线,不能以_test结尾,否则会被认为是测试包。
Protobuf 环境
- 手动下载https://github.com/protocolbuffers/protobuf/releases找到最新的v3.18.0的protoc并放置在环境变量中
- go get -u github.com/golang/protobuf/proto
- go get -u github.com/golang/protobuf/protoc-gen-go
- go get -u github.com/micro/protoc-gen-micro
- go get -u github.com/micro/micro/v2
- 并进入pkg目录编译micro主程序
go build main.go
将编译好的exe重命名为micro.exe放置在环境变量中
- 并进入pkg目录编译micro主程序
然后我们使用micro new --type="srv" microsrv
创建一个micro服务,并生成proto源码:
1 |
|
查过之后是protoc-gen-go的版本在1.4有了重大更新,改了一堆东西,所以go get指定1.3.5版本再下一次就好了。
go get github.com/golang/protobuf/protoc-gen-go@v1.3.5
编译带consul的main.go
在micro生成的项目中的main.go中,import内添加一行_ "github.com/micro/go-plugins/registry/consul"
然后在工程目录中运行 go run main.go --registry=consul
或者修改Goland的运行配置中的程序参数也可得到同样的结果。
这样微服务启动时就会自动寻找localhost的consul进行注册了。
1 |
|
使用micro启动微服务
微服务独立编译运行功能并不完整,只有单个服务再跑。而且没有负载均衡和服务发现。因此需要使用micro server
命令启动基础环境。记得确认服务发现的方式。
然后访问localhost:8082
,单击下面发现的web服务,即可通过网关负载均衡后访问到微服务,不需要关心微服务具体启动端口。
也可以直接带微服务名成最后一个段,作为路径访问即可。
如:go.micro.web.microweb
则可以直接写为localhost:8082/microweb/
如果需要更改go.micro.web,则需要在micro server启动时指定域名称。
完善生成的micro-web项目
因为web前端要向后端发送以protobuf编码的消息体,所以web项目要指定srv包中已经生成的protoc包依赖。
在microweb/handler/handler.go中,将import的最后一行microweb "path/to/service/proto/microweb"
修改为含有protoc包路径。如:microweb "microsrv/proto/microsrv"
同时在项目go.mod中新增两行:
1 |
|
然后回到handler.go中,将报错的microweb.NewMicrowebService
方法修改为microweb.NewMicrosrvService
,方法name参数修改为microsrv注册的name。这样web服务就能自动拿到srv服务的端口并发送消息了。
不要忘记在main函数中添加consul支持,并在启动时添加–registry=consul参数。
即可在consul中观察到两个服务已经注册了。
升级项目,让项目使用默认的mdns注册中心
删掉每个微服务main.go中import的consul库,去掉运行时的–registry参数即可。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!