golang gRPC 和 HTTP 共用端口

前言

接口需要提供给其他业务组访问,但是 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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值