编写Models.proto
syntax = "proto3";
package Services;
message ProdModel {
// @inject_tag: json:"pid"
int32 ProdID = 1;
// @inject_tag: json:"pname"
string ProdName = 2;
}
编写ProdService.proto
syntax = "proto3";
package Services;
import "Models.proto";
message ProdsRequest {
int32 size = 1;
}
message ProdListResponse {
repeated ProdModel data = 1;
}
service ProdService{
rpc GetProdsList (ProdsRequest) returns (ProdListResponse);
}
然后会发现生成了4个文件
我们会发现每个proto对应的pb文件有两个,我们主要关注的是ProdService.pb.micro.go这个文件,这是go-micro帮我们生成的,它和我们在grpc的时候处理的方法有点不一样
它里面有这样一段代码,我们主要就是要实现这个接口
type ProdServiceHandler interface {
GetProdsList(context.Context, *ProdsRequest, *ProdListResponse) error
}
现在创建具体服务的实现,创建ProdService.go,编写实现ProdServiceHandler的接口的结构体即可
package ServiceImpl
import (
"context"
"go-micro-grpc/Services"
"strconv"
)
type ProdService struct {
}
//in 是request也就是proto里面定义的ProdsRequest,res是我们定义的ProdSrequest
func (*ProdService) GetProdsList(ctx context.Context, in *Services.ProdsRequest, res *Services.ProdListResponse) error {
ret := make([]*Services.ProdModel, 0)
var i int32
for i = 0; i < in.Size; i++ {
ret = append(ret, newProd(100+i, "prodname"+strconv.Itoa(100+int(i))))
}
res.Data = ret //我们并不需要返回respnse,只要修改一下response的值就,后面会自己返回,go-micro已经做了处理
return nil //根据实际情况处理有异常返回error无异常返回nil
}
func newProd(id int32, pname string) *Services.ProdModel {
return &Services.ProdModel{ProdID: id, ProdName: pname}
}
启动服务
package main
import (
"github.com/micro/go-micro"
"github.com/micro/go-micro/registry"
"github.com/micro/go-plugins/registry/consul"
"go-micro-grpc/ServiceImpl"
"go-micro-grpc/Services"
)
func main() {
consulReg := consul.NewRegistry(
registry.Addrs("localhost:8500"),
)
service := micro.NewService(
micro.Name("ProdService"),
micro.Address(":8011"), //当前rpc服务的地址
micro.Registry(consulReg),//把当前service的信息注册到consul中
)
//然后调用生成pb文件中的注册handler的方法注册service的服务和我们实现了ProdServiceHandler接口的结构体指针即可
Services.RegisterProdServiceHandler(service.Server(), new(ServiceImpl.ProdService))
service.Init()
service.Run()
}