1. 程式人生 > 其它 >Golang Gin框架搭配Grpc框架使用(監聽同一埠)

Golang Gin框架搭配Grpc框架使用(監聽同一埠)

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