krakend

module
v0.0.0-...-7f749bc Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 10, 2017 License: Apache-2.0

README

Krakend logo

KrakenD

Travis-CI Go Report Card Coverage Status GoDoc

Ultra performant API Gateway with middlewares

Motivation

Consumers of REST API content (specially in microservices) often query backend services that weren't coded for the UI implementation. This is of course a good practice, but the UI consumers need to do implementations that suffer a lot of complexity and burden with the sizes of their microservices responses.

KrakenD is an API Gateway builder and proxy generator that sits between the client and all the source servers, adding a new layer that removes all the complexity to the clients, providing them only the information that the UI needs. KrakenD acts as an aggregator of many sources into single endpoints and allows you to group, wrap, transform and shrink responses. Additionally it supports a myriad of middelwares and plugins that allow you to extend the functionality, such as adding Oauth authorization or security layers.

KrakenD not only supports HTTP(S), but because it is a set of generic libraries you can build all type of API Gateways and proxies, including for instance, a RPC gateway.

Practical Example

Fred Calamari is a mobile developer that needs to construct a single front page that requires data from several calls to their backend services, e.g:

1) api.store.server/products
2) api.store.server/marketing-promos
3) api.users.server/users/{id_user}
4) api.users.server/shopping-cart/{id_user}

The screen is very simple and only needs to retrieve data from 4 different sources, wait for the round trip and then pick only a few fields of the response. Instead of thing these calls, the mobile could call a single endpoint to KrakenD:

1) krakend.server/frontpage/{id_user}

And this is how it would look like:

Gateway

The difference in size in this example would be because KrakenD server would have removed unneeded attributes from the responses.

What's in this repository?

The source code on which the KrakenD service core is built on. It is designed to work with your own middleware and extend the functionality by using small, independent, reusable components following the Unix philosophy.

This repository is only for those who want to build from source a Krakend service or for those who will reuse any of the components in another application.

If you just want to use the server, please download the binary for your architecture.

Library Usage

Krakend is presented as a go library that you can include in your own go application to build a powerful proxy or API gateway. In order to get you started several examples of implementations are included in the examples folder.

Of course you will need go installed in your system to compile the code. There is a Makefile in every example that will download library dependencies and compile a binary for you to test. Just run:

$ cd examples/gin
$ make

Or, if you want to build all the examples, from the root of the project

$ make

For the lazy, a ready to use example:

    package main

    import (
        "flag"
        "log"
        "os"

        "github.com/devopsfaith/krakend/config/viper"
        "github.com/devopsfaith/krakend/logging"
        "github.com/devopsfaith/krakend/proxy"
        "github.com/devopsfaith/krakend/router/gin"
    )

    func main() {
        port := flag.Int("p", 0, "Port of the service")
        logLevel := flag.String("l", "ERROR", "Logging level")
        debug := flag.Bool("d", false, "Enable the debug")
        configFile := flag.String("c", "/etc/krakend/configuration.json", "Path to the configuration filename")
        flag.Parse()

        parser := viper.New()
        serviceConfig, err := parser.Parse(*configFile)
        if err != nil {
            log.Fatal("ERROR:", err.Error())
        }
        serviceConfig.Debug = serviceConfig.Debug || *debug
        if *port != 0 {
            serviceConfig.Port = *port
        }

        logger := logging.NewLogger(*logLevel, os.Stdout, "[KRAKEND]")

        routerFactory := gin.DefaultFactory(proxy.DefaultFactory(logger), logger)

        routerFactory.New().Run(serviceConfig)
    }

Visit the framework overview for more details about the components of the KrakenD.

Examples
  1. gin router
  2. mux router
  3. gorilla router
  4. negroni middlewares
  5. dns srv service discovery
  6. jwt middlewares
  7. httpcache based proxies
  8. etcd service discovery

Configuration file

KrakenD config file

Benchmarks

Check out the benchmark results of several KrakenD components

Contributing

We are always happy to receive contributions. If you have questions, suggestions, bugs please open an issue. If you want to submit the code, create the issue and send us a pull request for review.

Enjoy the KrakenD!

Directories

Path Synopsis
Package config defines the config structs and some config parser interfaces and implementations
Package config defines the config structs and some config parser interfaces and implementations
viper
Package viper defines a config parser implementation based on the viper pkg
Package viper defines a config parser implementation based on the viper pkg
Package encoding provides Decoding implementations.
Package encoding provides Decoding implementations.
examples
dns
gin
jwt
mux
Package logging provides a simple logger interface
Package logging provides a simple logger interface
Package proxy provides proxy and proxy middleware interfaces and implementations.
Package proxy provides proxy and proxy middleware interfaces and implementations.
Package router defines some interfaces for router adapters
Package router defines some interfaces for router adapters
gin
Package gin provides some basic implementations for building routers based on gin-gonic/gin
Package gin provides some basic implementations for building routers based on gin-gonic/gin
mux
Package mux provides some basic implementations for building routers based on net/http mux
Package mux provides some basic implementations for building routers based on net/http mux
sd
Package sd defines some interfaces and implementations for service discovery
Package sd defines some interfaces and implementations for service discovery
dnssrv
Package dnssrv defines some implementations for a dns based service discovery
Package dnssrv defines some implementations for a dns based service discovery

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL