delix 0.2.4

Decentral HTTP proxy / load balancer
# Delix

[![build status](https://secure.travis-ci.org/simia-tech/rust-delix.png)](http://travis-ci.org/simia-tech/rust-delix)

The idea behind delix is the create an overlay network that connects microservices. It uses semantic addressing
and takes care of encryption, fail-over and load balancing.

## Installation

    cargo install delix

## Example

Run three delix nodes in three different terminals.

    delix -c example/one.conf.toml
    delix -c example/two.conf.toml
    delix -c example/three.conf.toml

The node `one` opens an interface at `127.0.0.1:4200` which take http requests. All nodes have the service `slashdot`
configured. In order to request a response from the service run...

    curl -H 'Host: slashdot.org' -H 'X-Delix-Service: slashdot' http://127.0.0.1:4200

Let's dive into the config file of node one.

```toml
[log]
type = "console"
level = "debug"

[metric]
type = "terminal"
refresh_interval_ms = 100

[cipher]
type = "symmetric"
key = "000102030405060708090a0b0c0d0e0f"

[discovery]
type = "constant"
addresses = [ ]

[transport]
type = "direct"
local_address = "localhost:4001"
request_timeout_ms = 5000
balancer = { type = "dynamic_round_robin" }

[[relay]]
type = "http"
address = "localhost:4200"
header_field = "X-Delix-Service"

[[relay.service]]
name = "slashdot"
address = "slashdot.org:80"
```

The `discovery` section contains the field `addresses` which holds a list of IPs (with ports) that is used during
the node's boot up to search for other nodes. Since node `one` is the first, the list is empty here.

In the `cipher` section is the `key` defined for the encryption and authentication of the traffic between nodes.
The key can be 16, 24 or 32 bytes (hex encoded) long and will issue a AES-{128, 192 or 256}-GCM encryption. All nodes
in the network must share the same key.

In order to bind a node to an interface, `local_address` in the `transport` section must be set. If the interface
differs from the interface visible to other nodes, the field `public_address` can be set.

The `relay` section at the end, defines here a `http` relay that opens a port at `address` that takes HTTP
requests. The `header_field` in the request tells delix to which service the request should be routed to. The services
are defined in the `relay.service` section and define a name and an address which defines the endpoint where the
request is send. In this example it's the slashdot server.

## License

The code is licensed under [Apache 2.0](http://www.apache.org/licenses).