• 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()
    }
    




  • 相关阅读:
    点聚-weboffice 6.0 (二)
    点聚-weboffice 6.0 (一)
    Hibernate连接池设置
    ajax工作原理(转)
    LigerUI java SSH小例子
    file标签样式修改
    好久不来了,回来园子看看
    resharper 8.2
    无聊的要死
    无聊
  • 原文地址:https://www.cnblogs.com/hualou/p/12104305.html
Copyright © 2020-2023  润新知