grpc提供http訪問方式
0x00
最近系統在從c++
遷移到go
,之前使用brpc
,也需要轉移到grpc
,但是grpc
提供的介面服務原生無法被http
訪問到,這對我們除錯來說也很麻煩,所以需要讓grpc
跟brpc
一樣,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
的埠為8989
,endpoint
指向了grpc
服務的埠7777
。
postman訪問
訪問成功
缺點
- 需要開2個埠
- 寫多餘的程式碼
理想情況下應該有個外掛自己把http
請求轉換成proto
的方式,猶如brpc
一樣
解決方法
後來發現https的方式是可以解決上面的問題,grpc和https埠在一起,也不用起兩個服務。
20190621更新
同事用https://github.com/soheilhy/cmux把多個協議的服務都繫結到一起了
相關文章
- go語言gRPC系列(三) - 使用grpc-gateway同時提供HTTP和gRPC服務GoRPCGatewayHTTP
- HTTP之訪問控制「CORS」HTTPCORS
- web方式訪問sshWeb
- GRPC與HTTP/3.0RPCHTTP
- http 升級為 https 訪問HTTP
- 訪問外部裝置方式
- 讓 gRPC 提供 REST 服務RPCREST
- 使用 grpcurl 通過命令列訪問 gRPC 服務RPC命令列
- 《Linux-SVN實現http訪問》LinuxHTTP
- Docker部署mysql並提供客戶端訪問DockerMySql客戶端
- OpenJDK JDK 20 早期訪問版本提供下載JDK
- kubernetes使用http rest api訪問叢集之使用postman工具訪問 apiserverHTTPRESTAPIPostmanServer
- kubernetes之使用http rest api訪問叢集HTTPRESTAPI
- gRPC- HTTP閘道器 IRPCHTTP
- jmeter 使用 ssh 方式訪問資料庫JMeter資料庫
- mariadb配置允許遠端訪問方式
- 如何使用海外HTTP代理訪問外網?如何設定海外HTTP代理?HTTP
- Holer實現外網訪問本地Apache HTTP ServerApacheHTTPServer
- 使用CloseableHttpClient 訪問 http 和https 的get請求HTTPclient
- 資料庫訪問幾種方式對比資料庫
- 使用swoole提供http服務HTTP
- 新版Chrome http訪問無法開啟攝像頭ChromeHTTP
- elasticsearch,http://ip:9200訪問不到的解決辦法ElasticsearchHTTP
- 訪問 laradock 伺服器內部 http 伺服器伺服器HTTP
- 寶塔安裝證書後http訪問錯誤HTTP
- kubernetes使用traefik的https方式訪問web應用HTTPWeb
- Struts2教程之三Action訪問方式
- NAS儲存外網遠端訪問的方式
- 阿里雲Serverless Kubernetes通過Ingress提供7層服務訪問阿里Server
- 三、Jmeter--HTTP請求預設值(HTTP Request Defaults)和訪問地址引數化JMeterHTTP
- 使用Java程式通過http post訪問ABAP Netweaver伺服器JavaHTTP伺服器
- 訪問 SAP 電商雲 Storefront 時遇到的 HTTP 403 錯誤HTTP
- GRpc新增客戶端的五種方式RPC客戶端
- akka-grpc - 基於akka-http和akka-streams的scala gRPC開發工具RPCHTTP
- 有模有樣解決Flutter裡Webview無法訪問HTTP頁面的問題FlutterWebViewHTTP
- Frp內網穿透搭建,家庭主機對外提供介面,支援ssh訪問FRP內網穿透
- GRPC使用問題修復RPC
- Golang GRPC 環境 問題GolangRPC