Go-Micro功能特点
1. 提供了微服务实施的基础框架,包括Rpc、Web、Api,Srv 网关等各类工具。
2. Broker和异步消息。
3. Wrapper包装器来处理日志,限流等功能。
4. Go-Micro提供插件机制,可以安装多种功能插件,例如Rabbitmq插件。
5. 扩展性强,基于Wrapper模式与中间件实现的。
go-micro 安装
- 网址:https://github.com/micro/go-micro
- cmd 中输入一下三条命令,会自动下载相关的很多包
- go get github.com/micro/micro
- go get github.com/micro/go-micro
- go get github.com/micro/protoc-gen-micro
简单hello world程序
hello.proto
syntax = "proto3"; message InfoRequest { string username = 1; } message InfoResponse { string msg = 2; } service Hello { rpc Info(InfoRequest)returns (InfoResponse) {} }
server.go
//声明结构体,用来绑方法 type Hello struct{} func (g *Hello) Info(ctx context.Context, req *pb.InfoRequest, rep *pb.InfoResponse) error { rep.Msg = "hello" + req.Username return nil } func main() { //1.得到服务端实例 service := micro.NewService( //设置微服务的名,用来访问 //micro call hello Hello.Info{"username":"wekenw"} //windows: micro call hello Hello.Info{\"username\":\"wekenw\"} micro.Name("hello"), ) //2. 初始化 service.Init() //默认 //3.服务注册 err := pb.RegisterHelloHandler(service.Server(), new(Hello)) if err != nil { fmt.Println(err) } //4.启动服务 if err := service.Run(); err != nil { log.Fatal(err) } }
访问
micro call hello Hello.Info{"username":"wekenw"}
- windows 下
micro call hello Hello.Info{\"username\":\"wekenw\"}
生成.go文件
- proto目录下,命令行,输入命令生成接口文件
protoc -I . --micro_out=. --go_out=. ./hello.proto
http 模式
api.proto
syntax = "proto3"; message CallRequest { string name = 1; } message CallResponse { string message = 2; } service Example { rpc Call(CallRequest)returns(CallResponse); } message EmptyRequest { } message EmptyResponse { } service Foo { rpc Bar(EmptyRequest)returns(EmptyResponse) {} }
server.go
package main import ( "context" "fmt" "github.com/micro/go-micro" "github.com/micro/go-micro/errors" pb "goMicro/http/proto" "log" ) type Example struct { } type Foo struct { } func (e *Example) Call(ctx context.Context, req *pb.CallRequest, rsp *pb.CallResponse) error { log.Print("收到Example.Call请求") if len(req.Name) == 0 { return errors.BadRequest("go.micro.api.example", "no name") } rsp.Message = "Example.Call 接收到了你的请求" + req.Name return nil } func (f *Foo) Bar(ctx context.Context, req *pb.EmptyRequest, rsp *pb.EmptyResponse) error { log.Print("Foo.Bar") return nil } func main() { service := micro.NewService(micro.Name("go.micro.api.example")) service.Init() err := pb.RegisterExampleHandler(service.Server(), new(Example)) if err != nil { fmt.Println(err) } err = pb.RegisterFooHandler(service.Server(), new(Foo)) if err != nil { fmt.Println(err) } if err := service.Run(); err != nil { log.Fatal(err) } }
访问
- 第一步:启动api服务
micro api --handler=rpc
- 第二步:运行服务端代码