12.使用rpc构建一个简易商品服务、注册到consul

编写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()
}




原文地址:https://www.cnblogs.com/hualou/p/12104305.html