方式一、该方式仅限给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方式来请求
			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()
}