HTTP Sink
Introduction
The HTTP Sink is a Vanus Connector which aims to handle incoming CloudEvents in a way that extracts the data
part of the original event and deliver to the target URL.
For example, if the incoming CloudEvent looks like:
{
"id" : "42d5b039-daef-4071-8584-e61df8fc1354",
"source" : "quickstart",
"specversion" : "1.0",
"type" : "quickstart",
"datacontenttype" : "application/json",
"time" : "2023-01-26T10:38:29.345Z",
"data" : {
"headers":{
"connect-name": "sink-http"
},
"query": "debug=true&type=curl",
"body" : "simulation event data 1"
}
}
The HTTP Sink will send an HTTP in the following way:
POST /test?debug=true&type=curl
> Host: localhost:8081
> User-Agent: Go-http-client/1.1
> Content-Length: 23
> connect-name: sink-http
> simulation event data 1
Quickstart
Prerequisites
- Have a container runtime (i.e., docker).
- Have an HTTP server, you can go webhook to get a free URL
Create the config file
cat << EOF > config.yml
target: <you server endpoint>
EOF
Name | Required | Default | Description |
---|---|---|---|
port | NO | 8080 | the port which HTTP Sink listens on |
target | YES | the target which HTTP Sink send http request, example: http://xxxxxx:8081/xxxxxx | |
method | NO | POST | the default http request method |
headers | NO | the default http request headers | |
auth.username | NO | if your http server authentication by basic auth, username is needed | |
auth.password | NO | if your http server authentication by basic auth, password is needed |
The HTTP Sink tries to find the config file at /vanus-connect/config/config.yml
by default. You can specify the
position of config file by setting the environment variable CONNECTOR_CONFIG
for your connector.
Start with Docker
docker run -it --rm \
-p 31080:8080 \
-v ${PWD}:/vanus-connect/config \
--name sink-http public.ecr.aws/vanus/connector/sink-http
Test
Open a terminal and use the following command to send a CloudEvent to the Sink.
curl --location --request POST 'localhost:8080' \
--header 'Content-Type: application/cloudevents+json' \
--data-raw '{
"id" : "42d5b039-daef-4071-8584-e61df8fc1354",
"source" : "quickstart",
"specversion" : "1.0",
"type" : "quickstart",
"datacontenttype" : "application/json",
"time" : "2023-01-26T10:38:29.345Z",
"data" : {
"headers":{
"connect-name": "sink-http"
},
"query": "debug=true&type=curl",
"body" : "simulation event data 1"
}
}'
Then your HTTP server will receive the request.
Clean resource
docker stop sink-http
Sink details
Data format
The HTTP Sink requires the following data format in CloudEvent's data
field.
{
"method": "POST",
"path": "xxxxxx/xxxxxx",
"headers": {
"connect-name": "sink-http"
},
"query": "debug=true&type=curl",
"body": "simulation event data 1"
}
Run in Kubernetes
kubectl apply -f sink-http.yaml
apiVersion: v1
kind: Service
metadata:
name: sink-http
namespace: vanus
spec:
selector:
app: sink-http
type: ClusterIP
ports:
- port: 8080
name: sink-http
---
apiVersion: v1
kind: ConfigMap
metadata:
name: sink-http
namespace: vanus
data:
config.yml: |-
port: 8080
target: http://vanus-gateway.vanus:8080/gateway/quick_start
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sink-http
namespace: vanus
labels:
app: sink-http
spec:
selector:
matchLabels:
app: sink-http
replicas: 1
template:
metadata:
labels:
app: sink-http
spec:
containers:
- name: sink-http
image: public.ecr.aws/vanus/connector/sink-http:latest
imagePullPolicy: Always
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "100m"
ports:
- name: http
containerPort: 8080
volumeMounts:
- name: config
mountPath: /vanus-connect/config
volumes:
- name: config
configMap:
name: sink-http
Integrate with Vanus
This section shows how a sink connector can receive CloudEvents from a running Vanus cluster.
- Run the sink-http.yaml
kubectl apply -f sink-http.yaml
- Create an eventbus
vsctl eventbus create --name quick-start
- Create a subscription (the sink should be specified as the sink service address or the host name with its port)
vsctl subscription create \
--name quick-start \
--eventbus quick-start \
--sink 'http://sink-http:8080'