使用gRPC-Gateway快速构建微服务-双向认证下rpc-gateway使用(同时提供rpc和http接口)


https://github.com/grpc-ecosystem/grpc-gateway

 

 

 在grpc之上加一层代理并转发,转变成protobuf格式来访问grpc服务

 

安装

go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger
go get -u github.com/golang/protobuf/protoc-gen-go

 

Prod.proto

syntax="proto3";
package services;
import "google/api/annotations.proto";

message  ProdRequest {
    int32 prod_id =1;   //传入的商品ID
}
message ProdResponse{
    int32 prod_stock=1;//商品库存
}

service ProdService {
    rpc GetProdStock (ProdRequest) returns (ProdResponse){
        option (google.api.http) = {
            get: "/v1/prod/{prod_id}"
        };

    }
}

 

生成两个文件

首先cd 进入pbfiles

这会生成Prod.pb.go
protoc --go_out=plugins=grpc:../services  Prod.proto


这会生成Prod.pb.gw.go
protoc  --grpc-gateway_out=logtostderr=true:../services Prod.proto

 

httpserver.go

package main

import (
    "context"
    "github.com/grpc-ecosystem/grpc-gateway/runtime"
    "google.golang.org/grpc"
    "grpcpro/services"
    "log"
    "net/http"
)

func main()  {
    gwmux:=runtime.NewServeMux()
    opt := []grpc.DialOption{grpc.WithInsecure()}
    err:=services.RegisterProdServiceHandlerFromEndpoint(context.Background(),
        gwmux,"localhost:8081",opt)
    if err != nil {
        log.Fatal(err)
    }
    httpServer:=&http.Server{
        Addr:":8080",
        Handler:gwmux,
    }
    httpServer.ListenAndServe()

}

 

 

server.go

package main

import (
    "google.golang.org/grpc"
    "grpcpro/services"
    "net"
)

func main()  {
    rpcServer:=grpc.NewServer()
    services.RegisterProdServiceServer(rpcServer,new(services.ProdService))

    lis,_:=net.Listen("tcp",":8081")

    rpcServer.Serve(lis)


}

 

 源码地址:

https://github.com/sunlongv520/grpc-learn

https://github.com/sunlongv520/grpc-doc


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM