# go get
$ go get github.com/micro/micro/v2
# docker install
$ docker pull microhq/micro
Go Micro是Go开发微服务的RPC框架 (用2.x好了)
$ go get github.com/micro/go-micro/v2
如果使用代码生成,您还需要使用protoc-gen-go
$ go get github.com/micro/protobuf/{
proto,protoc-gen-go}
mkdir tmp
cd tmp
git clone https://github.com/google/protobuf
cd protobuf
./autogen.sh
./configure
make
make check
sudo make install
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
go get -u github.com/micro/protobuf/protoc-gen-go
# 新建一个服务
$ micro new service-name
NAME:
micro new - Create a new micro service
USAGE:
micro new [command options] [arguments...]
OPTIONS:
--namespace "go.micro" Namespace for the service e.g com.example
--type "srv" Type of service e.g api, srv, web
--fqdn FQDN of service e.g com.example.srv.service (defaults to namespace.type.alias)
--alias Alias is the short name used as part of combined name if specified
# 在本地运行该服务并确保其正常工作.
# 启动服务器
micro server
# 设置为本地环境
micro env set local
# 启动服务
micro run service-name
# 检查状态
micro status
# 检查是否已注册
micro services
# 检查日志
micro logs service-name
micro kill service-name
# 将代码上传到 Github 才能完成部署
# 初始化 git
cd service-name && git init && git add . && git commit -m "My helloworld service"
# 在 github 创建一个新的仓库并推送上去
# assuming you created it, add the remote origin
git remote add origin https://github.com/$user/service-name.git
# 推送
git push origin master
# 设置环境为平台模式
micro env set platform
# 确保已经登陆到平台
micro login
# 现在可以运行了
micro run github.com/$user/service-name
检查服务在运行并调用该服务。另外因为是从源码构建的,可能需要几分钟才能启动 (后续我们会优化这个情况)
# 检查服务状态
micro status
# 检查服务注册情况
micro services
# 调用指定的服务
micro helloworld --name=Alice
注意调用服务的符号. Micro 支持动态的 CLI 命令,这意味着你的命名空间下的任何东西都将成为一个子命令.
micro [service] [endpoint] [args]
在终结点被提交的地方, 我们假设它是服务名称 + “呼叫” 方法, 例如 helloworld 成为 Helloworld. call 。如果这是一个问候方法,我们将假设 Helloworld. 问候与 c 在 c.micro helloworld greet
我们假设有一个服务名称 + “Call” 的方法是一个终结点。例如 helloworld 会是 Helloworld.Call. 如果是 Greet 方法我们会假设 Helloworld.Greet 对应的命令为 micro helloworld greet.
参数可以作为标志传递 --name 表示的就是 Name 字段参数.
如果你想要一个使用纯 json 和原始方法的更简单方式
micro call helloworld Helloworld.Call '{"name": "Alice"}'
使用micro new hello创建了一个hello的微服务,并得到一个这样的目录结构。
.
├── main.go
├── generate.go
├── plugin.go
├── handler
│ └── hello.go
├── subscriber
│ └── hello.go
├── proto
│ └── hello
│ └── hello.proto
├── Dockerfile
├── Makefile
├── README.md
├── .gitignore
└── go.mod
进入 hello 目录,并执行:
make proto
执行 main.go 函数
go run main.go
编写服务调用
package main
import (
"context"
"github.com/micro/go-micro/v2"
"github.com/micro/go-micro/v2/client"
pb "hello/proto/hello"
"log"
)
func main() {
// 这里以HelloService默认提供的Call接口调用为例示范服务的调用
// 可以看到他的调用就像调用本地方法一样,go-micro为我们隐藏了背后的服务注册、发现、负载均衡以及网络操作
testCallFunc()
// 这里示范消息的发送
testSendMessage()
}
func testCallFunc(){
// 获取hello服务
// 这里第一个参数"go.micro.service.hello"必须与hello-service注册信息一致
// 一般由micro生成的项目默认服务名为:{namespace 默认[go.micro]}.{type 默认[service]}.{项目名}组成
// 如果要修改默认值,在生成项目时可以这样: micro --namespace=XXX --type=YYYY ZZZZ
// 当然也可以直接修改main.go中micro.Name("go.micro.service.hello")的内容
helloService := pb.NewHelloService("go.micro.service.hello", client.DefaultClient)
// 默认生成的hello服务中自带三个接口: Call() Stream() PingPong(),分别对应参数调用、流传输和心跳
resp, err := helloService.Call(context.Background(), &pb.Request{
Name: "World",
})
if err != nil {
log.Panic("call func", err)
}
log.Println("call func success!", resp.Msg)
}
func testSendMessage(){
// 消息主题,定义规则与服务一致
// 同样,也可以修改main.go的micro.RegisterSubscriber("go.micro.service.hello", service.Server(), new(subscriber.Hello))
const topic = "go.micro.service.hello"
// 获取消息发送接口,这里我一直使用的时micro.NewPublisher()
// 但在写文时发现NewPublisher()已经被废止,改为NewEvent(),二者参数和返回值一致
event := micro.NewEvent(topic, client.DefaultClient)
if err := event.Publish(context.Background(), &pb.Message{
Say: "hello server!",
}); err != nil {
log.Panic("send msg", err)
}
log.Println("send msg success!")
}