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把多個協議的服務都繫結到一起了
相關文章
- http://www.jdon.com:81/不再提供訪問HTTP
- go語言gRPC系列(三) - 使用grpc-gateway同時提供HTTP和gRPC服務GoRPCGatewayHTTP
- Nginx提供perl CGI訪問Nginx
- HTTP之訪問控制「CORS」HTTPCORS
- Oracle 表訪問方式Oracle
- Oracle 索引訪問方式Oracle索引
- oracle表訪問方式Oracle
- 域名訪問和ip訪問引起的http 403問題HTTP
- GRPC與HTTP/3.0RPCHTTP
- Oracle訪問表的方式Oracle
- 讓 gRPC 提供 REST 服務RPCREST
- http 升級為 https 訪問HTTP
- 再談通過http訪問SSASHTTP
- Oracle使用utl_http訪問webserviceOracleHTTPWeb
- Docker部署mysql並提供客戶端訪問DockerMySql客戶端
- OpenJDK JDK 20 早期訪問版本提供下載JDK
- ruby 訪問新浪微博API post方式和get方式API
- 使用 grpcurl 通過命令列訪問 gRPC 服務RPC命令列
- 《Linux-SVN實現http訪問》LinuxHTTP
- oracle 索引訪問的幾種方式Oracle索引
- 常見SQL訪問索引的方式SQL索引
- 基於HttpClient實現Http訪問工具類HTTPclient
- Android使用http協議訪問網路AndroidHTTP協議
- gRPC- HTTP閘道器 IRPCHTTP
- jmeter 使用 ssh 方式訪問資料庫JMeter資料庫
- JVM中物件訪問定位兩種方式JVM物件
- kubernetes使用http rest api訪問叢集之使用postman工具訪問 apiserverHTTPRESTAPIPostmanServer
- Hessian HTTP POST訪問時,Nginx返回411問題HTTPNginx
- 如何使用海外HTTP代理訪問外網?如何設定海外HTTP代理?HTTP
- 使用swoole提供http服務HTTP
- Holer實現外網訪問本地Apache HTTP ServerApacheHTTPServer
- 【執行計劃】資料訪問方式,連線方式及方法
- mariadb配置允許遠端訪問方式
- smarty中三種變數的訪問方式變數
- 兩種訪問介面的方式(get和post)
- Nginx訪問控制_IP訪問控制(http_access_module)原理、侷限性、解決方法講解NginxHTTP
- kubernetes之使用http rest api訪問叢集HTTPRESTAPI
- 新版Chrome http訪問無法開啟攝像頭ChromeHTTP