Golang Gin框架搭配Grpc框架使用(監聽同一埠)
阿新 • • 發佈:2022-05-31
Golang Gin框架搭配Grpc框架使用(監聽同一埠)
方式一、該方式僅限給Gin配置了SSL證書、
http標準庫會為配置了證書的http服務自動選用http/2協議,grpc建立在http/2協議上,所以沒有配置SSL證書時請勿使用該方式
package main // 入口 func main() { // 初始化grpc服務 grpcServer := grpc.NewServer() /***** 註冊你的grpc服務 *****/ // 初始化一個空Gin路由 router := gin.New() // 全域性攔截 router.Use(func(ctx *gin.Context) { // 判斷協議是否為http/2 // 判斷是否是grpc if ctx.Request.ProtoMajor == 2 && strings.HasPrefix(ctx.GetHeader("Content-Type"), "application/grpc") { // 按grpc方式來請求 ctx.Status(http.StatusOK) // 我本地測試這裡不加狀態碼,客戶端GRPC收到的是404狀態碼 grpcServer.ServeHTTP(ctx.Writer, ctx.Request) // 不要再往下請求了,防止繼續鏈式呼叫攔截器 ctx.Abort() return } // 當作普通api ctx.Next() }) /***** 新增你的api路由吧 *****/ // 啟動 router.RunTLS( "0.0.0.0:8080", "你的SSL證書路徑", "你的SSL私鑰路徑", ) }
方式二、當你不需要使用SSL證書或SSL證書配置在Nginx等服務上時,請使用該方式
package main // 入口 func main() { // 初始化grpc服務 grpcServer := grpc.NewServer() /***** 註冊你的grpc服務 *****/ // 初始化一個空Gin路由 router := gin.New() // 全域性攔截 router.Use(func(ctx *gin.Context) { // 判斷協議是否為http/2 // 判斷是否是grpc if ctx.Request.ProtoMajor == 2 && strings.HasPrefix(ctx.GetHeader("Content-Type"), "application/grpc") { // 按grpc方式來請求 grpcServer.ServeHTTP(ctx.Writer, ctx.Request) // 不要再往下請求了,防止繼續鏈式呼叫攔截器 ctx.Abort() return } // 當作普通api ctx.Next() }) /***** 新增你的api路由吧 *****/ // 為http/2配置引數 h2Handle := h2c.NewHandler(router, &http2.Server{}) // 禁用TLS加密協議 // 配置http服務 server := &http.Server{ Addr: ":8080", Handler: h2Handle, } // 啟動http服務 server.ListenAndServe() }
參考連結: https://blog.csdn.net/weixin_45985984/article/details/124071909