13.在gin中调用节课构建的rpc服务(获取商品列表)

RPC服务端代码

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接口的结构体指针即可
    service.Init()
    Services.RegisterProdServiceHandler(service.Server(), new(ServiceImpl.ProdService))
    service.Run()
}

Gin调用rpc代码

package main

import (
    "context"
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/micro/go-micro"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-micro/web"
    "github.com/micro/go-plugins/registry/consul"
    "go-micro/Services"
)

func main() {
    consulReg := consul.NewRegistry( //新建一个consul注册的地址,也就是我们consul服务启动的机器ip+端口
        registry.Addrs("localhost:8500"),
    )
    ginRouter := gin.Default()
    //其实下面这段代码的意义就是启动的时候把服务注册进去
    server := web.NewService( //go-micro很灵性的实现了注册和反注册,我们启动后直接ctrl+c退出这个server,它会自动帮我们实现反注册
        web.Name("httpprodservice"), //注册进consul服务中的service名字
        web.Address(":8001"),        //注册进consul服务中的端口,也是这里我们gin的server地址
        web.Handler(ginRouter),      //web.Handler()返回一个Option,我们直接把ginRouter穿进去,就可以和gin完美的结合
        web.Registry(consulReg),     //注册到哪个服务器上的consul中
    )

    //上面是webservice下面的是rpc service,在接收到客户端http请求时调用Rpc Service获取返回数据
    myService := micro.NewService(micro.Name("prodservice.client"))
    prodService := Services.NewProdService("prodservice", myService.Client())

    v1Group := ginRouter.Group("/v1")
    {
        v1Group.Handle("POST", "/prods", func(ctx *gin.Context) {
            var prodReq Services.ProdsRequest
            err := ctx.Bind(&prodReq)
            fmt.Println(prodReq)
            fmt.Println(prodReq)
            if err != nil {
                ctx.JSON(500, gin.H{"status": err.Error()})
            } else {
                prodRes, err := prodService.GetProdsList(context.TODO(), &prodReq)
                if err != nil{
                    fmt.Println(err)
                }
                ctx.JSON(200, gin.H{"data": prodRes.Data})
            }
        })
    }

    server.Init() //加了这句就可以使用命令行的形式去设置我们一些启动的配置
    server.Run()
}

处理返回值的参数名,使用inject-tag第三方工具让生成的pb文件中带tag,因为用的http服务Post请求,所以这里我们用form去定义一下解析的字段,这样就可以被Gin的ctx.bind()方法去解析

syntax = "proto3";
package Services;
import "Models.proto";
message ProdsRequest {
    // @inject_tag: json:"size" form:"size"
    int32 size = 1;
}

message ProdListResponse {
    repeated ProdModel data = 1;
}

service ProdService{
    rpc GetProdsList (ProdsRequest) returns (ProdListResponse);
}




猜你喜欢

转载自www.cnblogs.com/hualou/p/12130355.html
今日推荐