feast-dev / feast-dev/feast-java-old

[Discuss] Use gRPC gateway to generate REST endpoints

Ouverte
#20 8 commentaires 0 réactions 1 personne assignée Assignée à @woop Voir sur GitHub
Langage dominant
Java
Étoiles
12
Forks
26
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

## Introduction

Right now, feast-java uses `RestController` ([example code](https://github.com/feast-dev/feast-java/blob/8541f36ecf28569db7ece35e936b5e9d83db3cde/serving/src/main/java/feast/serving/controller/ServingServiceRestController.java)) to implement REST endpoints for both feast-core and feast-serving. However, this approach will increase maintenance cost. Therefore, generating REST endpoint from proto definitions is a cleaner way.

## Proposed Change

Use [grpc-gateway](https://github.com/grpc-ecosystem/grpc-gateway) to generate the REST endpoint.

### Steps
#### 1. Add gateway server to translate REST call into gRPC call to another process inside the container
The example gateway server will look like:

```
package main

import (
"context"
"flag"
"fmt"
"net/http"

"github.com/golang/glog"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"google.golang.org/grpc"

coreGateWay "pkg/gateway/generated/feast/core"
servingGateWay "pkg/gateway/generated/feast/serving"
)

// gRPC serving endpoint
var servingServerEndpoint = flag.String("serving-server-endpoint", "localhost:6566", "gRPC server endpoint")

func run() error {
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer cancel()

mux := runtime.NewServeMux()
opts := []grpc.DialOption{grpc.WithInsecure()}

// Register ServingServing endpoint
err = servingGateWay.RegisterServingServiceHandlerFromEndpoint(ctx, mux, *servingServerEndpoint, opts)
if err != nil {
return err
}

// Start HTTP server (and proxy calls to gRPC server endpoint)
return http.ListenAndServe(":8000", mux)
}

func main() {
flag.Parse()
defer glog.Flush()

if err := run(); err != nil {
fmt.Println(err)
glog.Fatal(err)
}
}
```

#### 2. Use [supervisord](http://supervisord.org/) to start two processes inside a container

We can provide instructions to use different entry points. Here's an example config:

```
[supervisord]
nodaemon=true

[program:serving]
directory=/
user=root
command=java -jar /opt/feast/feast-serving.jar --spring.config.location=classpath:/application.yml,file:/etc/feast/%(ENV_FEAST_SERVING_YML_NAME)s

[program:gateway]
directory=/
user=root
command=/opt/feast/gateway_server
--serving-server-endpoint=%(ENV_FEAST_SERVING_URL)s
numprocs=1
```

#### 3. Remove existing REST controllers' code

As titled.

Guide de contribution

Ouvrir le guide de contribution

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.