gRPC golang gRPC 和 HTTP 共用端口

xie1xiao1jun · 2021年02月24日 · 200 次阅读

前言

接口需要提供给其他业务组访问,但是 RPC 协议不同无法内调,对方问能否走 HTTP 接口 有时候,我们服务都需要同时支持 grpc 跟 http(restful) 协议,但是我们又不想多端口开放

原理

原理主要是通过共用listener 模式 通过Accept()入口来区分协议内容

golang 实现

package main

import (
    "github.com/soheilhy/cmux"
)

func Run(){
    // 起服务
    // Create the main listener.
    l, err := net.Listen("tcp", ":23456")
    if err != nil {
        log.Fatal(err)
    }

    // Create a cmux.
    m := cmux.New(l)

    // First grpc, then HTTP, and otherwise Go RPC/TCP.
    grpcL := m.MatchWithWriters(cmux.HTTP2MatchHeaderFieldSendSettings("content-type", "application/grpc"))
    go grpcS.Serve(grpcL)// Use the muxed listeners for your servers.

    httpL := m.Match(cmux.HTTP1Fast())
    httpS := &http.Server{
        Handler: &helloHTTP1Handler{},
    }
    go httpS.Serve(httpL)

    // Start serving!
    m.Serve()   
}

gin+grpc 实现

package main

import (
    "github.com/soheilhy/cmux"
)

func Run(){
    // 起服务
    l, err := net.Listen("tcp", ":23456")

    m := cmux.New(l)

    // grpc
    grpcL := m.MatchWithWriters(cmux.HTTP2MatchHeaderFieldSendSettings("content-type", "application/grpc"))
    grpcS := grpc.NewServer()
    grpchello.RegisterGreeterServer(grpcS, &server{})
    go grpcS.Serve(grpcL)

    // http
    router := gin.Default()
    go func (){
        httpL := m.Match(cmux.HTTP1Fast())
        router.RunListener(httpL)
    }()


    // Start serving!
    m.Serve()   
}

goplugins

更多:

xxjwxc

goplugins

gmsec

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册