Micro gRPC是micro的gRPC框架插件,简化开发基于gRPC的服务。

概览

micro提供有基于Go的gRPC插件go-micro,该插件可以在内部集成gPRC,并与之无缝交互,让开发gRPC更简单,并支持grpc-gateway

micro有面向gRPC的客户端服务端插件,go-grpc库调用客户端/服务端插件生成micro需要的gRPC代码,而客户端/服务端插件都是从github.com/grpc/grpc-go扩展而来,也即是说,我们不需要去知道go-micro是如何编解码或传输节点就可以使用原生的gRPC。

Go gRPC - 概览 - 图1

示例

我们提供了一个简单的节点Greeter问候程序来演示对gRPC的支持:examples/greeter

安装protobuf

我们需要使用Protobuf来生成代码,请根据您的环境参考protobuf安装。

安装好protobuf后,还需要安装

服务发现

服务发现负责把服务名到服务所在地址。

Consul

micro默认使用Consul 作为服务发现的注册中心。您可以查考install guide安装。

发现机制是可插拔的,我们目前支持使用etcd、kubernetes、zookeeper等等,具体详见micro/go-plugins

mDNS

组播,Multicast DNS已经内置在micro中,mDNS不需要依赖任何注册中心,可以在一般情况下的局域网中使用。

在micro服务的任意启动指令中传入—registry=mdns或者声明环境变量MICRO_REGISTRY=mdns也可,比如:

  1. MICRO_REGISTRY=mdns go run main.go

编写服务

Go-grpc服务与go-micro服务一样,也就是说你可以直接将服务声明方式micro.NewService换成grpc.NewService,而不需要改动其它代码。

  1. package main
  2. import (
  3. "context"
  4. "time"
  5. "github.com/micro/go-grpc"
  6. "github.com/micro/go-micro"
  7. hello "github.com/micro/go-grpc/examples/greeter/server/proto/hello"
  8. )
  9. type Say struct{}
  10. func (s *Say) Hello(ctx context.Context, req *hello.Request, rsp *hello.Response) error {
  11. rsp.Msg = "Hello " + req.Name
  12. return nil
  13. }
  14. func main() {
  15. service := grpc.NewService(
  16. micro.Name("greeter"),
  17. )
  18. service.Init()
  19. hello.RegisterSayHandler(service.Server(), new(Say))
  20. if err := service.Run(); err != nil {
  21. log.Fatal(err)
  22. }
  23. }

使用Micro

您可能需要使用micro的工具集编写grpc服务,micro支持使用工具集预构建或者简单把grpc的客户端插件导入项目中重新编译构建即可。

安装micro

  1. go get github.com/micro/go-grpc/cmd/micro

或者自行编译

  1. go get github.com/micro/micro

在main.go目录创建plugins.go文件,专门引入插件

  1. package main
  2. import _ "github.com/micro/go-plugins/client/grpc"
  3. import _ "github.com/micro/go-plugins/server/grpc"

重新编译二进制

  1. // 本地使用
  2. go build -i -o micro ./main.go ./plugins.go

使用插件

  1. micro --client=grpc --server=grpc

gRPC网关

Go-grpc与gRPC生态是无缝集成的,所以grpc-gateway使用没特别之处。

我们提供了简单的问候Greeter服务,可以参考examples/grpc/gateway