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