服务网关

概述

API 是一个可插拔的 API 接口,由 Registry 驱动,可帮助构建强大的公共 API 网关.

API 库提供 api 网关路由功能。微服务体系结构将应用程序逻辑分离到单独的服务中. api 网关提供单个入口点,以将这些服务合并到统一 api 中。 API 使用在 Registry 元数据中定义的路由来生成路由规则并服务 http 请求.

启动 api 服务

# 提供 http 服务和 swagger 
vine api --handler=rpc --enable-openapi

创建网关

vine new gateway api

启动

go run cmd/api/main.go --api-address=127.0.0.1:8080

一个服务同时提供 gRPC 和 http 接口可以参考 api

测试

curl -X POST "http://127.0.0.1:8080/helloworld/v1/helloworld/Call" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"name\":\"hello\"}"
> {"msg":"reply: hello"}

同时支持 grpc 和 http

vine 支持在同一个端口下同时提供 gRPC 和 http 服务。

import (
	"net/http/pprof"

	"github.com/gin-gonic/gin"
	"github.com/prometheus/client_golang/prometheus/promhttp"
	"github.com/vine-io/vine"
	grpcServer "github.com/vine-io/vine/core/server/grpc"
	ahandler "github.com/vine-io/vine/lib/api/handler"
	"github.com/vine-io/vine/lib/api/handler/openapi"
	arpc "github.com/vine-io/vine/lib/api/handler/rpc"
	"github.com/vine-io/vine/lib/api/resolver"
	"github.com/vine-io/vine/lib/api/resolver/grpc"
	"github.com/vine-io/vine/lib/api/router"
	regRouter "github.com/vine-io/vine/lib/api/router/registry"
	log "github.com/vine-io/vine/lib/logger"
	"github.com/vine-io/vine/testdata/proto/rpc"
	"github.com/vine-io/vine/util/namespace"
)

type EchoRpc struct{}

func (e EchoRpc) Echo(ctx *vine.Context, request *rpc.EchoRequest, response *rpc.EchoResponse) error {
	response.Msg = request.Msg
	return nil
}

var _ rpc.EchoRpcHandler = (*EchoRpc)(nil)

func main() {

	app := gin.New()
	app.Use(gin.Recovery())

	app.GET("/metrics", gin.WrapH(promhttp.Handler()))

	DefaultPrefix := "/debug/pprof"
	prefixRouter := app.Group(DefaultPrefix)
	{
		prefixRouter.GET("/", gin.WrapF(pprof.Index))
		prefixRouter.GET("/cmdline", gin.WrapF(pprof.Cmdline))
		prefixRouter.GET("/profile", gin.WrapF(pprof.Profile))
		prefixRouter.POST("/symbol", gin.WrapF(pprof.Symbol))
		prefixRouter.GET("/symbol", gin.WrapF(pprof.Symbol))
		prefixRouter.GET("/trace", gin.WrapF(pprof.Trace))
		prefixRouter.GET("/allocs", gin.WrapH(pprof.Handler("allocs")))
		prefixRouter.GET("/block", gin.WrapH(pprof.Handler("block")))
		prefixRouter.GET("/goroutine", gin.WrapH(pprof.Handler("goroutine")))
		prefixRouter.GET("/heap", gin.WrapH(pprof.Handler("heap")))
		prefixRouter.GET("/mutex", gin.WrapH(pprof.Handler("mutex")))
		prefixRouter.GET("/threadcreate", gin.WrapH(pprof.Handler("threadcreate")))
	}

	s := vine.NewService(vine.Address(":8090"))

	s.Init()

	openapi.RegisterOpenAPI(s.Options().Client, app)

	Type, Namespace := "api", "go.vine"
	HandlerType := "rpc"

	// create the namespace resolver
	nsResolver := namespace.NewResolver(Type, Namespace)
	// resolver options
	rops := []resolver.Option{
		resolver.WithNamespace(nsResolver.ResolveWithType),
		resolver.WithHandler(HandlerType),
	}

	log.Infof("Registering API RPC Handler at %s", "/")
	rr := grpc.NewResolver(rops...)
	rt := regRouter.NewRouter(
		router.WithHandler(arpc.Handler),
		router.WithResolver(rr),
		router.WithRegistry(s.Options().Registry),
	)

	rp := arpc.NewHandler(
		ahandler.WithNamespace(Namespace),
		ahandler.WithRouter(rt),
		ahandler.WithClient(s.Client()),
	)
	app.Use(rp.Handle)

	s.Server().Init(grpcServer.HttpHandler(app))

	rpc.RegisterEchoRpcHandler(s.Server(), new(EchoRpc))
	openapi.RegisterOpenAPIHandler(s.Server())

	s.Run()
}

最后修改 February 26, 2023: docs (a830f1c)