Skip to content

Commit

Permalink
[service] Init backend service project (#113)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeffwan authored Jan 14, 2022
1 parent 5d790a6 commit 6f87ca6
Show file tree
Hide file tree
Showing 12 changed files with 1,785 additions and 0 deletions.
94 changes: 94 additions & 0 deletions service/cmd/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package main

import (
"context"
"flag"

"math"
"net"
"net/http"

"github.com/grpc-ecosystem/grpc-gateway/runtime"

"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
"k8s.io/klog/v2"

"github.com/prometheus/client_golang/prometheus/promhttp"
api "github.com/ray-project/kuberay/proto/go_client"
"github.com/ray-project/kuberay/service/pkg/interceptor"
"github.com/ray-project/kuberay/service/pkg/manager"
"github.com/ray-project/kuberay/service/pkg/server"
)

var (
rpcPortFlag = flag.String("rpcPortFlag", ":8887", "RPC Port")
httpPortFlag = flag.String("httpPortFlag", ":8888", "Http Proxy Port")
configPath = flag.String("config", "", "Path to JSON file containing config")
collectMetricsFlag = flag.Bool("collectMetricsFlag", true, "Whether to collect Prometheus metrics in API server.")
)

func main() {
flag.Parse()

clientManager := manager.NewClientManager()
resourceManager := manager.NewResourceManager(&clientManager)

go startRpcServer(resourceManager)
startHttpProxy()

}

type RegisterHttpHandlerFromEndpoint func(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) error

func startRpcServer(resourceManager *manager.ResourceManager) {
klog.Info("Starting gRPC server")

listener, err := net.Listen("tcp", *rpcPortFlag)
if err != nil {
klog.Fatalf("Failed to start GPRC server: %v", err)
}

s := grpc.NewServer(grpc.UnaryInterceptor(interceptor.ApiServerInterceptor), grpc.MaxRecvMsgSize(math.MaxInt32))
api.RegisterClusterServiceServer(s, server.NewClusterServer(resourceManager, &server.ClusterServerOptions{CollectMetrics: *collectMetricsFlag}))
// TODO: add rest servers here

// Register reflection service on gRPC server.
reflection.Register(s)
if err := s.Serve(listener); err != nil {
klog.Fatalf("Failed to serve gRPC listener: %v", err)
}

klog.Info("gRPC server started")
}

func startHttpProxy() {
klog.Info("Starting Http Proxy")

ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer cancel()

// Create gRPC HTTP MUX and register services.
runtimeMux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{OrigName: true, EmitDefaults: true}))
registerHttpHandlerFromEndpoint(api.RegisterClusterServiceHandlerFromEndpoint, "ClusterService", ctx, runtimeMux)
// TODO: add rest servers here

// Create a top level mux to include both Http gRPC servers and other endpoints like metrics
topMux := http.NewServeMux()
// Seems /apis (matches /apis/v1alpha1/clusters) works fine
topMux.Handle("/", runtimeMux)
topMux.Handle("/metrics", promhttp.Handler())

http.ListenAndServe(*httpPortFlag, topMux)
klog.Info("Http Proxy started")
}

func registerHttpHandlerFromEndpoint(handler RegisterHttpHandlerFromEndpoint, serviceName string, ctx context.Context, mux *runtime.ServeMux) {
endpoint := "localhost" + *rpcPortFlag
opts := []grpc.DialOption{grpc.WithInsecure(), grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(math.MaxInt32))}

if err := handler(ctx, mux, endpoint, opts); err != nil {
klog.Fatalf("Failed to register %v handler: %v", serviceName, err)
}
}
69 changes: 69 additions & 0 deletions service/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
module github.com/ray-project/kuberay/service

go 1.17

require (
github.com/cenkalti/backoff v2.2.1+incompatible
github.com/go-openapi/runtime v0.19.31
github.com/golang/glog v1.0.0
github.com/golang/protobuf v1.5.2
github.com/grpc-ecosystem/grpc-gateway v1.16.0
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.11.0
github.com/ray-project/kuberay/proto v0.0.0
github.com/ray-project/kuberay/ray-operator v0.0.0
google.golang.org/grpc v1.40.0
k8s.io/apimachinery v0.19.14
k8s.io/client-go v0.19.14
k8s.io/klog/v2 v2.20.0
)

require (
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.1 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-logr/logr v1.0.0 // indirect
github.com/go-openapi/errors v0.19.6 // indirect
github.com/go-openapi/strfmt v0.19.5 // indirect
github.com/go-openapi/swag v0.19.9 // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/googleapis/gnostic v0.5.1 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0 // indirect
github.com/imdario/mergo v0.3.10 // indirect
github.com/json-iterator/go v1.1.11 // indirect
github.com/mailru/easyjson v0.7.1 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/mitchellh/mapstructure v1.3.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.26.0 // indirect
github.com/prometheus/procfs v0.6.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
go.mongodb.org/mongo-driver v1.3.4 // indirect
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f // indirect
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 // indirect
golang.org/x/text v0.3.5 // indirect
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
google.golang.org/appengine v1.6.6 // indirect
google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af // indirect
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.3.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect
k8s.io/api v0.19.14 // indirect
k8s.io/utils v0.0.0-20200912215256-4140de9c8800 // indirect
sigs.k8s.io/controller-runtime v0.7.2 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect
sigs.k8s.io/yaml v1.2.0 // indirect
)

replace (
github.com/ray-project/kuberay/proto => ../proto
github.com/ray-project/kuberay/ray-operator => ../ray-operator
)
Loading

0 comments on commit 6f87ca6

Please sign in to comment.