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。

示例

我们提供了一个简单的节点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也可,比如:

MICRO_REGISTRY=mdns go run main.go

编写服务

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

package main

import (
	"context"
	"time"

	"github.com/micro/go-grpc"
	"github.com/micro/go-micro"
	hello "github.com/micro/go-grpc/examples/greeter/server/proto/hello"
)

type Say struct{}

func (s *Say) Hello(ctx context.Context, req *hello.Request, rsp *hello.Response) error {
	rsp.Msg = "Hello " + req.Name
	return nil
}

func main() {
	service := grpc.NewService(
		micro.Name("greeter"),
	)

	service.Init()

	hello.RegisterSayHandler(service.Server(), new(Say))

	if err := service.Run(); err != nil {
		log.Fatal(err)
	}
}

使用Micro

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

安装micro

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

或者自行编译

go get github.com/micro/micro

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

package main

import _ "github.com/micro/go-plugins/client/grpc"
import _ "github.com/micro/go-plugins/server/grpc"

重新编译二进制

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

使用插件

micro --client=grpc --server=grpc

gRPC网关

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

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