grpc提供http訪問方式

Q博士發表於2018-05-30

0x00

最近系統在從c++遷移到go,之前使用brpc,也需要轉移到grpc,但是grpc提供的介面服務原生無法被http訪問到,這對我們除錯來說也很麻煩,所以需要讓grpcbrpc一樣,http也能訪問rpc介面

0x01

grpc-gateway專案:

該專案是在grpc外面加一層反向代理,由代理伺服器轉發json格式,轉變成protobuf格式來訪問grpc服務,官方解釋圖如下:

你的grpc服務按照正常的方式啟動就行了,然後根據proto檔案生成gateway專有的gw.pb.go檔案,然後我們重新啟動一個gateway服務,有自己獨立的埠,然後有一個入口,入口就是你grpc提供服務的ip和埠。

實驗

啟動grpc服務

這裡寫圖片描述

grpc提供服務的埠為7777

啟動代理服務

package main

import (
	"flag"
	"github.com/golang/glog"
	"github.com/grpc-ecosystem/grpc-gateway/runtime"
	"golang.org/x/net/context"
	"google.golang.org/grpc"
	"net/http"

	gw "data/proto"
)

var (
	echoEndPoint = flag.String("echo_endpoint", "localhost:7777", "endpoint of YourService")
)

func run() error {
	ctx := context.Background()
	ctx, cancel := context.WithCancel(ctx)
	defer cancel()

	mux := runtime.NewServeMux()
	opts := []grpc.DialOption{grpc.WithInsecure()}
	err := gw.RegisterGreeterHandlerFromEndpoint(ctx, mux, *echoEndPoint, opts)
	if err != nil {
		return err
	}

	return http.ListenAndServe(":8989", mux)

}

func main() {
	flag.Parse()
	defer glog.Flush()

	if err := run(); err != nil {
		glog.Fatal(err)
	}
}

gateway的埠為8989endpoint指向了grpc服務的埠7777

postman訪問

這裡寫圖片描述

訪問成功

缺點

  • 需要開2個埠
  • 寫多餘的程式碼

理想情況下應該有個外掛自己把http請求轉換成proto的方式,猶如brpc一樣

解決方法

後來發現https的方式是可以解決上面的問題,grpc和https埠在一起,也不用起兩個服務。

grpc https gateway

20190621更新

同事用https://github.com/soheilhy/cmux把多個協議的服務都繫結到一起了

相關文章