文章目录
一、前言
以命令行的方式创建一个微服务(使用默认的mdns服务发现),然后建立客户端调用微服务
二、环境准备
- 最基本的,go开发环境配置完成,gopath已设置好
- go-micro环境已安装完成
环境的安装可以参考下面两篇文章,虽然有点问题
https://www.kancloud.cn/linimbus/go-micro/529024
https://micro.mu/blog/2016/03/20/micro.html - micro工具安装完成
- proto工具可以暂时不装,但之后还是需要安装的
三、正式开始
3.1 创建微服务前一些服务的启动
3.1.1 启动微服务
终端输入
micro
这里需要提一下,micro如果不带参数,默认的服务发现使用的是mdns
3.1.2. 查看当前的服务
这一步是确认服务发现正常,而且留意一下,这时候服务列表里没有helloworld
micro list services
3.2 创建helloworld微服务
3.2.1命令行预创建helloworld微服务
huanglin@huanglindeMacBook-Pro src % micro new --type "srv" micro/rpc/helloworld
Creating service go.micro.srv.helloworld in /Users/huanglin/go/src/micro/rpc/helloworld
.
├── main.go
├── generate.go
├── plugin.go
├── handler
│ └── helloworld.go
├── subscriber
│ └── helloworld.go
├── proto/helloworld
│ └── helloworld.proto
├── Dockerfile
├── Makefile
└── README.md
download protobuf for micro:
brew install protobuf
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u github.com/micro/protoc-gen-micro
compile the proto file helloworld.proto:
cd /Users/huanglin/go/src/micro/rpc/helloworld
protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/helloworld/helloworld.proto
这个命令的意思是,在$GOPATH/src下的 micro/src文件夹下创建一个helloworld的微服务,输入之后会返回一堆内容,“翻译一下”,就是告诉我们,想启动一个微服务,还需要做下面几件事情
- 安装proto
如果不清楚怎么安装,它给了提示(这是macos的提示,linux和windws的不一样,总之,按提示安装就行)
- 用安装好的proto工具编译helloworld.proto文件
3.2.2 安装proto
参考 3.2.1
3.2.3 proto编译文件
参考3.2.1
3.2.4 运行
选择main.go
点开确认下包是否缺少,红的代表是缺失的
这时候需要用go mod,添加依赖,这部分属于go mod 的范畴,解决报红的问题
解决之后,直接go run main.go启动
然后使用之前3.1.2的命令,micro list services,确认微服务是否能被发现,如图,已经有了一个helloworld的微服务
到这里一个helloworld微服务已经启动,但是服务总是需要客户端调用的
不然没什么意义
3.3 客户端调用helloworld微服务
时间关系,直接贴代码
package main
import (
"context"
"fmt"
"github.com/micro/go-micro"
hello "micro/rpc/helloworld/proto/helloworld"
)
func main() {
// create a new service
service := micro.NewService()
// parse command line flags
service.Init()
// Use the generated client stub
cl:= hello.NewHelloworldService("go.micro.srv.helloworld",service.Client())
// Make request
rsp, err := cl.Call(context.Background(), &hello.Request{
Name: "John",
})
if err != nil {
fmt.Println(err)
return
}
fmt.Println(rsp.Msg)
}
执行的结果