go-micro的简介:
可插入RPC分布式系统开发的框架,支持json,proto -rpc的编码方式,可使用consul或者其它方式的服务发现,默认是consul提供随机散列的负载均衡。
1.服务发现 2.编码解码 3.服务端,客户端 4.发布订阅消息
以下是详情说明下:
1.安装 micro install
$ go get -u github.com/micro/micro
提示缺少golang/net ,text,tools,crypto, hashicorp/consul几个包,一般情况下是需要去github上把这些缺少的包都下全,micro才被安装成功
go get : 其实是go命令的下载与安装两步合并,
-u : 只更新已有的代码包
-v: 显示更新过程
2.首次如何使用micro,第一次可以利用micro命令自动生成一个模板srv工程(业务服务模块),也可以自己新建
$ micro new example
(默认为生成名为example的srv服务)
—type “api”
—type “web”
—type “srv”
到此已经生成一个工程,工程下面包含一个proto文件夹,下面做详情说明
3.protoc 说明:
micro 依赖google的protobuf,这里要熟悉protoc的命令使用
$ protoc --proto_path=. --micro_out=. --go_out=. ./greeter/greeter.proto
--proto_path等同于-I选项:
-IPATH, --proto_path=PATH
Specify the directory in which to search for imports. May be specified multiple times; directories will be searched in order. If not given, the current working directory is used.
--go_out : 生成.go文件后要存放的路径(这里应该是和.proto文件放在同一路径)
./greeter/greeter.proto : 这是我的.proto文件所在位置
报错:
--micro_out: protoc-gen-micro: 系统找不到指定的文件
提示下面protoc相关依赖包
$ go get github.com/micro/protoc-gen-micro
--go_out: protoc-gen-go: 系统找不到指定的文件。
$ go get -u github.com/golang/protobuf/protoc-gen-go
下载完成之后,再次运行以上命令
$ protoc --proto_path=. --micro_out=. --go_out=. ./greeter/greeter.proto
protoc-gen-micro: program not found or is not executable
--micro_out: protoc-gen-micro: Plugin failed with status code 1.
需要通过如下方式解决
$ protoc \
--plugin=protoc-gen-go=${GOPATH}/bin/protoc-gen-go \
--plugin=protoc-gen-micro=${GOPATH}/bin/protoc-gen-micro \
--proto_path=${GOPATH}/src:. \
--micro_out=. --go_out=. \
proto/*.proto
运行make后再对应目录下生成这两个文件
生成example.micro.go
生成example.pb.go
protobuf使用介绍得差不多,后面要把服务跑起来
运行micro
直接go run main.go即可,把服务端的代码跑起来
package main
import (
"context"
"fmt"
micro "github.com/micro/go-micro"
proto "../greeter"
)
type Greeter struct{}
func (g *Greeter) Call(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error {
fmt.Println("11")
rsp.Greeting = "Hello " + req.Name
return nil
}
func main() {
// Create a new service. Optionally include some options here.
service := micro.NewService(
micro.Name("greeter"),
)
// Init will parse the command line flags.
service.Init()
// Register handler
proto.RegisterGreeterHandler(service.Server(), new(Greeter))
// Run the server
if err := service.Run(); err != nil {
fmt.Println(err)
}
}
传参方式 : 1.可以在创建时传入 (构造的方式) 2.可以用命令行方式 (micro.Flags() ) 与go原生接收命令行参数相同
如何调用服务端代码
方式一客户端调用(再跑一个相同的服务,main.go文件改成以下方式)
通过protobuf方式进行调用,跨语言
package main
import (
"context"
"fmt"
proto "../greeter"
"github.com/micro/go-micro"
)
func main() {
// Create a new service. Optionally include some options here.
service := micro.NewService(micro.Name("greeter.client"))
service.Init()
// Create new greeter client
greeter := proto.NewGreeterService("greeter", service.Client())
// Call the greeter,通过protobuf生成的函数进行调用其它微服务
rsp, err := greeter.Hello(context.TODO(), &proto.HelloRequest{Name: "John"})
if err != nil {
fmt.Println(err)
}
// Print response
fmt.Println(rsp.Greeting)
}
方式二
以上启动的srv服务都是不能被http直接调用,需要再启动micro api
$ micro api
通过http调用 http://localhost:8080/rpc
{ "service": "go.exb", "method": "Example.Call", "request": {"name": "John”} }
也可以通过micro call命令调用服务
$ ./micro call go.exa Example.Call '{"name": "John”}'
go.exb : namespace
Example.Call : 服务端代码实现的接口
如果需要使用consul的话,可以用以下方式起动集群或者单机调式
consul 集群启动
$ ./consul agent -server -bootstrap-expect 2 -data-dir=data \
-node=n1 -bind=192.168.0.240 -client=0.0.0.0 &
$ ./consul join 192.168.0.112
$ ./consul join 192.168.0.122
consul 单机启动
$ ./consul agent -dev -client 0.0.0.0 -ui
agent 运行一个consul agent
join 将agent加入到consul集群
连接远程consul
--registry_address=127.0.0.1:8500 为远程注册中心地址与端口
$ go run .\service.go --registry_address=127.0.0.1:8500
$ go run client.go --registry_address=127.0.0.1:8500
最后奉上最重要的就是文档 micro官方文档 , golang相关micro doc
总结的正确姿势:
a.安装micro:具体步骤下面都有了,go get 下载报错,请自行github下载到gopath下面即可
b.可以使用micro new <工程名> 生成模板,工程目录下Makefile 和dockerfile都已经配置好了,如果使用模板请忽略下面手写的代码
c.使用make build && make run 执行makefile文件里面命令
d.make命令没有报错的话,这时工程就可以运行了,可以用go run main.go 把工程跑起来
e.使用用micro list serivces 查看是否运行成功
f.使用 micro call 调用微服务