Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Envoy gRPC bridge filter example #78

Merged
merged 1 commit into from
Sep 19, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
2 changes: 2 additions & 0 deletions examples/grpc-bridge/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
bin/service
.idea
7 changes: 7 additions & 0 deletions examples/grpc-bridge/Dockerfile-grpc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FROM lyft/envoy:latest

RUN mkdir /var/log/envoy/
COPY ./bin/service /usr/local/bin/srv
COPY ./script/grpc_start /etc/grpc_start
CMD /etc/grpc_start

8 changes: 8 additions & 0 deletions examples/grpc-bridge/Dockerfile-python
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
FROM lyft/envoy:latest

RUN apt-get install -y python-dev
RUN pip install grpcio requests
ADD ./client /client
RUN chmod a+x /client/client.py
RUN mkdir /var/log/envoy/
CMD /usr/local/bin/envoy -c /etc/s2s-python-envoy.json
31 changes: 31 additions & 0 deletions examples/grpc-bridge/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# envoy-grpc

This is an example usage of the Envoy [gRPC bridge filter](https://lyft.github.io/envoy/docs/configuration/http_filters/grpc_http1_bridge_filter.html#config-http-filters-grpc-bridge). Included is a gRPC in memory Key/Value store with a Python HTTP client. The Python client makes HTTP/1 requests through the Envoy sidecar process which are upgraded into HTTP/2 gRPC requests. Response trailers are then buffered and sent back to the client as a HTTP/1 header payload.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we potentially put this in the real docs alongside the other example? That would be cool.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I talked to @twoism, and I will add this in a new PR.


Copy link
Member

@junr03 junr03 Sep 19, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To kill two birds with one stone we could also mention how we are doing authority based routing, which differs from how routing is done in the front-proxy example.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I talked to @twoism, and I will add this in a new PR.

## Building the Go service

```bash
script/bootstrap
script/build
```

## Docker compose

To run the docker compose file, and set up both the Python and the gRPC containers
run:

```bash
docker-compose up --build
```

## Sending requests to the Key/Value store

```bash
# set a key
docker-compose exec python /client/client.py set foo bar
=> setf foo to bar

# get a key
docker-compose exec python /client/client.py get foo
=> bar
```
Empty file.
78 changes: 78 additions & 0 deletions examples/grpc-bridge/client/client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#!/usr/bin/python

import requests, sys
import kv_pb2 as kv
from struct import pack

HOST = "http://localhost:9001"
HEADERS = {'content-type': 'application/grpc','Host':'grpc'}
USAGE = """

envoy-python-client usage:
./client.py set <key> <value> - sets the <key> and <value>
./client.py get <key> - gets the value for <key>
"""

class KVClient():

def get(self, key):
r = kv.GetRequest(key=key)

# Build the gRPC frame
data = r.SerializeToString()
data = pack('!cI', b'\0', len(data)) + data

resp = requests.post(HOST + "/kv.KV/Get", data=data, headers=HEADERS)

return kv.GetResponse().FromString(resp.content[5:])


def set(self, key, value):
r = kv.SetRequest(key=key, value=value)
data = r.SerializeToString()
data = pack('!cI', b'\0', len(data)) + data

return requests.post(HOST + "/kv.KV/Set", data=data, headers=HEADERS)

def run():
if len(sys.argv) == 1:
print(USAGE)

sys.exit(0)

cmd = sys.argv[1]

client = KVClient()

if cmd == "get":
# ensure a key was provided
if len(sys.argv) != 3:
print(USAGE)
sys.exit(1)

# get the key to fetch
key = sys.argv[2]

# send the request to the server
response = client.get(key)

print(response.value)
sys.exit(0)

elif cmd == "set":
# ensure a key and value were provided
if len(sys.argv) < 4:
print(USAGE)
sys.exit(1)

# get the key and the full text of value
key = sys.argv[2]
value = " ".join(sys.argv[3:])

# send the request to the server
response = client.set(key, value)

print("setf %s to %s" % (key, value))

if __name__ == '__main__':
run()
Loading